<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Fly me to the 🌙</title>
        <link>https://velog.io/</link>
        <description>분명히 처음엔 데린이었는데,, 이제 개린이인가..</description>
        <lastBuildDate>Mon, 23 Mar 2026 07:40:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Fly me to the 🌙</title>
            <url>https://velog.velcdn.com/images/jee-9/profile/ab4185ad-3612-4ce4-bf9e-c35e0b4a0077/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Fly me to the 🌙. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jee-9" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Suricata + Wazuh를 같이 사용해보자! (feat. 보안 에이전트 Wazuh를 사용해보자!)]]></title>
            <link>https://velog.io/@jee-9/Suricata-Wazuh%EB%A5%BC-%EA%B0%99%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-feat.-%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@jee-9/Suricata-Wazuh%EB%A5%BC-%EA%B0%99%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-feat.-%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Mon, 23 Mar 2026 07:40:09 GMT</pubDate>
            <description><![CDATA[<p>1편
<a href="https://velog.io/@jee-9/%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh-%EC%82%AC%EC%9A%A9%EA%B8%B0-1">Wazuh 설치</a></p>
<p>2편
<a href="https://velog.io/@jee-9/%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-2-feat.-%EC%88%98%EC%A7%91">Wazuh 에이전트 등록</a></p>
<p>1편과 2편에서 Wazuh 자체에 대해서 알아봤다.
나도 원래는 Wazuh 하나만 사용할 생각이었는데, 네트워크 모니터링을 추가해야 할 일이 생겨서 <strong>suricata</strong>를 사용하게 되었다.</p>
<h2 id="suricata란">Suricata란?</h2>
<p><a href="https://github.com/OISF/suricata">Suricata</a>
<a href="https://github.com/jasonish/docker-suricata">Suricata-docker</a></p>
<p>Github에 나와있는 설명에 따르면 다음과 같다</p>
<blockquote>
<p>Suricata는 OISF와 Suricata 커뮤니티에서 개발한 네트워크 침입 탐지 시스템, 침입 방지 시스템 및 네트워크 보안 모니터링 엔진입니다.</p>
</blockquote>
<p>말그대로 네트워크 모니터링이다.
기본적으로 네트워크 패킷에 대한 분석이 가능하며, 이를 <code>eve.json</code> 에 넣어주는데, 알람이나 대시보드 기능은 없다.
따라서 ELK Stack으로 직접 구현하거나, 나처럼 Wazuh를 함께 도입하여 확인해야 하는 것</p>
<p>나는 기존에 테스트하고 있던 Wazuh에 고대로 올려서 확인했다.</p>
<h2 id="wazuh--suricata-도입-시-해야할-일">Wazuh + Suricata 도입 시 해야할 일</h2>
<p>일단 Wazuh Container 3개 (Wazuh-dashboard , Wazuh-indexer , Wazuh-manager)가 있는 상황에서부터 시작한다.</p>
<p>해야할 일은 크게 3가지이다.</p>
<ol>
<li>Suricata 설치 및 기본 룰 세팅</li>
<li>Wazuh에서 eve.json을 읽을 수 있도록 설정</li>
<li>제대로 수집되고 있는지 확인할 것</li>
</ol>
<p>순서대로 진행해보겠다.</p>
<h3 id="1-suricata-설치-및-기본-룰-세팅">1. Suricata 설치 및 기본 룰 세팅</h3>
<p>Suricata git clone을 하면 되는데, 그럼 소스로 받아야한다.
Wazuh는 소스 내에 Dockerfile이 있어서 수월하게 했는데, 얘는 없음 ㅜ
그래서 찾아보니 Suricata-docker 레포를 만들어주신 게 있어서 갖다가 썼다!</p>
<blockquote>
<p><a href="https://github.com/jasonish/docker-suricata">Suricata-docker</a></p>
</blockquote>
<p>이렇게 하면 커스터마이징이 어렵다는 단점이 있는데, 어차피 우리는 가볍게 룰셋 정도만 변경해서 사용할 것이기 때문에, 별 문제는 없다고 판단해서 편하게 가져다가 썼다~</p>
<p>README를 읽으면 실행 방법까지 자세하게 설명해 준다.</p>
<pre><code>ip -br addr</code></pre><p>명령어를 사용하면 내 인터페이스를 찾을 수 있다. 인터페이스를 추가해서 돌리면 됨!</p>
<pre><code>docker run -it -d --net=host \
    --cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice \
    jasonish/suricata:latest -i &lt;interface&gt;</code></pre><blockquote>
<p>💡 <strong>여기서 잠깐!</strong>
난 여기서 하나 더 해야된다. 바로 룰셋 지정.. 어떤 룰이 들어와서 detect 되었을 때 중요 이슈로 판단할 것인가에 대한 룰셋을 지정해줘야 한다.</p>
</blockquote>
<p>먼저, 도커 이미지에 올라갈 룰셋을 지정해준다.
그러려면 당연히 설정 파일이 있어야하고, 설정 파일은 다음과 같이 이미지에서 뽑을(?) 수 있다.</p>
<pre><code>sudo docker run --rm \
  -v &quot;$(pwd)/suricata/settings:/etc/suricata&quot; \
  -v &quot;$(pwd)/suricata/var/lib/suricata:/var/lib/suricata&quot; \
  jasonish/suricata:latest sh -c &quot;suricata-update update-sources &amp;&amp; suricata-update enable-source et/open &amp;&amp; suricata-update&quot;</code></pre><p>일단 한번 실행해준다. 로컬 볼륨이랑, 컨테이너 안에 있는 볼륨을 맞춰주고, </p>
<p><code>suricata-update</code>     명령어를 통해서 기본 룰셋 (여기서는 ET라고 부르더라) 을 가져와준다.
지피티 괴롭혀서 알아봤는데 기본적으로 보안 업계에서 &quot;크리티컬하다&quot;라고 말하는 룰셋은 들어가 있다고 한다.
난 보안을 잘 모르니까 주는대로 써야한다. 기본적인 보안이라도 지키려면....
그렇게해서 리스타트 하고 나면, 로컬 볼륨에 기본 룰셋들이 들어와 있는 걸 볼 수 있다.</p>
<blockquote>
<p><strong>여기서 내가 겪은 문제 !</strong>
그냥 짜잔 하고 되면 너무 좋은데, Suricata가 기본적으로 수접하는 것들이 너무 많고, 너무 길어서 Wazuh가 max length를 넘어서 읽어버리게 된다.
그럼 이러한 에러가 나온다 ,, ㅠㅠ
<code>2026/03/23 02:20:38 wazuh-analysisd: ERROR: Too many fields for JSON decoder.</code>
그러니까 우리는 max length를 조절하거나, Suricata의 로그 레벨을 조정해 주어야 한다. (정확히는 레벨은 아니고 종류?)</p>
</blockquote>
<p>Suricata가 수집하는 것들 </p>
<ul>
<li>alert</li>
<li>flow</li>
<li>dns</li>
<li>http</li>
<li>tls</li>
<li>stats</li>
</ul>
<p><code>alert</code> <code>flow</code> <code>ssh</code> 를 제외하면, 나머지는 크게 의미가 없다고 한다.
딥하게 수집/분석하고 싶으면 다 써도 되겠지만, 나는 어떤 트래픽이 크리티컬한지, 공격 시도가 있었는지 정도 보고 싶은 거라 위의 세개만 켜주었다.</p>
<p>이걸 수정하기 위해서는 로컬 마운트된 곳에서 <code>suricata.yaml</code> 파일을 찾아 주는데, 찾고 나면 뭐가 엄청 길어서 찾고 설정하기가 쉽지 않다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/43dfa672-b604-44c0-8883-b2cb16ecc925/image.png" alt=""></p>
<p>이 부분은 AI한테 적당히 물어봐서 자동으로 수정해 주는 걸 쓰도록 하자.</p>
<p>그리고 나서 다시 한번 container를 실행시키면, 룰이 잘 지정되어 있고, 우리가 지정된 룰을 확인할 수 있다.</p>
<pre><code>sudo docker run -d \
  --name suricata \
  --net=host \
  --cap-add=NET_ADMIN \
  --cap-add=NET_RAW \
  --cap-add=SYS_NICE \
  -v &quot;$(pwd)/suricata-logs:/var/log/suricata&quot; \
  -v &quot;$(pwd)/suricata/settings:/etc/suricata&quot; \
  -v &quot;$(pwd)/suricata/var/lib/suricata:/var/lib/suricata&quot; \
  jasonish/suricata:latest \
  -i enp6s0</code></pre><p>내가 올린 룰이 <code>ls -la ~/suricata/var/lib/suricata/rules/suricata.rules</code> 이렇게 해서 보면, 디렉토리에 잘 들어와 있을 것이다.</p>
<p>그럼 Suricata 기본 설정은 끝이다.</p>
<br>

<h3 id="2-wazuh에서-suricata를-읽을-수-있도록-설정">2. Wazuh에서 Suricata를 읽을 수 있도록 설정</h3>
<p>여기서는 어렵지 않다.</p>
<p>Wazuh-docker 루트로 가면, single-node가 있다. 우린 그걸로 올렸으니 거기 docker-compose.yml 파일을 수정해주면 된다.</p>
<p>가서 보면 볼륨이 이렇게 잡혀 있을 건데,</p>
<pre><code>volumes:
  - ./config/wazuh-agent-conf:/wazuh-config-mount/etc/ossec.conf</code></pre><p>이걸 아래처럼 하나 추가해주면 된다.</p>
<pre><code>volumes:
  - ./config/wazuh-agent-conf:/var/ossec/etc/ossec.conf
  - ~/suricata-logs:/var/log/suricata</code></pre><p>그냥 suricata의 로그들을 여기로 끌고오겠다는거니까 문제 놉</p>
<p>그리고 호스트 파일을 수정해서 몇줄 추가해준다.</p>
<pre><code>vi ~/wazuh-docker/wazuh-agent/config/wazuh-agent-conf</code></pre><pre><code>&lt;ossec_config&gt;
  ...

  &lt;localfile&gt;
    &lt;log_format&gt;json&lt;/log_format&gt;
    &lt;location&gt;/var/log/suricata/eve.json&lt;/location&gt;
  &lt;/localfile&gt;

&lt;/ossec_config&gt;</code></pre><p>ossec_config 제일 하단에 샥</p>
<p>그러고 나서 리스타트</p>
<pre><code>cd ~/wazuh-docker/wazuh-agent
docker compose down
docker compose up -d</code></pre><p>확인하고자 한다면, </p>
<pre><code>docker exec -it wazuh.agent ls -l /var/log/suricata
tail -f ~/suricata-logs/eve.json</code></pre><p>이런식으로 그냥 로그 들어오는지 찍어서 확인해보자.</p>
<p>문제가 없다면 eve.json 연동은 마무리~!</p>
<br>

<h3 id="3-확인하기">3. 확인하기</h3>
<p>Wazuh dashboard로 가서 이벤트를 확인하면</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/07f14d58-70e6-4ea6-bc10-fd854f0d4658/image.png" alt=""></p>
<p>이렇게 rule.groups에 suricata로 들어와 있다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/1f7c06f3-4b2c-4e93-9934-b4c77a5e9acd/image.png" alt=""></p>
<p>이렇게 하면 어느정도 돌아가는 걸 확인할 수 있다는 사실!</p>
<p>다음번에는 슬랙으로 알람 추가하는 걸 해봅시다~!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[보안 에이전트 Wazuh를 사용해보자! - 2 (feat. 수집)]]></title>
            <link>https://velog.io/@jee-9/%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-2-feat.-%EC%88%98%EC%A7%91</link>
            <guid>https://velog.io/@jee-9/%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-2-feat.-%EC%88%98%EC%A7%91</guid>
            <pubDate>Mon, 23 Mar 2026 05:37:51 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@jee-9/%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh-%EC%82%AC%EC%9A%A9%EA%B8%B0-1">보안 에이전트 Wazuh를 사용해보자 1탄</a></p>
<p>이전에 성공적으로 Wazuh 서비스 설치를 했다면, 이번에는 데이터를 수집할 서버에 수집기를 설치해야한다.</p>
<p>수집하고 싶은 서버에 설치를 하는 건 상당히 간단하다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/997a59f6-e4bd-4732-bd44-5536ed0232ce/image.png" alt=""></p>
<p>일단 Agents Summary로 들어간다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/b26ca2ff-d6b9-4ff3-b33e-518e0d11e29c/image.png" alt=""></p>
<p>Deploy new agent로 들어가면 어떻게 설치할 수 있는지, OS 선택 및 Options를 선택할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/625aa750-b4f3-44ca-8ad0-78ffb63e2a24/image.png" alt=""></p>
<p>설치하고 싶은 OS를 고르고, 설치한 서버 주소를 입력해주면 된다.
Agent Name은 보여질 이름이기에 편한 이름으로 입력하고 나면 </p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/01b4ffb5-4c80-4269-ae43-1efb6cac3b2a/image.png" alt=""></p>
<p>이런식으로 설치하라고 한다.</p>
<p>정상적으로 설치하고 나면, 수집은 금방 되기 때문에.. 별 문제가 없다! </p>
<p>이렇게 해서 Wazuh 설치 및 사용법을 알았으면, 이제 좀 더 어려운 걸로 가보자!</p>
<p>다음에는, Suricata 와 연동해서 Wazuh에 이슈를 구현하는 방법을 알아볼 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[여러대의 서버에 동시배포를 해보자! (feat. Ansible)]]></title>
            <link>https://velog.io/@jee-9/%EC%97%AC%EB%9F%AC%EB%8C%80%EC%9D%98-%EC%84%9C%EB%B2%84%EC%97%90-%EB%8F%99%EC%8B%9C%EB%B0%B0%ED%8F%AC%EB%A5%BC-%ED%95%B4%EB%B3%B4%EC%9E%90-feat.-Ansible</link>
            <guid>https://velog.io/@jee-9/%EC%97%AC%EB%9F%AC%EB%8C%80%EC%9D%98-%EC%84%9C%EB%B2%84%EC%97%90-%EB%8F%99%EC%8B%9C%EB%B0%B0%ED%8F%AC%EB%A5%BC-%ED%95%B4%EB%B3%B4%EC%9E%90-feat.-Ansible</guid>
            <pubDate>Sun, 15 Mar 2026 12:16:49 GMT</pubDate>
            <description><![CDATA[<p>회사에서 온프레미스 배포를 하게 되었다.
내부 테스트용으로 n개의 같은 서버를 만들고 각각의 서버에 소프트웨어 배포/기본 설정/포트 설정 등 몇가지 작업이 필요했다.
boto3로 하면 금방 하겠지만 이 기회에 Ansible을 써보고 싶었다.</p>
<p>우리는 거의 모놀리식에 가까운 구조라서 여러 대의 서버를 동시에 컨트롤 할 일은 없지만 (시뮬레이터 제외)
이렇게 여러 대의 테스트 인스턴스를 한번에 띄워보기란 스타트업에서 경험하기 힘들다고 생각한다.</p>
<p>일단 Terraform만 사용해도 괜찮았을거라는 사수분의 이야기가 있었으나, 난 진짜 해보고 싶은 거라 Ansible을 같이 썼다</p>
<p>Terraform은 진짜 서버만 올리는 용도라서 Ansible만 일단 적어보도록 하자</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/10bef6de-dc36-4e20-800d-0f7151e99a22/image.png" alt=""></p>
<p>대충 구조는 이러하다</p>
<p><code>ansible.cfg</code> 이거는 ansible에서 필요한 기본 설정 파일이다
<code>hosts.ini</code> 이거는 컨트롤해야하는 여러 대의 서버에 대한 정보를 담았다.
Terraform에서 추출된 여러 대의 서버의 ip와 정보를 여기에 적어주는 스크립트가 필요하다.
<code>group.yml</code> 여러 변수들을 담았다. {{ }} &lt; 이 문법을 사용해서 변수 가져온다
<code>playbooks</code> 우리가 잘 알고있는 플레이북이다.</p>
<ul>
<li>일단 AI 쓰면 내꺼가 안될거같아서 처음에 setup 만 혼자 작성하고 나머지는 AI 뚝딱했다
claude code 미친놈이다</li>
</ul>
<hr>
<p>구조만 이해하고 나면 만드는 건 어렵지 않다.</p>
<p>cloudwatch agent를 설치하는 플레이북을 예시로 보자</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/84749bba-7522-4b7b-996f-bf600738c062/image.png" alt=""></p>
<p>일단, 인덴트를 이용해서 다음과 같이 스텝별로 작업을 작성해준다.
요즘 이건 AI 안쓰면 안될 것 같다. 노가다를 줄여서 생산성을 n배 향상시켜주니까</p>
<p>그래도 스텝별로 어떤 작업이 들어가는지 한번 체크하고 영향도도 생각하자</p>
<p>어느 정도 스텝이 작성되었으면 </p>
<pre><code>ansible-playbook playbooks/setup.yml \
  -i inventory/hosts.ini \
  --check</code></pre><p>이렇게 해서 한번 체크해준다.</p>
<p>그리고 나서 냅다 돌리면 끝</p>
<pre><code>ansible-playbook playbooks/setup.yml \
  -i inventory/hosts.ini</code></pre><p>근데 이러면 드는 의문이 있다. 
EC2에 작업했는데 왜 pem키 없지?</p>
<p>우리는 SSM을 사용하기 때문이다. 서버에 SSM만 올라가 있다면 </p>
<pre><code># session-manager-plugin 설치
brew install --cask session-manager-plugin

# 설치 확인
session-manager-plugin --version</code></pre><p>일단 로컬에서 컨트롤하니까 로컬에다가 ssm plugin 설치를 한다.
그 다음에 aws configure를 해주고, hosts.ini에다가 ssm으로 접근할때처럼 명령어 얍</p>
<pre><code>ansible_ssh_common_args=&#39;-o StrictHostKeyChecking=no -o ProxyCommand=&quot;aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p --region us-east-1&quot;&#39;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[보안 에이전트 Wazuh를 사용해보자! - 1 (feat. 설치)]]></title>
            <link>https://velog.io/@jee-9/%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh-%EC%82%AC%EC%9A%A9%EA%B8%B0-1</link>
            <guid>https://velog.io/@jee-9/%EB%B3%B4%EC%95%88-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-Wazuh-%EC%82%AC%EC%9A%A9%EA%B8%B0-1</guid>
            <pubDate>Fri, 13 Feb 2026 03:30:49 GMT</pubDate>
            <description><![CDATA[<p>여러 대의 테스트 서버 (워크스테이션) 을 하나의 서버에서 중앙관리할 수 있도록 하고 싶었다.
에이전트를 개발하는 방법이 제일 빨랐겠지만 (요즘 AI가 미친놈들이니까) 
중요한건 내가 어떤 보안 &quot;데이터&quot;가 크리티컬하게 필요한지, 필요없는지를 잘 모른다는 것이었음.
따라서 자료가 많은 오픈소스를 사용하면 트러블슈팅도 쉽고, 필요한 데이터만 잘 받아볼 수 있을 것 같아서 고민하다가 유명하다는 Wazuh를 이용해보게 됐음.</p>
<p>일단 클라우드가 아니어야 하고, (데이터 보안 문제)
<del>그 나라 것이 아니어야 하고,, (많은 보안 문제)</del></p>
<p>아무튼 여러모로 알아보다가 미국꺼라는 Wazuh를 이용해보게 되었음. 
SIEM이 가능한 무료 오픈소스가 많이 없는듯했다.</p>
<hr>
<h2 id="1-docker">1. Docker</h2>
<p>일단 환경의 편리성을 위해서 Docker로 다운받기로 했다. 
Wazuh는 docker와 일반 소스코드 레포가 아주 잘 나뉘어져 있다.</p>
<p>참고로, 나는 main 브랜치를 별 생각 없이 깔았다가 피를 보고 다시 version을 맞추어 체크아웃했다.</p>
<p>다들 이런 이슈가 있지 않기를 바란다...</p>
<h3 id="1-wazuh">1. wazuh</h3>
<blockquote>
<p>document: <a href="https://documentation.wazuh.com/current/getting-started/index.html">https://documentation.wazuh.com/current/getting-started/index.html</a></p>
</blockquote>
<p>이거는 그냥 일반 소스코드이다.
수정/커스텀이 필요하다면 이거 가져다 쓰면 된다. </p>
<p>난 귀찮아서 미리 나온 docker 이미지를 그냥 냅다 썼다.</p>
<h3 id="2-wazuh-docker">2. wazuh-docker</h3>
<blockquote>
<p>document: <a href="https://documentation.wazuh.com/current/deployment-options/docker/wazuh-container.html#prerequisites">https://documentation.wazuh.com/current/deployment-options/docker/wazuh-container.html#prerequisites</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jee-9/post/8efb723f-829f-4735-9199-2c94f46a47aa/image.png" alt=""></p>
<p>Releases 중에서 v4.14.3의 commit id를 지정해서 하면 문제없이 설치된다.</p>
<h2 id="2-dashboard-실행">2. Dashboard 실행</h2>
<p>순서는 다음과 같다.</p>
<ol>
<li>wazuh-docker 레포 클론<pre><code>git clone https://github.com/wazuh/wazuh-docker.git</code></pre></li>
</ol>
<p>당연히 이렇게 하면 main 뜬다. 
현재 latest stable 버전은 태그 v4.14.3이므로 태그 기준으로 checkout 해준다.
아니면 -b v4.14.3 을 붙여서 클론해줘도 된다.</p>
<pre><code>git checkout v4.14.3
</code></pre><p>그 다음에 single-node로 이동해준다. 나의 경우 서버 몇대 안돼서 그냥 single-node로 했는데 클러스터 구성이라면 multi-node로 하면 될듯하다.</p>
<br>

<ol start="2">
<li>key generate<pre><code>docker compose -f generate-indexer-certs.yml run --rm generator</code></pre></li>
</ol>
<br>


<ol start="3">
<li>docker compose up<pre><code>docker compose up -d </code></pre></li>
</ol>
<p>AI가 멍청해서 key generate 하는걸 한참 찾았다.</p>
<p>만약 나처럼 main 브랜치로 최신 버전 하려다가 실패했다면 설정해줘야 하는 것이 있다. (ref 참고)</p>
<blockquote>
<p>ref: <a href="https://github.com/wazuh/wazuh-documentation/issues/7619">https://github.com/wazuh/wazuh-documentation/issues/7619</a></p>
</blockquote>
<p>keygen해서 wazuh_indexer_ssl_certs 폴더에 담아주는데 이걸 아무리 날리고 볼륨을 refresh/delete 해도 안됐던 것.</p>
<p>결국 여기서 알려주는 방법대로 수동으로 파일을 삭제해주니 잘 됐다.</p>
<br>

<ul>
<li>그리고 Wazuh 버전이 다양해서 그런가 인터넷에 아주 많은 낚임성 글이 있나보다.. AI가 잘 안알랴줌
document 직접 하나하나 보고 따라하는 거 추천</li>
</ul>
<br>

<p>일단 key를 generate하고 docker compose up -d를 하면 도커 세개가 잘 뜬다.</p>
<p>그리고 localhost (443)으로 하면 Dashboard 로그인하라고 함.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/b5943e1e-2512-4a0d-97d5-37c5505c635b/image.png" alt=""></p>
<p>AI는 Perplexity, Cursor, GPT 전부 다 admin, admin 하라고 하는데, 도큐먼트는</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/ed977a0c-fccb-41bf-948d-12603fdf199f/image.png" alt=""></p>
<p>이렇게 하라고 한다. <del>(나처럼 낭패보지 않길 바란다.)</del></p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/e341152b-1227-4683-bed1-0247af9e8864/image.png" alt=""></p>
<p>그럼 일단 Dashboard 잘 뜬다.</p>
<br>

<p>자, 그럼 이제 수집하고 싶은 서버에 에이전트를 설치해보자.
이건 2탄으로 ~!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Cloudwatch로 EC2 Memory 수집하기]]></title>
            <link>https://velog.io/@jee-9/Cloudwatch%EB%A1%9C-EC2-Memory-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jee-9/Cloudwatch%EB%A1%9C-EC2-Memory-%EC%88%98%EC%A7%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 17 Jun 2025 03:16:03 GMT</pubDate>
            <description><![CDATA[<p>오랜만에 찾아왔다 -</p>
<p>이직해서 하는 일도 (얼추 비슷한가?) 좀 바뀌어가지고, 이제 매일 매일 AWS랑 전쟁중이다.</p>
<p>AWS도 보면 그냥 국내 클라우드 호스팅 업체 별반 다를게 있을까 (..) 싶을 정도로 안정적이지 못한 경우가 종종 있는 것 같다.
혹은 내가 아직 에러 소명을 못했겠지 ....</p>
<p>아무튼 한줄 적어본다.</p>
<br>

<hr>
<p>AWS는 기본 모니터링에 Memory 수집 지표(metrics)가 없다.
따라서 Memory를 수집하고 싶다면 직접 config를 만들어서 추가해줘야 한다.</p>
<p>일단, OS에 따라 다르다.</p>
<p>Amazon Linux를 이용하는 경우, <code>amazon-cloudwatch-agent</code> 가 이미 있을 것이다.
근데, Ubuntu를 사용하는 경우, 아마 없을 것이다.</p>
<p>Ubuntu의 경우 install이 쉽게 되지 않아서 (..) 좀 귀찮다.</p>
<pre><code>wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb

sudo dpkg -i amazon-cloudwatch-agent.deb</code></pre><p>우분투용 패키지를 받아서 디패키징 해준다.</p>
<pre><code>amazon-cloudwatch-agent-ctl -a status</code></pre><p>그럼 이제 amazon-cloudwatch-agent-ctl을 사용할 수 있게 된다.</p>
<pre><code>cd /opt/aws/amazon-cloudwatch-agent/etc/</code></pre><p><code>/opt/aws/amazon-cloudwatch-agent/etc</code> 의 경로로 이동 !</p>
<p>만약 amazon-cloudwatch-agent 경로가 없는 경우 문제가 있는 것이므로 부디 다시 설치를 하기를 바란다. (확실하진 않고 경험상 그랬어요)</p>
<br>

<p>이제 여기다가 <code>config.json</code> 을 만들어 줄 것이다.
경로나, config의 이름은 자유롭게 해도 상관없다. 어차피 커맨드로 잡아줄거라서</p>
<br>


<p>나의 경우 gunicorn의 memory usage를 보고 싶었던 거라서, config를 다음과 같이 잡아줬다.</p>
<pre><code class="language-json">{
  &quot;metrics&quot;: {
    &quot;metrics_collected&quot;: {
      &quot;procstat&quot;: [
        {
          &quot;pattern&quot;: &quot;gunicorn&quot;,
          &quot;alias&quot;: &quot;gunicorn&quot;,
          &quot;measurement&quot;: [
            &quot;cpu_usage&quot;,
            &quot;cpu_time&quot;,
            &quot;cpu_time_system&quot;,
            &quot;memory_rss&quot;,
            &quot;num_fds&quot;,
            &quot;num_threads&quot;,
            &quot;write_count&quot;
          ],
          &quot;metrics_collection_interval&quot;: 60
        }
      ],
      &quot;mem&quot;: {
        &quot;measurement&quot;: [
          &quot;used_percent&quot;, &quot;available&quot;, &quot;total&quot;
        ],
        &quot;metrics_collection_interval&quot;: 60
      }
    }
  }
}</code></pre>
<p>대충 ~~ 지표들을 수집할거고, gunicorn이라는 이름이 들어간 프로세스의 지표를 수집하게 해줘, 라는 의미라고 한다.</p>
<p>이거는 직접 찾는 것보다 chatgpt가 더 잘해줄 것입니다. 한번 찾아보시길 바랍니다!</p>
<br>

<p>이제 이걸 적용해주면 끝이다</p>
<pre><code>/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/config.json \
-s</code></pre><p>아시겠지만 -c의 옵션 위치에 나의 설정 파일을 지정해주면 된다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/03dd8382-aa64-4418-8539-3b30284f5cff/image.png" alt=""></p>
<p>뭐시기 뭐시기하여 validation success가 뜨면 끝이다-</p>
<p>이제 Dashboard나 지표 수집기 쪽에 가서 데이터를 확인해보자.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/d4e7130b-b0cb-4fee-8d55-f4e391cc0d1f/image.png" alt=""></p>
<p>아마도 CWAgent의 어딘가에 있을 것이다.</p>
<p>나의 경우 host 안에 있었다.</p>
<br>

<p>사실 실제로 config 잡고 수집하는 것보다, 여기서 찾는 게 더 시간이 오래 걸린다.</p>
<p>중분류 (?)가 분기가 많이 되어 있으니 CWAgent 쪽에서 꼼꼼히 ip 대조해보면서 찾아보길 바란다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/8e3f083b-b3b4-4625-95e0-fe42998cf426/image.png" alt=""></p>
<p>이렇게 하면 메모리 수집 끝-!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] S3로 파일서버 만들기]]></title>
            <link>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-S3%EB%A1%9C-%ED%8C%8C%EC%9D%BC%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-S3%EB%A1%9C-%ED%8C%8C%EC%9D%BC%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 13 Mar 2025 02:31:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jee-9/post/0b064ca3-8ded-4f7c-b3fe-9adf926a798a/image.png" alt=""></p>
<p>기존에는 서버에서 attachments/ 로 저장하던 파일들을.. ec2 디스크 문제로 몇번 터진 이후
개인적으로 꼭 S3로 옮기고 말겠다는 생각을 했는데,
이번에 마이그레이션 진행하면서 그냥 작업해버렸다. </p>
<p>꼭 내가 이 회사 안있더라도, 다른 사람들이 attachments/ 로 고통받을 걸 잘 알기에...
그냥 바로 작업 시작해버림</p>
<br>

<hr>
<h2 id="ci4에서-접근할-유저-만들어주기">CI4에서 접근할 유저 만들어주기</h2>
<p>IAM 계정을 하나 만들어줘야 한다. ci4가 접근할..
생성은 plain하게 진행하고, 생성된 후에 액세스 키를 만들어줘야 한다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/e6997262-4450-4c37-94b2-e54c95458f04/image.png" alt=""></p>
<p>오른쪽 상단의 액세스 키 만들기를 선택해준다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/46d64847-007c-4630-a59a-6e96b1673685/image.png" alt=""></p>
<p>액세스 키 모범 사례 및 대안에서는 <code>서드 파티 서비스</code>를 선택해준다.
그리고 나온 두개의 액세스 키를 잘 보관한다.</p>
<br>

<h2 id="ci4-환경변수-or-config-or-libarary를-이용해-s3-연동">CI4 환경변수 or Config or Libarary를 이용해 S3 연동</h2>
<pre><code class="language-php">
&lt;?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class S3 extends BaseConfig
{
    public string $bucketName;
    public string $region;
    public string $accessKey;
    public string $secretKey;
    public string $uploadFolder;

    public function __construct()
    {
        $this-&gt;bucketName = getenv(&#39;AWS_S3_BUCKET&#39;)?? &quot;image-ci4&quot;;
        $this-&gt;region = getenv(&#39;AWS_REGION&#39;)?? &quot;ap-northeast-2&quot;;
        $this-&gt;accessKey = getenv(&#39;AWS_ACCESS_KEY&#39;)?? &quot;-----------------&quot;;
        $this-&gt;secretKey = getenv(&#39;AWS_SECRET_KEY&#39;)?? &quot;---------------------&quot;;
        $this-&gt;uploadFolder = getenv(&#39;AWS_UPLOAD_FOLDER&#39;) ?? &#39;images/&#39;;
    }
}
</code></pre>
<p>이런식으로 config에 선언해주던가, 
.env에 </p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/fd4223ab-8abb-4ff1-b873-3bcb4c82f060/image.png" alt=""></p>
<p>환경변수로 선언하던가...
아니면 그냥 S3uploader 파일쪽에 선언해도 상관없다. 아무튼 들어가있으면 됨.</p>
<p>근데 보안적인 측면에서 셋 다 별로고 AWS측에서 제공하는 보안 키 .. 관련된 뭐시기가 있다했느데 그걸 쓰면 더 좋을듯하다.</p>
<br>


<h2 id="s3uploader-library-만들기">S3Uploader Library 만들기</h2>
<pre><code class="language-php">
&lt;?php

namespace App\Libraries;

use Aws\S3\S3Client;
use Config\S3;

class S3Uploader
{
    private $s3;
    private $bucket;
    private $uploadFolder;

    public function __construct()
    {
        $config = new S3();

        $this-&gt;s3 = new S3Client([
            &#39;version&#39;     =&gt; &#39;latest&#39;,
            &#39;region&#39;      =&gt; &#39;ap-northeast-2&#39;,
            &#39;credentials&#39; =&gt; [
                &#39;key&#39;    =&gt; &quot;&quot;,
                &#39;secret&#39; =&gt; &quot;&quot;
            ],
        ]);

        $this-&gt;bucket = $config-&gt;bucketName;
        $this-&gt;uploadFolder = $config-&gt;uploadFolder;
    }

    public function uploadFile($file)
    {
        $sFileName = $file-&gt;getRandomName();

        try {
            $this-&gt;s3-&gt;putObject([
                &#39;Bucket&#39; =&gt; $this-&gt;bucket,
                &#39;Key&#39;    =&gt; $sFileName,
                &#39;Body&#39;   =&gt; fopen($file-&gt;getTempName(), &#39;rb&#39;),
                &#39;ContentType&#39; =&gt; $file-&gt;getMimeType()
            ]);

            return &quot;https://{$this-&gt;bucket}.s3.{$this-&gt;s3-&gt;getRegion()}.amazonaws.com/{$sFileName}&quot;;

        } catch (\Exception $e) {
            return $e-&gt;getMessage();
        }
    }
}</code></pre>
<p>여러모로 중구난방인데 아무튼 , config에서 bucketName 불러오듯 key 값도 불러오면 된다 .. (난 한 1시간정도밖에 없어서.. 후딱 만드느라 막 함 추후 수정해야지)</p>
<p>위의 코드를 보면, return 값으로 url을 주고 있음.
이걸 RDB에 저장하고, RDB에서는 이 값을 이용해 이미지를 호출하게 됨.</p>
<br>

<h2 id="컨트롤러에서-호출-and-rdb에-저장">컨트롤러에서 호출 and RDB에 저장</h2>
<pre><code class="language-php">
$aImages = $this-&gt;request-&gt;getFileMultiple(&#39;document_images&#39;);
        $oS3 = new S3Uploader();

foreach($aImages as $oImage){
            if($oImage-&gt;isValid() &amp;&amp; !$oImage-&gt;hasMoved()){
                $sUrl = $oS3-&gt;uploadFile($oImage);

                if ($sUrl) {
                    $aUpload[] = $sUrl;
                    // DB 적재
                    $aData = [
                        //&quot;title&quot; =&gt; $oImage-&gt;getName(),
                        &quot;box_idx&quot; =&gt; $iBox,
                        &quot;file_path&quot; =&gt; $sUrl
                    ];
                    if($this-&gt;oMypage-&gt;insertBox($aData)){
                        $aSuccess[] = $sUrl; 
                    }else {
                        $aFailure[] = $sUrl;
                    }
                } else {
                    $aFailure[] = $sUrl;
                }
            }
        }</code></pre>
<p>난 로그 쌓을거라 이렇게 Failure 등 따로 append 했다!!!</p>
<br>

<p>연동할 때 고민해줘야 하는 부분이 있는데, 바로 어디까지 public으로 접근 가능하게 할 지에 대한 부분이다.
S3 자체를 public 으로 하는 방법도 있지만 절-대 추천하지 않고,
나는 일부 소스 (일부 경로)에 대해서만 public 권한을 주고 나머지는 private으로 유지하는 방법을 선택했다.</p>
<p>Library 코드에는 나와있지 않지만 경로가 설정되어 있고, 해당 경로로 public 권한을 open해주는 설정을 json으로 선택할 수 있다.</p>
<br>

<h2 id="버킷-권한">버킷 권한</h2>
<p><img src="https://velog.velcdn.com/images/jee-9/post/c1f0080d-174a-478b-b045-3826d5656cf8/image.png" alt=""></p>
<p>버킷 권한의 버킷 정책이다.</p>
<p>여기에서 특정 경로의 public 권한 관련된 내용은 찾아보기를..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] Codeigniter4 로그인 JWT 토큰 구현하기]]></title>
            <link>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-Codeigniter4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-JWT-%ED%86%A0%ED%81%B0-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-Codeigniter4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-JWT-%ED%86%A0%ED%81%B0-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 11 Mar 2025 07:46:21 GMT</pubDate>
            <description><![CDATA[<p>갑자기 일주일만에 뜬금 앱을 개발해야 하게 됐다.
리뉴얼.. 이라 쓰고 프레임워크 이전이라 읽는다.
그전 코드를 거의 참조할 수 없어서 다시 만들고 있는 중이다.</p>
<p>일단 JWT 토큰을 이용해 로그인 체크를 구현해보았다.</p>
<br>

<h2 id="php-jwt-설치">php-jwt 설치</h2>
<p>먼저 Codeigniter의 루트 패스로 가서 </p>
<pre><code>composer require firebase/php-jwt</code></pre><p><img src="https://velog.velcdn.com/images/jee-9/post/a594c9d1-c8b5-4335-9e1e-3f565100394a/image.png" alt=""></p>
<p>를 실행해서 php-jwt를 설치해준다.</p>
<p>이렇게 설치를 하면 vender 하위에 <code>firebase/php-jwt</code>가 생기게 된다.</p>
<p>생긴걸 확인 후 Helper 함수를 만들어준다.</p>
<p>Helper 함수는 Controller 내 어디서든 helper(&#39; &#39;)를 통해 클래스를 참조할 수 있게 도와준다.</p>
<h2 id="env에-jwt-토큰-키-추가">.env에 jwt 토큰 키 추가</h2>
<p><img src="https://velog.velcdn.com/images/jee-9/post/edfcbbc3-20e6-44ae-b17d-b6f1ff391bd8/image.png" alt=""></p>
<p>토큰 키를 어렵게 만들어서 한줄 추가한다.</p>
<p>.env는 굳이 다른걸 건드리지 않아도 자동반영되지만, 나는 캐시 삭제를 해주었다.</p>
<h2 id="helper-파일-생성">Helper 파일 생성</h2>
<p>참고로 helper 파일은 xxx_helper로 만들어야한다.
꼭 언더바 helper가 들어가야 한다는 것...</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/da22170a-1eac-4071-a24c-3c24a8b2bf32/image.png" alt=""></p>
<p>이건 지쌤이 짜준거 고친거당
지쌤 편해,,,,, 이런걸 왜 이제 알았을까나</p>
<br>

<h2 id="controller-수정">Controller 수정</h2>
<p><img src="https://velog.velcdn.com/images/jee-9/post/7af3ee7f-297a-4009-a9a6-0ba25bbfacf6/image.png" alt=""></p>
<p>이제 컨트롤러에서 이렇게 helper로 jwt를 불러서 토큰을 만든담에 세션에 담아준다.</p>
<br>

<h2 id="filter-수정">Filter 수정</h2>
<p><img src="https://velog.velcdn.com/images/jee-9/post/97a3c0b5-3cab-49a8-9324-910b9a5cfb63/image.png" alt=""></p>
<p>app/Filters/auth.php 필터를 만들어서 token이 없으면 팅겨내는 코드를 추가한다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/d0ad7939-2269-47b6-b8d8-827c00b210f5/image.png" alt=""></p>
<p>그리고 필터에 삽입!</p>
<p>참고로 현재는 프론트팀원들이 돌아다니면서 작업중이라 주석처리해놨다 ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] AWS 디스크 올리기 (볼륨 올리기)]]></title>
            <link>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-AWS-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%98%AC%EB%A6%AC%EA%B8%B0-%EB%B3%BC%EB%A5%A8-%EC%98%AC%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-AWS-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%98%AC%EB%A6%AC%EA%B8%B0-%EB%B3%BC%EB%A5%A8-%EC%98%AC%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Fri, 07 Mar 2025 06:27:22 GMT</pubDate>
            <description><![CDATA[<p>디스크를 추가로 할당해서 붙이는 게 아니라, 올리기만 했습니당!</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/7e0ca6fb-7f3d-40f6-8601-883c052d03b8/image.png" alt=""></p>
<p>크기를 올리기만 하면 되는 줄 알았는데...
실제로 서버에서 df -h 찍으니까 안잡히더라구요 ... 또륵</p>
<p>지쌤한테 물어보니, AWS에서 EBS 볼륨 크리를 올려도 OS가 자동으로 확장된 공간을 인식하지 못하는 이유는, 파일 시스템과 파티션이 존재하기 때문이라고 합니다.</p>
<p>EBS는 단순한 물리적인 공간일 뿐이고, 이를 사용하기 위해서는 운영체제에서 파티션을 인식하고 파일시스템을 확장하는 작업이 필요하다고 하네여 ㅠ</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/52220c5a-ec77-4baa-9148-91c836b059c7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/0c0ce0f2-0370-4db6-ad30-b5891cdde458/image.png" alt=""></p>
<p>즉, 물리적인 공간을 올렸지만 OS는 파티션에 의해 원래의 6GB 정도만 자기꺼라고 인식하고 있으니, 물리적인 공간을 크게 키운 다음, 파티션을 키워줘야 OS가 사용할 수 있는 공간이 늘어남.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/f8573b3b-36f8-462d-ad20-3e96b1f83c49/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/ce9f2871-3fa9-44c9-8a81-de6da0f405a8/image.png" alt=""></p>
<p>나의 경우, 파티션이 있고 ext였기에,
<img src="https://velog.velcdn.com/images/jee-9/post/ae125ca9-c386-45de-bb0d-49bcd5c242ed/image.png" alt=""></p>
<p>해당 명령어를 통해 파티션 크기를 늘려주고, 파일시스템의 크기를 늘려주었다.</p>
<br>

<p>그래서 파일시스템이 뭔데? ㅠㅠ</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/4e5fecf3-c4ca-4b12-b5f5-31696324f6e3/image.png" alt=""></p>
<p>파일시스템은 데이터를 관리하는 방식인데,
파티션 크기가 커진다고 해서 관리하는 방식 (두뇌) 가 커진걸 인지하지 못하는 상태이므로,
파일시스템한테 야, 너 커졌음 여기까지 써도 OK라고 알려주는 정도로 이해하면 될 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] 경력직 이직 개발자 질문 리스트 정리]]></title>
            <link>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-%EA%B2%BD%EB%A0%A5%EC%A7%81-%EC%9D%B4%EC%A7%81-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%A7%88%EB%AC%B8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-%EA%B2%BD%EB%A0%A5%EC%A7%81-%EC%9D%B4%EC%A7%81-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%A7%88%EB%AC%B8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 05 Mar 2025 03:27:53 GMT</pubDate>
            <description><![CDATA[<p>저의 경우 지원한 회사는 작은 회사긴 하지만 탄탄한(?) 어느정도 유니콘 기업 정도라고 말할 수 있는 회사에 지원하였습니다.</p>
<p>일은 해봐야 알겠지만 django, celery, python을 사용하는 회사로 이직하고자 하였습니다.
php 개발자로 입사했더니 python으로 돌아오는 길이 멀고도 험했네요</p>
<p>CS질문은 거의 대답을 못했습니다... 한 3년을 계속 실무만 보고 달려오니 많이 까먹었더라고요.. (특히 python은 거의 다...)
그래도 제 개념 속에서 아는 내용을 모두 답했는데, 그걸 좋게 봐주신 듯 합니다.</p>
<p>그런데 공부는 많이 해야겠네요 특히 이론공부 ㅠㅠ</p>
<br>

<hr>
<br>


<ol>
<li>DB 관련 질문</li>
</ol>
<ul>
<li>index searching의 종류를 아는가</li>
<li>샤딩과 파티셔닝</li>
<li>Django와 mysql을 함께 사용한 이유는 무엇인가 (Django의 권장사항은 PostgresQL이라고 합니다)</li>
<li>분산DB CAP의 개념</li>
</ul>
<ol start="2">
<li>알고리즘</li>
</ol>
<ul>
<li>DFS, BFS</li>
<li>길찾기 알고리즘</li>
<li>Deque와 Stack과 Queue</li>
</ul>
<ol start="3">
<li>인프라</li>
</ol>
<ul>
<li>Docker compose와 k8s</li>
</ul>
<ol start="4">
<li>네트워크</li>
</ol>
<ul>
<li>https와 http의 차이 (아 이건 공개키 이야기를 했어야하는데...단어가 ㅠ)</li>
<li>TCP Three handshake</li>
</ul>
<br>


<p>그리고는 기억이 잘 안납니다... 너무 긴장했나봐...</p>
<p>이 외에는 한 40분정도 제 개인 프로젝트에 대해서 이야기 나눈 것 같아요.
사실 많이 아는 건 없는데, 프로젝트할 때 제가 어떤 생각으로 몇가지 안중에 이것을 선택했는가에 대해 많이 이야기했습니다.</p>
<p>레거시를 어떻게 없앨 것인가에 대해서는 직접 해서 보여드리는 편이라고 말씀 드렸구요... (실제로 그렇게 함)</p>
<p>제가 이론 대답을 너무 못하니 쉬운 문제를 물어봐주셨는데도 대답못했습니다... 난 바보야</p>
<p>다만, 대답을 안한 건 아니고 제가 아는 선에서.. 예를 들어 hash 와 b-tree 는.. 아마.. 이랬던 거 같다. (경험을 말하며) 이렇게 대답했고, b-tree 관련해서는 ElasticSearch LIKE 쿼리에서 본 내용들을 토대로, 이런 개념인 것을 이해한다. 라고 말씀드렸어요</p>
<p>마지막 질문이 &quot;그럼 비전공자셔서 공부는 어떻게 하셨어요?&quot; 여서, 쉴틈없이 현업에 있었기 때문에 이론은 잘 모를지 몰라도 배우는거나 경험으로 알게 된 내용들은 대부분 기억한다. 라고 답변드렸던 기억이 납니다....</p>
<p>그리고 반대로 저한테 CAP의 개념 등을 알려주시기도 하셨는데, 새로운 걸 알아서 되게 좋았어요 ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] 카카오 로그인 구현하기 (JS)]]></title>
            <link>https://velog.io/@jee-9/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-JS</link>
            <guid>https://velog.io/@jee-9/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-JS</guid>
            <pubDate>Fri, 28 Feb 2025 09:00:49 GMT</pubDate>
            <description><![CDATA[<p>회사에서 카카오 로그인 구현할 일이 있어서...
카카오 로그인 구현에 대해 가볍게 한줄 남겨본다.</p>
<br>

<ul>
<li>준비되어 있어야 할 것 : 카카오 개발자 아이디와 활용신청 (biz의 경우 검수까지 며칠 걸림)</li>
</ul>
<br>

<p>카카오 입장에서는 생판 모르는 사람에게 누군가의 정보를 줄 수는 없는 노릇이라,
나름 개인정보를 어디에 쓸건지? 너네 진짜 서비스하는 앱이 맞는지? 등을 확인하는 과정이 있다.
이 과정을 모두 거치고 kakao biz 딱지를 얻으면, 개발이 가능하게 된다.</p>
<p>만약 biz 딱지를 얻지 못했다면, 닉네임과 프로필 사진 정도 등의 정보에 대해서만 권한을 획득할 수 있다.
근데 어차피 카카오측에서 엄청 긴 string을 주는데 그게 nice의 개인식별코드..? 같은 느낌이다. 그래서 인간 구별은 가능함.
auth id만 얻어와서 그걸로 다시 우리측 앱이나 서비스에서 가입시키면 (이름과 번호를 받으면) 굳이 biz 딱지를 얻지 않아도 된다.
<del>카카오로 다시 로그인할때 어떤 일이 생길지는.. 일단 지켜봐야한다.</del></p>
<br>


<h3 id="1-kakao-developers-앱설정에서-카카오-로그인-on으로-변경하기">1. Kakao Developers 앱설정에서 카카오 로그인 ON으로 변경하기</h3>
<p><img src="https://velog.velcdn.com/images/jee-9/post/fd06a2c9-1979-4383-8e65-481b0f427d77/image.png" alt=""></p>
<p>활성화 설정을 ON으로 바꾸고 Redirect URI 를 넣어준다.
말 그대로 카카오측에서 이 사람 얘야 라고 알려줄 URI를 뜻한다.
나의 경우 백단 처리가 필요해서 (db에 auth id 담아야하니까) PHP 파일로 리다이렉트 시켰다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/90d4d6e9-1ce0-41ab-be60-a1dfa87ebe72/image.png" alt=""></p>
<h3 id="2-js-구현">2. js 구현</h3>
<p>이제 버튼을 누르면 진행될 함수를 넣어줄 것이다.
기본적인 모습은 아래와 같다</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/0f5e4fdd-a288-4afe-85a7-e0aaea28e170/image.png" alt=""></p>
<p>쉽게 말해, 먼저 카카오톡 실행이 되고, 알아서 하다가- 나한테 코드를 줄테니 토큰 발급을 1회 하고 너 하고싶은대로 하면돼 ~ 라는 의미</p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/e8fba19a-2e82-4f1c-9cb2-00ba9e9a881b/image.png" alt=""></p>
<p>초기 코드를 아주 상세하게 설명해줘서 좋았다.
<del>라고 하기엔 이거 찾을라고 난리를 침 ㅜㅜ 좀만 더 잘보이게 해줘요</del></p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/2caaa583-4f04-4d34-ad3f-2fa87879c81d/image.png" alt=""></p>
<p>저기 <code>${VERSION}</code> 이랑 <code>${INTEGRITY_VALUE}</code> 은 JavaScript 시작하기-다운로드 에서 찾을 수 있다.</p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/f54e389f-d889-45f1-8b40-a27510b0e84f/image.png" alt=""></p>
<p>남은 내용은 저기 있는 노란 하이라이트를 누르면 그냥 스크립트 코드 전체를 준다.
만약 그게 싫다면 VERSION을 직접 찾고, 해당 버전의 INTEGRITY_VALUE 값을 복사해서 넣어주자.
INTEGRITY_VALUE 값은 저 노란 버튼 말고 그 옆에거 누르면 던져준다.</p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/39b52110-5d3b-4a02-88e2-77d22ffebf5c/image.png" alt=""></p>
<p>그리고 저 초기화 코드를 이용해서 초기화를 해본다.</p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/daa1b60d-17dc-4afd-84e5-691d27b3828c/image.png" alt=""></p>
<p>아, 저기 JAVASCRIPT_KEY는 API 활용 토큰 같은 거다.
내 애플리케이션 &gt; 앱 키 &gt; JavaScript 키 에서 찾을 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/6c792ef8-bb7e-4b4c-84db-00a420ad4e50/image.png" alt=""></p>
<p>True를 던져준다.</p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/ff8df345-c0b8-4205-b431-12eeabe3857e/image.png" alt=""></p>
<p>파라미터는 이렇게 던져줬다.</p>
<p>기본적으로 이렇게 하면 웬만하면 알아서 앱이 열리고 알아서 불러가지만, 앱이 없는 경우는 오류가 생긴다.
<del>본부장님이 확인해주셨다ㅜㅜ</del></p>
<p>그래서, Docs를 샅샅이 뒤져보니 이런 말이 있었다. ( 는 무슨 바로 아래 있는데 안읽음 )</p>
<br>


<p><img src="https://velog.velcdn.com/images/jee-9/post/26860293-48eb-42b6-8fbe-3f14364508fb/image.png" alt=""></p>
<p>즉, error가 떨어질 수도 있다는 것.</p>
<p>그럼 Callback 측에서 이 내용에 대한 것들도 redirect로 보내줘야 한단 말씀</p>
<p>그럼 그냥 웹페이지로 가서 아이디랑 비밀번호 입력하게 만들면 된다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/3392c492-51c9-4bbb-8ffd-90812237ea07/image.png" alt=""></p>
<br>

<p>여기를 참고하여 header에 Location을 잡아준다.</p>
<pre><code>https://kauth.kakao.com/oauth/authorize?response_type=code&amp;client_id=${REST_API_KEY}&amp;redirect_uri=${REDIRECT_URI}</code></pre><p>사실 너무 쉽게도, 예제가 있었고 여기 그대로 쓰면, 동작된다. </p>
<h3 id="3-토큰">3. 토큰</h3>
<p><img src="https://velog.velcdn.com/images/jee-9/post/c3b59d5f-ada8-41a8-abf5-55bc5260f95a/image.png" alt=""></p>
<p>JS로 구현할 거라면, 여길 참고하면 된다.</p>
<p>나의 경우 말했다시피 DB 적재도 있고 해서 그냥 php 파일로 만들었다.</p>
<p>php 파일은 REST API로 이용해야함.</p>
<p>파라미터는 </p>
<pre><code>https://kauth.kakao.com/oauth/authorize?response_type=code&amp;client_id=${REST_API_KEY}&amp;redirect_uri=${REDIRECT_URI}</code></pre><p>이런식으로 만들어서 보내면 된다.</p>
<p>REST_API_KEY는 아까 그 앱 키를 넣으면 마무리-</p>
<p>끝!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] AWS MariaDB 이중화 (Master-Slave)]]></title>
            <link>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-AWS-MariaDB-%EC%9D%B4%EC%A4%91%ED%99%94-Master-Slave</link>
            <guid>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-AWS-MariaDB-%EC%9D%B4%EC%A4%91%ED%99%94-Master-Slave</guid>
            <pubDate>Fri, 21 Feb 2025 08:24:11 GMT</pubDate>
            <description><![CDATA[<p>실서버에 넣기 위한 MariaDB의 이중화를 해야할 것 같다..!
그래서 미리-미리- 이중화해두기 ㅎㅎ 왜냐면 시스템 올렸다 내렸다 편하게 할 수 있는 건 지금뿐이니까..!</p>
<br>

<p>중간에 도저히 안풀리는 문제가 있어서 지선생님 도움을 좀 받았다..^^!</p>
<br>

<p>AWS에서 사용하니 당연히, 두 DB 간의 보안 그룹을 열어주어야 한다 😕
두 인스턴스 간의 보안 그룹 설정 및 Public Subnet으로의 ssh 연동이 확인되었다면, 설정을 시작해보자.</p>
<p>일단, mariadb 최신 버전에서는 my.cnf를 쓰지 않는다.
고로 my.cnf 를 하루종일 변경해도 변경점이 저장되지 않음.</p>
<p>이 내용을 지선생이 몰랐나보다. 계속 my.cnf를 던져주길래 </p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/8605b2e7-9cb8-4333-a895-b367b2e2d7c9/image.png" alt=""></p>
<p>라고 물어보니까 이렇게 대답하드라구여,,,, ^^ 이좌식이 ~! 처음부터 제대로 검색하란말이야ㅠㅠ!!</p>
<p><del>이래서 내가 지선생을 안쓰는건데.. 회사 오니까 다들 쓰고있어서...나도쓰게...되었다</del></p>
<h2 id="1-master의-50-servercnf-변경">1. Master의 50-server.cnf 변경</h2>
<pre><code>server-id=1
log_bin=mysql-bin
binlog_do_db=your_database  # 복제할 데이터베이스 이름</code></pre><p>이렇게 써줄건데, <code>binlog_do_db</code> 옵션의 경우 복제할 &#39;데이터베이스&#39; 이름이므로,
전체를 다 백업하는 용도라면 설정하지말자!</p>
<br>

<p>이렇게 하고, 꼭 systemctl restart mariadb를 한번 해주자.
안하고 show master status를 때리니까 암것두 안나온당 😕</p>
<h2 id="2-master-에서-replication-계정-생성">2. Master 에서 Replication 계정 생성</h2>
<pre><code class="language-sql">CREATE USER &#39;replica_user&#39;@&#39;%&#39; IDENTIFIED BY &#39;passwd&#39;;
GRANT REPLICATION SLAVE ON *.* TO &#39;replica_user&#39;@&#39;%&#39;;
FLUSH PRIVILEGES;</code></pre>
<p>유저를 생성해준다. 이 유저는 Slave 쪽에 crud를 해줄 아이인 것으로 보임! (내가 이해한거라 확실 X)</p>
<pre><code class="language-sql">SHOW MASTER STATUS;</code></pre>
<p>마스터의 설정을 확인해서, Slave에 전달해주어야 Slave로 Master의 기록을 찾아서 가져갈 수 있으므로, 마스터의 정보 조회를 해준다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/510a4eea-fa10-471a-b367-fe26559ac0a6/image.png" alt=""></p>
<p>이런식으로 나올것이다.</p>
<p>여기의 <code>File</code> 과 <code>Position</code>을 써먹어야 한다.
binlog_do_db는 위의 옵션을 추가할 경우 나오는데, 나는 추가안했으므로 안나온당!</p>
<br>

<h2 id="3-slave-db의-50-servercnf-설정">3. Slave DB의 50-server.cnf 설정</h2>
<pre><code>server-id=2
relay-log=mysql-relay-bin</code></pre><p>server-id 가 master/slave를 나눠주는 priority 처럼 작동하므로 server-id를 중복시키면 안된다!
그리고 <code>relay-log</code>의 경우 </p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/574f3ea9-fd38-405d-98aa-0174863bd3c7/image.png" alt=""></p>
<p>이런거라고 한다.
옵션이랑 같이 생각해서 체크해보면, Master 서버가 bin log에 변경된 애들을 기록해두면
slave가 와서 bin log를 읽어가고, 이 bin log를 relay log에 저장해두고 자기 DB에 업데이트를 시킨다고 보면 된다.
따라서 relay-log의 이름을 저장하라는 뜻임.</p>
<blockquote>
<p>헷갈렸던 부분을 말하자면, log_bin 옵션과 relay-log 둘 다 log 파일의 이름을 저장하는 것이다.
처음 cnf 파일에는 위치가 저장되어 있을건데, (/var/log/...) 그렇게 하면 해당 로그 파일의 권한을 다시 설정해줘야 하고, 귀찮은 일들이 생긴다고 한다.
따라서 datadir이 디렉토리를 알아서 설정하게 내버려두고, 우리는 이름만 정해주자.</p>
</blockquote>
<h2 id="4-dump하기">4. DUMP하기</h2>
<p>내가 이것때문에 시간을 2시간이나 잡아먹었는데,,;; 나는 slave 한테 bin 정보를 주길래 &#39;아 현 상태를 알아서 복제하나보다&#39; 했는데 그게 아니었음.
처음에는 database와 데이터들을 직접 dump 떠서 넣어줘야 한다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/8bfb4710-a993-4533-800f-94898810ac2e/image.png" alt=""></p>
<p>따라서 master 서버에서 dump를 떠서 slave 서버로 보내주자.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/0073d9a9-12bb-4edd-b46e-620747531655/image.png" alt=""></p>
<p>대충 이렇게... ssh 접속할 수 있는 web 서버에서 옮겨줬다.
나는 pem키 때문에 master에서 slave로 바로 전송 안될거라고 생각했는데 (당연히 두 DB서버 AZ 다름)
되는거같기도 하고...?ㅠㅠ 잘 모르겠다 아무튼 이렇게 옮겨줬다</p>
<br>


<h2 id="5-master과-slave-둘-다-restart-하기">5. Master과 Slave 둘 다 restart 하기!</h2>
<p>이것때문에.. 미리 하는거임 ㅠ
오류가 생기면 계속 restart 해줘야한다,,,</p>
<br>


<h2 id="6-slave-에서-master-정보-설정하기">6. Slave 에서 Master 정보 설정하기</h2>
<p>설정이 끝났으면, Slave한테 나 완료되었으니 이제 Master 정보 입력해줄게 ~ 시작해 ~ 라고 알려줘야한다.</p>
<pre><code class="language-sql">CHANGE MASTER TO
  MASTER_HOST=&#39;Master_DB_Private_IP&#39;,
  MASTER_USER=&#39;replica_user&#39;,
  MASTER_PASSWORD=&#39;passwd&#39;,
  MASTER_LOG_FILE=&#39;mysql-bin.000002&#39;,
  MASTER_LOG_POS=93704;</code></pre>
<p>아까 show master status 해서 나온 값을 여기에 알려줘야한다.
니 마스터는 이 사람이야~ 이 사람의 초기 데이터는 이래~ 라고 알려주는 것과 같다.</p>
<br>

<h2 id="7-slave-복제-시작">7. Slave 복제 시작</h2>
<pre><code class="language-sql">START SLAVE;
SHOW SLAVE STATUS\G;</code></pre>
<p>slave 복제를 시작하고, 복제가 되고 나면 status로 현 상태를 확인해준다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/1168d086-e4c8-4f59-ae0d-d0db342a30c7/image.png" alt=""></p>
<p>대충 이런식으로 뜬다. 
Waiting for master.. 어쩌구 뜨면 성공이다.</p>
<p>계속 Connecting 상태로 있을 경우 아래쪽을 읽어보면 Error가 보인다.
나의 경우 ip를 복사해서 썼더니 &#39;100.10.10.10&#39; 이 아니라 &#39;100-10-10-10&#39; 이렇게 넣어서 에러가 났다.</p>
<p>따라서 트러블슈팅을 해주면 된다.</p>
<br>

<h2 id="8-확인하기">8. 확인하기</h2>
<p>정상적으로 동작하는지 확인하고 싶다면, master에다가 데이터를 하나 넣어보자.
그리고 나서 slave에 데이터가 있는지 확인하면 된다!</p>
<p>업데이트가 잘 되고 있는 경우 데이터가 잘 들어오고 status에도 따로 error가 뜨지 않는다. </p>
<p>끝 - </p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/09e357bc-accc-4978-9f78-01f02361421d/image.png" alt=""></p>
<blockquote>
<p>출처 : 개발진스 짤 dev-hee 님 😃<a href="https://velog.io/@heelieben/%EA%B0%9C%EB%B0%9C%EC%A7%84%EC%8A%A4-%EC%A7%A4-%EB%8D%B0%EB%A0%A4%EA%B0%80%EC%84%B8%EC%9A%942">https://velog.io/@heelieben/%EA%B0%9C%EB%B0%9C%EC%A7%84%EC%8A%A4-%EC%A7%A4-%EB%8D%B0%EB%A0%A4%EA%B0%80%EC%84%B8%EC%9A%942</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] AWS Private Subnet에 mariaDB install하기]]></title>
            <link>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-AWS-Private-Subnet%EC%97%90-mariaDB-install%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-AWS-Private-Subnet%EC%97%90-mariaDB-install%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 21 Feb 2025 01:11:39 GMT</pubDate>
            <description><![CDATA[<p>지난번에는 EC2를 직접 만들어서 NAT Gateway를 생성하는 방법을 포스팅했었는데, 
이번에는 NAT Gateway 서비스를 사용하는 방법을 포스팅한다</p>
<p>너무 간단해서 ㅠ.ㅠ 그래도 일단 저장용으로 ..</p>
<br>

<p><strong>참고로, nat 게이트웨이는 시간당 0.059 USD의 돈이 나간다.
따라서 필요할 때 잠시 쓰고, 1시간이 되기 전에 반납하자.
반납할 때 EC2와 달리 Elastic IP는 자동으로 반납되지 않으므로 Elastic IP는 꼭 따로 반납해주자.</strong></p>
<p><del>난 어제 깜빡하고 켜고 갔다^^</del></p>
<br>

<h2 id="1-nat-gateway-생성">1. NAT Gateway 생성</h2>
<p><img src="https://velog.velcdn.com/images/jee-9/post/33d726a6-67b2-449a-b270-145e320380a2/image.png" alt=""></p>
<p>NAT Gateway를 생성해준다. 
Subnet 선택에서 Subnet은 public 을 설정해줘야 한다.
뭐가 public 인지 모르겠다면 라우트 테이블로 가서 igw 룰이 들어있는 서브넷이 연결된 애가 누군지 알아보자.
그럼 그 친구가 public subnet이다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/bdf0e2ee-3daf-4253-b3a1-f1d56b1d04b5/image.png" alt=""></p>
<p>퍼블릭을 생성 후, Elastic IP를 연결해주는데, 만약 기존에 할당받은 Elastic IP가 없다면, <code>탄력적 IP 할당</code> 버튼을 눌러서 새로 하나 발급받아주면 된다.</p>
<p>그리고 생성을 눌러준다.</p>
<br>

<h2 id="2-라우팅-테이블-연동">2. 라우팅 테이블 연동</h2>
<p>여기까지 했으면 이제 private subnet에 연동된 route table한테 가서, 너는 인터넷을 하고싶으면 여기로 가라. 라고 알려줘야한다.</p>
<p>private subnet에 가서 라우팅 편집을 누르고 라우팅 추가를 한 다음에</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/8d7d7956-1021-44db-a44e-94f6325ebc85/image.png" alt=""></p>
<p>이런 식으로 NAT 게이트웨이를 선택해서 연결해주면 끝</p>
<br>

<h2 id="3-테스트">3. 테스트</h2>
<p>ssh로 접근해서 ping을 날려본다</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/1960fdb4-77f2-4a77-b9cd-b1fcb8704e46/image.png" alt=""></p>
<p>올라오는데 좀 걸릴수도 있다.
실제로 어제는 1분 좀 넘게 걸렸는데 오늘은 1초만에 된다;ㅅ;</p>
<br>

<h2 id="4-mariadb-install">4. mariaDB install</h2>
<p>참고로 <code>apt update</code>를 하지 않으면 이상한 Error가 뜬다</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/01870f72-948d-440c-9096-77fd7c06e046/image.png" alt=""></p>
<p>Unable to locate mariadb-client 이런 거... apt update를 해줘야한다.</p>
<p>그러고 나면 다운로드가 잘 된다.</p>
<br>

<h2 id="5-nat-게이트웨이-반납">5. NAT 게이트웨이 반납</h2>
<p>꼭! 돈 폭탄을 맞고싶지 않다면 반납하라!!</p>
<br>

<h2 id="6-elastic-ip-릴리즈">6. Elastic IP 릴리즈</h2>
<p>이것도 꼭! 해주어라!</p>
<br>

<h2 id="7-route-table-룰-변경">7. Route Table 룰 변경</h2>
<p>이건 돈이 나가는 건 아니지만, 나중에 보면 갑자기 블랙홀이라고 떠서 놀란다
그러니까 한번에 해주자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스타트업 백엔드 일기😕] Better Stack + Slack으로 서버 다운 알림받기]]></title>
            <link>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-Better-Stack-Slack%EC%9C%BC%EB%A1%9C-%EC%84%9C%EB%B2%84-%EB%8B%A4%EC%9A%B4-%EC%95%8C%EB%A6%BC%EB%B0%9B%EA%B8%B0</link>
            <guid>https://velog.io/@jee-9/%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9D%BC%EA%B8%B0-Better-Stack-Slack%EC%9C%BC%EB%A1%9C-%EC%84%9C%EB%B2%84-%EB%8B%A4%EC%9A%B4-%EC%95%8C%EB%A6%BC%EB%B0%9B%EA%B8%B0</guid>
            <pubDate>Thu, 20 Feb 2025 05:24:39 GMT</pubDate>
            <description><![CDATA[<p>오늘은 앱 심사 들어가있는 동안 실서버 구성을 진행했다.
일단 실서버는 Web DB1,2 이렇게만 사용할거지만, 구성도는 거창하게 진행했다. ㅋ_ㅋ
왜냐면 나 나중에 다 만들어볼거니깐! <del>(시간없겠지만)</del></p>
<p>아무튼, 오늘은 Better Stack + Slack으로 간단한 https 모니터링 시스템을 구축해본다. (구축이라고 하기도 뭣하네)</p>
<br>

<p>결론부터 말하자면, 모니터링에는 여러가지 대안이 있다.
서버 다운이 크리티컬하지 않은 경우, (그런 경우는 없겠지만) 지금처럼 3분에 한번 정도 체크를 해서 살아있는지 확인하는 방법이 있고,
좀 더 큰 구조에서는 <code>CloudWatch + lambda + SNS</code> 등을 이용해서 모니터링 알림을 받는 방법이 있을 것이다.
해당 구조도 생각해봤지만, 우리는 API서버가 많고, 각 서버에서 CPU 사용량이나 이런게 많아질거라고는 생각하지 않아서, 떠있는 웹서버에서만 헬스 체크를 하면 될 것 같아서 그냥 무료로 사용할 수 있는 툴을 이용했다.</p>
<p>지선생은 처음에 <code>UptimeRobot</code>을 추천했는데, <code>UptimeRobot</code>은 더이상 Webhook과 Slack을 무료로 제공하지 않는다.
실제로 지선생한테 안되는데? 를 세번 말하니까, 지선생이 &#39;이제 더이상 제공하지 않나봐요&#39; 라고 말하더라 ;ㅅ;
<del>그럴거면 처음부터 알려주지..! 회사 계정이라 계속 요청해야한단말이야!!!</del></p>
<br>

<p>그 다음 대안이 바로 <code>Better Stack</code>이었다. 
Better Stack 사용은 간단하다.</p>
<h2 id="1-better-stack-setup">1. Better Stack Setup</h2>
<p>일단 Sign up을 한 다음 (메일 승인) First Name, Last Name 등을 기입한다.
그리고 https:// [ 주 소 ] 를 입력하라고 말하지만 입력하고 번호를 눌러도 알림은 안온다.</p>
<p>그러면서 하는 말이,
&#39; 앗 미안 한국은 안되나바 엣큥 &#39;
이었음 ㅋㅋㅋㅋ</p>
<p>그래서 그냥 Dashboard로 넘어간다..</p>
<br>


<h2 id="2-integrations">2. Integrations</h2>
<p>왼쪽 사이드바에서 Integrations를 선택하고, Slack을 추가한다.
그럼 웹에 로그인된 슬랙이랑 바로 연동됨</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/0f3c4c6e-f283-4b2b-bbaf-9d964172fa45/image.png" alt=""></p>
<p>이렇게 연동이 되면, 서버 상태 알림 채널에 알림이 들어온다!</p>
<h2 id="3-test">3. test</h2>
<p>테스트로 서버 하나를 중지시켜본다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/1ed708fe-6fbb-4231-bbee-a3f4eb7b7d65/image.png" alt=""></p>
<p>안농...</p>
<p>그러고나면 </p>
<p>한 2분쯤 뒤</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/f7be59c3-627c-4671-a798-5aebba10cefe/image.png" alt=""></p>
<p>짜잔</p>
<p>야야 니네 서버 응답 안주는데? 하고 알림줌
끝- 너무쉽네...</p>
<br>

<p>런칭 전이라 나빼고 다바빠 ㅜㅜ.ㅜ.ㅜ.ㅜㅜ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[bootstrap, js, html 작성하고 미리보기 할 수 있는 사이트, 저작권 무료 이미지 사이트]]></title>
            <link>https://velog.io/@jee-9/bootstrap-js-html-%EC%9E%91%EC%84%B1%ED%95%98%EA%B3%A0-%EB%AF%B8%EB%A6%AC%EB%B3%B4%EA%B8%B0-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%A0%80%EC%9E%91%EA%B6%8C-%EB%AC%B4%EB%A3%8C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@jee-9/bootstrap-js-html-%EC%9E%91%EC%84%B1%ED%95%98%EA%B3%A0-%EB%AF%B8%EB%A6%AC%EB%B3%B4%EA%B8%B0-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%A0%80%EC%9E%91%EA%B6%8C-%EB%AC%B4%EB%A3%8C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%82%AC%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Tue, 07 Jan 2025 12:26:46 GMT</pubDate>
            <description><![CDATA[<p>ㅜ.ㅜ 나 진짜 프론트 못하겠다
프론트 개발자분들 너무 대단하신 것 같ㅇㅁ...</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/1aff4f1a-26b1-4839-bdce-6095762d7495/image.png" alt=""></p>
<p>오늘 치과다녀와서 저녁에 만든거... 진짜 저 작은 픽셀 하나하나 맞춰주는게 너무 힘들고
디자인 어떻게 할지 생각하는것도 너무 힘들다.
분명히 예쁘게 됐을거라고 생각했는데 너무 별로임... ㄸㄹㄹㄹㄹㄹㄹㄹ....</p>
<p>어쨌든, 이 사이트는 Codeply라는 곳인데
작성하면서 바로바로 확인할 수 있어서 참 좋음,,,,</p>
<p><a href="https://www.codeply.com/">https://www.codeply.com/</a></p>
<p>로그인하면 저장도 가능한 것 같구 다른 사람들의 코드도 참조할 수 있는 듯 하다...</p>
<br>

<p>그리고 이미지는 저작권 없는 사이트를 돌아다니다가</p>
<p><a href="https://pixabay.com/illustrations/writer-book-table-candlesticks-8752968/">https://pixabay.com/illustrations/writer-book-table-candlesticks-8752968/</a></p>
<p>대부분 외국 사이트라 외국 사이트에서 파밍했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[VSCode EC2 인스턴스 원격 접속 (ssh) 설정 (오류가 난다면 chmod)]]></title>
            <link>https://velog.io/@jee-9/VSCode-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D-ssh-%EC%84%A4%EC%A0%95-%EC%98%A4%EB%A5%98%EA%B0%80-%EB%82%9C%EB%8B%A4%EB%A9%B4-chmod</link>
            <guid>https://velog.io/@jee-9/VSCode-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D-ssh-%EC%84%A4%EC%A0%95-%EC%98%A4%EB%A5%98%EA%B0%80-%EB%82%9C%EB%8B%A4%EB%A9%B4-chmod</guid>
            <pubDate>Tue, 07 Jan 2025 05:07:08 GMT</pubDate>
            <description><![CDATA[<p>뭔가 쓰기엔 좀 애매한데.. 나중에 분명히 한번 더 설정할 일이 있을 것 같아 남겨둔다.</p>
<p>VSCode에서 Remote-SSH 설치
<img src="https://velog.velcdn.com/images/jee-9/post/9ffb13e5-1689-4c2b-90cc-ac40d9c9a22a/image.png" alt=""></p>
<p>설치한 후에 리로드 한번 필요</p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/eeaf0392-35cf-47d0-9c92-9cc7fce5132e/image.png" alt=""></p>
<p>그리고 나서 <code>구성 파일 열기</code> 클릭 후 구성 파일 작성</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/c77527ae-0a52-45ad-8bdc-9fcea3251045/image.png" alt=""></p>
<p>이렇게 하고 나서 호스트에 연결을 눌렀으나 에러 메시지 없이 실패만 계속 함 </p>
<p>역시 permissions are too open 이지 않을까 싶어서 pem키의 권한을 변경해줌
Windows의 경우 권한 변경은 아래 선생님의 블로그에서 잘 설명해주셨따</p>
<blockquote>
<p>ref: <a href="https://velog.io/@jinhoss/ssh-permissions-for-too-open-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0">https://velog.io/@jinhoss/ssh-permissions-for-too-open-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</a></p>
</blockquote>
<br>

<p>그리고 나서 시도하니 정상작동</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/ecf479e9-8a09-4778-828e-7d362c2e37b3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS를 이용해서 가벼운 웹페이지 기초구조 만들기 (AWS 네트워크 기본설정)]]></title>
            <link>https://velog.io/@jee-9/django%EB%A1%9C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0-AWS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@jee-9/django%EB%A1%9C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0-AWS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8%EC%84%A4%EC%A0%95</guid>
            <pubDate>Mon, 06 Jan 2025 12:52:44 GMT</pubDate>
            <description><![CDATA[<p><small>이건 내 영업비밀...........이지만</small> 나중의 나를 위해 정리해본다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/f91aa988-1704-4dc0-81eb-eba7c1fb3d0f/image.png" alt=""></p>
<p>간단하게 올린 것이므로 인스턴스 유형이 매우 작지만... 개인 웹페이지는 이정도면 일단 충분할 것으로 생각된다.</p>
<p>먼저 Structure를 보자</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/11af647f-8d7e-4da1-b608-41970cb2ed38/image.png" alt=""></p>
<p>private subnet은 amazon linux 위에 직접 올린 nat instance를 이용해 외부와 통신하고,
비용적(그리고 여러 이유..)인 측면을 고려해 nat instance는 bastion host의 역할도 겸하여 
DB Instance에 ssh 통신이 필요할 경우 nat instance를 통해 통신할 수 있도록 bastion host의 역할도 주었다.</p>
<br>

<br>


<p>이 과정에서 nat instance 설정은 내 게시글 <a href="https://velog.io/@jee-9/EC2-NAT-Instance-%EC%A7%81%EC%A0%91-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0">NAT Isntance 직접 구축하기</a>를 참조하였고,
en0X eth0 의 문제가 잠깐 있었지만 트러블슈팅 후 게시글에 추가해두었다.</p>
<br>

<p>django 설치 및 연동은 이 게시글 <a href="https://velog.io/@jee-9/django%EB%A1%9C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%9E%91%EC%84%B1-mysql-%EC%97%B0%EB%8F%99-index-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%84%A4%EC%A0%95">django로 웹페이지 만들기</a>를 통해 진행하였다.</p>
<br>
<br>


<hr>
<h2 id="vpc-생성-및-subnet-나누기">VPC 생성 및 Subnet 나누기</h2>
<p>기본적으로 VPC는 인스턴스를 생성하는 순간 하나 만들어주는데, 
해당 VPC의 subnet은 public subnet 뿐이므로 private subnet을 채용하고 싶다면 subnet을 추가해주어야 한다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/67cc34ed-0a64-4486-9c4f-dda1f813b571/image.png" alt=""></p>
<p>기본으로 있는 subnet 중에 웹이 올라가있는 하나를 public으로 하고 private을 생성하였다.</p>
<p>만들때는 따로 private이라는 옵션이 없는데, 그것은 당연하게도 라우팅 테이블을 연동해줄 때 private과 public을 사용하기 때문이다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/ccce119e-c980-4327-8540-93e88fa3d2f7/image.png" alt=""></p>
<h2 id="route-table-만들어주기">Route Table 만들어주기</h2>
<p>라우팅 테이블로 가서 설정이 하기와 같이 되는 테이블을 하나 만들어준다. </p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/88ffd2be-9315-4380-9186-af1ee9d21fb6/image.png" alt=""></p>
<p>첫번째 규칙에서 대상은 nat instance이고 
두번째 규칙은 vpc내의 vm끼리 통신하겠다는 내용이므로 이 라우팅 테이블을 private subnet에 연동시켜준다.</p>
<h2 id="nat-instance-설정하기">NAT INSTANCE 설정하기</h2>
<p>이외에는 이전에 nat instance 설정한것과 똑같이 하면 된다.</p>
<p>그러면 간단하게 웹 , DB , nat 가 존재하는 라이트한 구조를 만들어볼 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[django로 웹페이지 작성 - mysql 연동, index 페이지 설정]]></title>
            <link>https://velog.io/@jee-9/django%EB%A1%9C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%9E%91%EC%84%B1-mysql-%EC%97%B0%EB%8F%99-index-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@jee-9/django%EB%A1%9C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%9E%91%EC%84%B1-mysql-%EC%97%B0%EB%8F%99-index-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Mon, 06 Jan 2025 11:52:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jee-9/post/9eb0ddf8-cd64-441d-90cc-595383c97350/image.png" alt=""></p>
<p>오늘 하룻동안 한거 ..^^</p>
<p>일단 django 설치 등은 해당 블로그를 많이 참고했다</p>
<blockquote>
<p>ref: <a href="https://lucky516.tistory.com/58">https://lucky516.tistory.com/58</a></p>
</blockquote>
<p>최대한 필요한 정보만 담아먹었다..!</p>
<p>또한 DB 연동은 해당 블로그를 참조하였음</p>
<blockquote>
<p>ref: <a href="https://velog.io/@dustndus8/Django5.-DB-%EC%97%B0%EB%8F%99">https://velog.io/@dustndus8/Django5.-DB-%EC%97%B0%EB%8F%99</a></p>
</blockquote>
<br>

<br>

<h3 id="1-django-설치-및-runserver">1. django 설치 및 runserver</h3>
<p>기본적으로 첫번째 블로그의 1번 포스팅을 참고하면 좋다.</p>
<p>다만, runserver를 할 때 나의 경우 AWS Instance를 이용했기때문에 localhost로 접근하는게 아니었다.</p>
<p>따라서 runserver 커맨드는 하기와 같다.</p>
<pre><code>python3 manage.py runserver 0.0.0.0:8000</code></pre><br>


<h3 id="2-startapp">2. startapp</h3>
<p>첫번째 블로그의 2번 포스팅을 참조하여 startapp을 진행하면 된다.</p>
<p>나의 경우, HttpResponse를 주고 싶었던 게 아니라 메인페이지를 보여주고 싶었기 때문에 해당 부분만 변경하여 진행했다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/4addac4b-547b-42d8-b8c4-5ad981e3ea2c/image.png" alt=""></p>
<p><code>board/index.html</code> 파일을 찾아갈 수 있도록 리턴해준다.</p>
<br>

<h3 id="3-db-연동">3. DB 연동</h3>
<p>여기서부터 첫번째 블로그와 다른 점이 있는데, 나의 경우에는 DB 연동을 따로 할 것이기 때문에 기본으로 제공하는 DB를 사용하지 않는다. 
따라서 settings.py로 가서 DB 설정을 해주어야 한다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/75628b88-d0a5-4c1d-9739-0a54ff6b52cd/image.png" alt=""></p>
<p>DB 설정을 해주고 <del>(나중에 꼭 바꾸자)</del> makemigrations를 해주면, 잘 작동되는 것을 확인할 수 있었다.</p>
<p>내친김에 쿼리도 한번 불러봐준다</p>
<br>

<h3 id="4-간단한-프론트페이지-작성">4. 간단한 프론트페이지 작성</h3>
<p>여기서 첫번째 블로그 선생님께 감사함이 느껴졌다,,, 
일단 , templates를 어느 경로에 생성해야하는가를 아무 블로그에서도 알려주지 않았다,,, 속상</p>
<p>첫번째 블로그의 5번 게시글로 바로 넘어가서 참고하였다.</p>
<br>

<p><img src="https://velog.velcdn.com/images/jee-9/post/fc46c750-64eb-4e26-8909-d397081e0ae6/image.png" alt=""></p>
<p><del>감사합니다 감사합니다 감사합니다...</del></p>
<br>

<p>해당 위치에 템플릿 디렉토리 생성 및 index.html을 만들어보면... 
나만의 웹페이지 메인 완성..!</p>
<p>이제 프론트 작성해야한다 귀찮아<del>~</del>!!!!!!!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[amazon linux mysqlclient 설치 오류 해결법]]></title>
            <link>https://velog.io/@jee-9/amazon-linux-mysqlclient-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0%EB%B2%95</link>
            <guid>https://velog.io/@jee-9/amazon-linux-mysqlclient-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0%EB%B2%95</guid>
            <pubDate>Mon, 06 Jan 2025 11:12:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jee-9/post/c6470f1d-bbf8-4093-90fa-bc609628b468/image.png" alt=""></p>
<blockquote>
<p><a href="https://stackoverflow.com/questions/75951019/unable-to-install-mysqlclient-package-on-ec2-instance/75957438#75957438">https://stackoverflow.com/questions/75951019/unable-to-install-mysqlclient-package-on-ec2-instance/75957438#75957438</a></p>
</blockquote>
<p>스택 오버플로에서 해결 ㅠ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[mysql community 설치 후 설정]]></title>
            <link>https://velog.io/@jee-9/mysql-community-%EC%84%A4%EC%B9%98-%ED%9B%84-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@jee-9/mysql-community-%EC%84%A4%EC%B9%98-%ED%9B%84-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Mon, 06 Jan 2025 09:35:28 GMT</pubDate>
            <description><![CDATA[<h3 id="1-최초-접속">1. 최초 접속</h3>
<pre><code>mysql -u root -p</code></pre><p>임시 비밀번호는 <code>/var/log/mysqld/log</code> 안에 들어있다.
temporary password is <del>~</del> 이런식으로 서술되어 있을 것이다.</p>
<p>해당 비밀번호 이용하여 접속</p>
<h3 id="2-비밀번호-변경">2. 비밀번호 변경</h3>
<pre><code class="language-sql">ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;[새로운 패스워드]&#39;;
FLUSH PRIVILEGES;</code></pre>
<p>이 경우 
<code>ERROR 1819 (HY000): Your password does not satisfy the current policy requirements</code></p>
<p>이런 오류가 뜰 수 있는데 이것은 내 비밀번호 설정에 맞지 않아서..
그냥 설치했더니 STRONG으로 되어 있어서
대문자, 소문자, 특수문자, 숫자를 모두 포함한 8자리 이상이어야 한다고 한다</p>
<h3 id="3-mycnf-찾기">3. my.cnf 찾기</h3>
<p>나의 경우 /var/안에서 my.cnf를 찾았다..
my.cnf 안에 들어가서 기본적인 설정을 해주는데</p>
<p><code>bind-adress=0.0.0.0</code>
주석 처리도 같은 의미임</p>
<p>외부 접근 허용을 열어준다.</p>
<h3 id="4-유저-추가-및-데이터테이블테이블-생성">4. 유저 추가 및 데이터테이블/테이블 생성</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Amazon linux에 mysql 설치]]></title>
            <link>https://velog.io/@jee-9/Amazon-linux%EC%97%90-mysql-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@jee-9/Amazon-linux%EC%97%90-mysql-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 06 Jan 2025 06:31:42 GMT</pubDate>
            <description><![CDATA[<p>다양한 블로그 글이 있는데.. 이것저것 하다가 이런저런 에러를 마주하여
다음에는 깔끔하게 하기 위해 정리해본다</p>
<blockquote>
<p>ref : <a href="https://dev.classmethod.jp/articles/ec2-mysql-install-confilicting-requests-error-kr/">https://dev.classmethod.jp/articles/ec2-mysql-install-confilicting-requests-error-kr/</a></p>
</blockquote>
<blockquote>
<p>ref : <a href="https://velog.io/@yushinc/Error-GPG-check-FAILED">https://velog.io/@yushinc/Error-GPG-check-FAILED</a></p>
</blockquote>
<p>Amazon Linux 2023 + 버전이라면</p>
<pre><code>sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf install mysql-community-server</code></pre><p>해당 방법으로 repo 추가 및 설치를 해주어야 한다.</p>
<p>/etc/yum.repos.d 내에 있는 amazonlinux.repo에 mysql-community-server 추가가 기본적으로 되어 있지 않기 때문에 설치가 불가능하므로 해당 방법이 필요하다</p>
<p>이렇게 설치를 하면 문제가 생기지 않지만, 이렇게 설치를 하지 않은 경우</p>
<p><code>conflicting requests</code> 라는 에러 메시지를 마주하게 된다.</p>
<p>이것은 지원하지 않는 버전의 mysql을 설치한 것으로, 다시 설치해주면 된다.</p>
<p>이렇게 다시 설치할 경우</p>
<p><code>Error: GPG check FAILED</code> 이 에러를 한번 더 보게 되는데, 이는 이전에 설치했던 키 값과 키 값이 충돌이 나서 확인이 되지 않는 경우인 것 같다.</p>
<p>따라서 </p>
<pre><code>rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023</code></pre><p>설치한 버전으로 키 값 갱신을 해주면 정상적으로 설치된다.</p>
<p><img src="https://velog.velcdn.com/images/jee-9/post/a5b4731b-7288-422b-8219-30afbe7f1829/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>