<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>잡다한 IT 지식</title>
    <link>https://codingpracticing.tistory.com/</link>
    <description>공부하면서 배운 정보들을 간단히 정리하는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 11:07:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>가나무마</managingEditor>
    <item>
      <title>GNS3 프로젝트가 열리지 않을 때 원인 확인 방법</title>
      <link>https://codingpracticing.tistory.com/569</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GNS3에서 몇몇 이슈는 UI를 통해 확인이 불가능하다.&lt;/li&gt;
&lt;li&gt;GNS3 로그 파일을 확인하여 트러블슈팅 진행이 필요하다.&lt;/li&gt;
&lt;li&gt;Linux의 경우, &lt;code&gt;~/.config/GNS3/{GNS Version}/&lt;/code&gt;디렉터리에 로그 파일이 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 GNS3에서 발생하는 에러는 Console 창이나 팝업 윈도우를 통해 쉽게 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이번에 작업 중인 Fortinet 프로젝트에서 에러 메시지 없이 프로젝트 자체가 열리지 않는 이슈가 발생했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;test.webp&quot; data-origin-width=&quot;3440&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz6gIb/dJMcaflx3FV/QIhk7yzHbanOEaFSwUYyL0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz6gIb/dJMcaflx3FV/QIhk7yzHbanOEaFSwUYyL0/img.webp&quot; data-alt=&quot;fortinet 프로젝트를 열려고 시도하지만 열리지 않고, 에러 메시지도 뜨지 않는다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz6gIb/dJMcaflx3FV/QIhk7yzHbanOEaFSwUYyL0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz6gIb%2FdJMcaflx3FV%2FQIhk7yzHbanOEaFSwUYyL0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;320&quot; data-filename=&quot;test.webp&quot; data-origin-width=&quot;3440&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fortinet 프로젝트를 열려고 시도하지만 열리지 않고, 에러 메시지도 뜨지 않는다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI 상에서 에러 확인이 불가능하므로 로그 메시지를 확인하여 트러블슈팅이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 환경을 기준으로 GNS3의 로그 파일은 다음 경로에 위치합니다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;~/.config/GNS3/{GNS 버전}/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCe0k5/dJMcajamQvV/qRhBJaYxk8aoCkp3fLhEwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCe0k5/dJMcajamQvV/qRhBJaYxk8aoCkp3fLhEwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCe0k5/dJMcajamQvV/qRhBJaYxk8aoCkp3fLhEwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCe0k5%2FdJMcajamQvV%2FqRhBJaYxk8aoCkp3fLhEwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;334&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 경로로 이동해 gns3_server.log 파일을 확인해 보니, UI에서는 출력되지 않았던 에러 로그를 발견할 수 있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2662&quot; data-origin-height=&quot;1123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EXQEM/dJMcaaxMDle/SDH0JW93fAvLza9M7kcce1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EXQEM/dJMcaaxMDle/SDH0JW93fAvLza9M7kcce1/img.png&quot; data-alt=&quot;gns3_server.log 파일에 UI에서 확인 불가했던 로그들이 출력된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EXQEM/dJMcaaxMDle/SDH0JW93fAvLza9M7kcce1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEXQEM%2FdJMcaaxMDle%2FSDH0JW93fAvLza9M7kcce1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2662&quot; height=&quot;1123&quot; data-origin-width=&quot;2662&quot; data-origin-height=&quot;1123&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gns3_server.log 파일에 UI에서 확인 불가했던 로그들이 출력된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 경우에는 &lt;b&gt;DockerError&lt;/b&gt;가 발생했으며, 생성하려는 컨테이너명을 이미 다른 곳에서 사용하고 있다는 내용이었습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충돌을 일으키는 해당 Docker 컨테이너들을 찾아 삭제 조치했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 GNS3에서 프로젝트를 다시 열자, 정상적으로 Fortinet 프로젝트가 실행되는 것을 확인했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2203&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfsQJl/dJMcacoOWzx/1IuD71gHTwRRy1L1uv7gK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfsQJl/dJMcacoOWzx/1IuD71gHTwRRy1L1uv7gK0/img.png&quot; data-alt=&quot;해당 컨테이너들을 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfsQJl/dJMcacoOWzx/1IuD71gHTwRRy1L1uv7gK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfsQJl%2FdJMcacoOWzx%2F1IuD71gHTwRRy1L1uv7gK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2203&quot; height=&quot;175&quot; data-origin-width=&quot;2203&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해당 컨테이너들을 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, 프로젝트를 다시 열자 정상적으로 프로젝트가 열렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3430&quot; data-origin-height=&quot;1375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btWP2E/dJMcahXXJpi/PiRyBgiVOSn7rJnEn6Fhdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btWP2E/dJMcahXXJpi/PiRyBgiVOSn7rJnEn6Fhdk/img.png&quot; data-alt=&quot;정상적으로 프로젝트가 열린다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btWP2E/dJMcahXXJpi/PiRyBgiVOSn7rJnEn6Fhdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtWP2E%2FdJMcahXXJpi%2FPiRyBgiVOSn7rJnEn6Fhdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3430&quot; height=&quot;1375&quot; data-origin-width=&quot;3430&quot; data-origin-height=&quot;1375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정상적으로 프로젝트가 열린다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/569</guid>
      <comments>https://codingpracticing.tistory.com/569#entry569comment</comments>
      <pubDate>Sat, 14 Mar 2026 09:17:41 +0900</pubDate>
    </item>
    <item>
      <title>FortiGate - Threat Feed 기반 URL 필터링 동적 구성</title>
      <link>https://codingpracticing.tistory.com/568</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TL;DR&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FortiGate에선 Threat Feed를 통해 외부 서버에서 IP 주소, MAC 주소, URL, Domain 등을 조회 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조회한 데이터를 객체로 만들어 Web Filter, Domain Filter, Firewall Source Address 등 적용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Threat Feed API: &lt;a href=&quot;https://github.com/johnson434/fortigate_threat_feed_webserver&quot;&gt;https://github.com/johnson434/fortigate_threat_feed_webserver&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구성도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dun6I5/dJMcai3qNkU/khTFOUSuP616sLrnmJSRHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dun6I5/dJMcai3qNkU/khTFOUSuP616sLrnmJSRHk/img.png&quot; data-alt=&quot;FortiGate Port2와 Threat Feed Server가 직접 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dun6I5/dJMcai3qNkU/khTFOUSuP616sLrnmJSRHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdun6I5%2FdJMcai3qNkU%2FkhTFOUSuP616sLrnmJSRHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;447&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FortiGate Port2와 Threat Feed Server가 직접 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설정 화면&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Threat Feed API 서버로부터 URL 목록 조회하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FortiGate가 조회할 API 서버를 아래와 같이 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Security Fabric &amp;gt; External Connectors &amp;gt; Create New &amp;gt; Threat Feeds &amp;gt; FortiGuard Category&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;1221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4GpUz/dJMcaadkuaH/WUgP5bOF9joefTFVUqK0y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4GpUz/dJMcaadkuaH/WUgP5bOF9joefTFVUqK0y0/img.png&quot; data-alt=&quot;HTTP 인증 없이 5분 주기로 Threat Feed로부터 URL 목록 조회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4GpUz/dJMcaadkuaH/WUgP5bOF9joefTFVUqK0y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4GpUz%2FdJMcaadkuaH%2FWUgP5bOF9joefTFVUqK0y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;594&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;1221&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HTTP 인증 없이 5분 주기로 Threat Feed로부터 URL 목록 조회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;a href=&quot;http://192.168.20.2/feeds/fortiguard-categories&amp;quot;&quot;&gt;http://192.168.20.2/feeds/fortiguard-categories&quot;&lt;/a&gt; 주소로부터 URL 목록을 조회한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목록 갱신 주기는 5분으로 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1766&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU8c13/dJMb99S0okI/NgLt7K0pKvPfAxHwh6gGOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU8c13/dJMb99S0okI/NgLt7K0pKvPfAxHwh6gGOk/img.png&quot; data-alt=&quot;Entries가 1로 유효한 URL 주소가 서버로부터 1개 반환됐다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU8c13/dJMb99S0okI/NgLt7K0pKvPfAxHwh6gGOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU8c13%2FdJMb99S0okI%2FNgLt7K0pKvPfAxHwh6gGOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1766&quot; height=&quot;1086&quot; data-origin-width=&quot;1766&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Entries가 1로 유효한 URL 주소가 서버로부터 1개 반환됐다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버와 연동에 성공하자, 해당 API 서버로부터 URL을 1개 가져오는 데 성공했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 Valid는 유효한 Entry 개수를 의미한다. 만약, MAC 주소와 같은 URL 형식에 맞지 않은 값이 들어있다면 Invalid로 처리된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2051&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN6JrK/dJMb996yl3q/EFdBXNFEk4VXBYWsS4ruK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN6JrK/dJMb996yl3q/EFdBXNFEk4VXBYWsS4ruK0/img.png&quot; data-alt=&quot;View Entries를 클릭하면 API 서버로부터 받은 URL을 확인 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN6JrK/dJMb996yl3q/EFdBXNFEk4VXBYWsS4ruK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN6JrK%2FdJMb996yl3q%2FEFdBXNFEk4VXBYWsS4ruK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2051&quot; height=&quot;914&quot; data-origin-width=&quot;2051&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;View Entries를 클릭하면 API 서버로부터 받은 URL을 확인 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View Entries를 클릭하면 해당하는 URL 목록을 직접 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예에선 이 블로그의 주소를 반환하도록 Threat Feed API 서버를 구축하였으므로 codingpracting.tistory.com이라는 주소를 반환한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1049&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PuWDG/dJMcaiWGymU/Z1oXxDuLBLxCkdj1koMcp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PuWDG/dJMcaiWGymU/Z1oXxDuLBLxCkdj1koMcp0/img.png&quot; data-alt=&quot;Web Filter에서 해당 카테고리 주소를 차단하라고 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PuWDG/dJMcaiWGymU/Z1oXxDuLBLxCkdj1koMcp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPuWDG%2FdJMcaiWGymU%2FZ1oXxDuLBLxCkdj1koMcp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1830&quot; height=&quot;1049&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1049&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Web Filter에서 해당 카테고리 주소를 차단하라고 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Security Profiles에 가면 방금 만든 External Connector와 이름이 같은 웹필터의 카테고리가 Remote Categories에 추가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 사이트에 접근하면 차단하도록 Block으로 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;1057&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tP6gp/dJMcadHPMEB/4SYwd07dtx8lK7dHcBEQgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tP6gp/dJMcadHPMEB/4SYwd07dtx8lK7dHcBEQgk/img.png&quot; data-alt=&quot;방화벽 정책에 적용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tP6gp/dJMcadHPMEB/4SYwd07dtx8lK7dHcBEQgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtP6gp%2FdJMcadHPMEB%2F4SYwd07dtx8lK7dHcBEQgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1363&quot; height=&quot;1057&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;1057&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;방화벽 정책에 적용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web Filter를 접근을 차단할 방화벽 정책에 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1097&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AFzPE/dJMcadnxquq/VyyArX9qFewQWcngEKtxQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AFzPE/dJMcadnxquq/VyyArX9qFewQWcngEKtxQ0/img.png&quot; data-alt=&quot;사이트 접속 시도 시 차단&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AFzPE/dJMcadnxquq/VyyArX9qFewQWcngEKtxQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAFzPE%2FdJMcadnxquq%2FVyyArX9qFewQWcngEKtxQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;1097&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1097&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사이트 접속 시도 시 차단&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;codingpracting.tistory.com을 통해 접속했을 때, 차단됨을 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3437&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyofDJ/dJMcabccY0K/OvuMLCOOno0U9G7sIqrOtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyofDJ/dJMcabccY0K/OvuMLCOOno0U9G7sIqrOtk/img.png&quot; data-alt=&quot;Log &amp;amp;amp; Report의 Security Events 확인 시 해당 카테고리로 판단되어 차단되는 것을 볼 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyofDJ/dJMcabccY0K/OvuMLCOOno0U9G7sIqrOtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyofDJ%2FdJMcabccY0K%2FOvuMLCOOno0U9G7sIqrOtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3437&quot; height=&quot;994&quot; data-origin-width=&quot;3437&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Log &amp;amp; Report의 Security Events 확인 시 해당 카테고리로 판단되어 차단되는 것을 볼 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그에서도 URL 필터를 통해 차단됨을 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없는 다이어그램.drawio.png&quot; data-origin-width=&quot;2728&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvZUVR/dJMcaaRWP6r/KSJ7wqgvhdAI2f74bOJ9KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvZUVR/dJMcaaRWP6r/KSJ7wqgvhdAI2f74bOJ9KK/img.png&quot; data-alt=&quot;디버그 명령어를 통해 해당 category 192번을 통해 접속 차단됨을 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvZUVR/dJMcaaRWP6r/KSJ7wqgvhdAI2f74bOJ9KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvZUVR%2FdJMcaaRWP6r%2FKSJ7wqgvhdAI2f74bOJ9KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2728&quot; height=&quot;644&quot; data-filename=&quot;제목 없는 다이어그램.drawio.png&quot; data-origin-width=&quot;2728&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디버그 명령어를 통해 해당 category 192번을 통해 접속 차단됨을 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 디버그를 통해서도 확인 가능&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;diagnose debug enable
diagnose ips debug enable all&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;참고 자료&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://docs.fortinet.com/document/fortigate/7.6.6/administration-guide/9463&quot;&gt;FortiOS 7.6.6 Administrator Guide - External Feeds&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://community.fortinet.com/t5/FortiGate/Technical-Tip-Troubleshooting-static-URL-filter-by-debug-ips/ta-p/248171&quot;&gt;Technical Tip: Troubleshooting static URL filter by 'debug ips'&lt;/a&gt;&lt;/p&gt;</description>
      <category>Fortinet/FortiGate</category>
      <category>fortigate</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/568</guid>
      <comments>https://codingpracticing.tistory.com/568#entry568comment</comments>
      <pubDate>Sat, 28 Feb 2026 01:03:41 +0900</pubDate>
    </item>
    <item>
      <title>FortiGate VM permanent evaluation VM license 등록하기</title>
      <link>https://codingpracticing.tistory.com/567</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;FortiGate는 VMWare부터 AWS EC2 인스턴스에 등록 가능한 Permanent Evaluation VM License를 계정당 1개 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서에 소개된 등록 방법은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EYUYC/btsQmYpJ318/HDUGCqi5sKzvu8CijIFZXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EYUYC/btsQmYpJ318/HDUGCqi5sKzvu8CijIFZXk/img.png&quot; data-alt=&quot;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EYUYC/btsQmYpJ318/HDUGCqi5sKzvu8CijIFZXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEYUYC%2FbtsQmYpJ318%2FHDUGCqi5sKzvu8CijIFZXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1027&quot; height=&quot;676&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FortiGate에 CLI로 접속하여 Fortinet 계정을 입력하면 라이센스 발급을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. CLI로 라이센스 등록&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 FortiGate 콘솔에서 입력하면 VM License 등록이 진행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1756994670715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;execute vm-license-options account-id Fortinet이메일
execute vm-license-options account-password Fortinet비밀번호
execute vm-license&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Do you want to continue?에 y를 입력하고 엔터를 치면 FortiGate가 재부팅되며 라이센스 등록이 진행된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qeMa8/btsQkPA56Aw/7lZw17oTF5o1B7DlgPdcBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qeMa8/btsQkPA56Aw/7lZw17oTF5o1B7DlgPdcBK/img.png&quot; data-alt=&quot;FortiGate 콘솔에 로그인 후에 execute 커맨드를 통해서 라이센스 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qeMa8/btsQkPA56Aw/7lZw17oTF5o1B7DlgPdcBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqeMa8%2FbtsQkPA56Aw%2F7lZw17oTF5o1B7DlgPdcBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1327&quot; height=&quot;499&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FortiGate 콘솔에 로그인 후에 execute 커맨드를 통해서 라이센스 등록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 라이센스 등록 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없는 다이어그램-페이지-2.drawio.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6VIf/btsQkpCGmjl/SPSswQLHVm4JXp2SekYsmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6VIf/btsQkpCGmjl/SPSswQLHVm4JXp2SekYsmk/img.png&quot; data-alt=&quot;CLI로 라이센스 등록 확인하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6VIf/btsQkpCGmjl/SPSswQLHVm4JXp2SekYsmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6VIf%2FbtsQkpCGmjl%2FSPSswQLHVm4JXp2SekYsmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;120&quot; data-filename=&quot;제목 없는 다이어그램-페이지-2.drawio.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CLI로 라이센스 등록 확인하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FortiGate 콘솔에서 아래 명령어를 통해 라이센스 등록 여부를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1756994793690&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;get system status | grep -i license&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756992584321&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Permanent trial mode for FortiGate-VM | Administration Guide&quot; data-og-description=&quot; &quot; data-og-host=&quot;docs.fortinet.com&quot; data-og-source-url=&quot;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&quot; data-og-url=&quot;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cl4hbu/hyZG2KaL6M/qhkzMQcISaWV18tXm1Le2K/img.png?width=972&amp;amp;height=475&amp;amp;face=0_0_972_475,https://scrap.kakaocdn.net/dn/RC3Tf/hyZGaCdtSv/79zwubct0KB2zxk9aJiabk/img.png?width=972&amp;amp;height=475&amp;amp;face=0_0_972_475&quot;&gt;&lt;a href=&quot;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fortinet.com/document/fortigate/7.6.4/administration-guide/441460&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cl4hbu/hyZG2KaL6M/qhkzMQcISaWV18tXm1Le2K/img.png?width=972&amp;amp;height=475&amp;amp;face=0_0_972_475,https://scrap.kakaocdn.net/dn/RC3Tf/hyZGaCdtSv/79zwubct0KB2zxk9aJiabk/img.png?width=972&amp;amp;height=475&amp;amp;face=0_0_972_475');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Permanent trial mode for FortiGate-VM | Administration Guide&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.fortinet.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Fortinet/FortiGate</category>
      <category>Evaluation License</category>
      <category>fortigate</category>
      <category>fortinet</category>
      <category>VM</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/567</guid>
      <comments>https://codingpracticing.tistory.com/567#entry567comment</comments>
      <pubDate>Thu, 4 Sep 2025 23:10:25 +0900</pubDate>
    </item>
    <item>
      <title>분산 시스템과 CAP</title>
      <link>https://codingpracticing.tistory.com/566</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 분산 시스템이란?&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;분산 시스템은 공통의 목표를 위해 여러 개의 독립된 노드가 네트워크를 통해 협력하여 동작하는 시스템입니다.&lt;br&gt;예를 들어, 데이터를 여러 노드에 분산 저장하는 &lt;b&gt;NoSQL 시스템&lt;/b&gt;, 읽기 부하를 분산하기 위한 &lt;b&gt;RDBMS의 읽기 복제본&lt;/b&gt;도 분산 시스템의 사례로 볼 수 있습니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 분산 시스템은 왜 쓸까?&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1 단일 서버 기반 아키텍처의 한계&lt;/h4&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3N37v/btsO7yN6XoD/NrY4IialP3jGvHIGkIt9nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3N37v/btsO7yN6XoD/NrY4IialP3jGvHIGkIt9nk/img.png&quot; data-alt=&quot;어느 스타트업의 초창기 아키텍처 설계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3N37v/btsO7yN6XoD/NrY4IialP3jGvHIGkIt9nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3N37v%2FbtsO7yN6XoD%2FNrY4IialP3jGvHIGkIt9nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1716&quot; height=&quot;884&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어느 스타트업의 초창기 아키텍처 설계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;어느 회사가 서비스를 런칭했다고 가정해 봅시다.&lt;br&gt;초기에는 시장 반응 검증이 목적이므로 &lt;b&gt;대규모 트래픽을 고려하지 않은 단순한 아키텍처&lt;/b&gt;를 사용했습니다.&lt;br&gt;이때 Auto Scaling Group은 단일 인스턴스에 장애가 발생했을 때 동일한 인스턴스를 재기동하는 용도로만 쓰였습니다. 즉, 인스턴스 수는 항상 1개였습니다.&lt;br&gt;그러나 시간이 지나 트래픽이 증가하면서 &lt;b&gt;단일 인스턴스로는 더 이상 부하를 감당할 수 없는 상황&lt;/b&gt;이 발생합니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKQrJE/btsO60j4fW7/rGH3QwGgX4J0RZzODILCpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKQrJE/btsO60j4fW7/rGH3QwGgX4J0RZzODILCpk/img.png&quot; data-alt=&quot;서버를 여러 대 띄우고 로드밸런서를 통해 작업을 분배&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKQrJE/btsO60j4fW7/rGH3QwGgX4J0RZzODILCpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKQrJE%2FbtsO60j4fW7%2FrGH3QwGgX4J0RZzODILCpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2156&quot; height=&quot;1132&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버를 여러 대 띄우고 로드밸런서를 통해 작업을 분배&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버 계층은 애플리케이션이 &lt;b&gt;Stateless&lt;/b&gt;로 설계되어 있다면 수평적 확장이 비교적 쉽습니다. 로드밸런서를 두고 서버 수를 늘리면 됩니다.&lt;br&gt;그렇다면 데이터 계층(RDS)에도 같은 방식이 적용될까요?&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHvd4k/btsO8ReJc7X/StkgNkgm6GsImkaqoqQBG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHvd4k/btsO8ReJc7X/StkgNkgm6GsImkaqoqQBG1/img.png&quot; data-alt=&quot;DB의 수평적 확장을 위해선 분산 시스템 설계가 필요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHvd4k/btsO8ReJc7X/StkgNkgm6GsImkaqoqQBG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHvd4k%2FbtsO8ReJc7X%2FStkgNkgm6GsImkaqoqQBG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;275&quot; height=&quot;285&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DB의 수평적 확장을 위해선 분산 시스템 설계가 필요하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;아쉽게도 RDS는 웹 서버처럼 단순히 인스턴스를 늘린다고 해서 수평 확장이 되지 않습니다.&lt;br&gt;데이터 계층은 여러 DB 인스턴스가 동시에 쓰기·읽기를 처리할 때 &lt;b&gt;데이터 동기화 문제&lt;/b&gt;가 필연적으로 발생합니다.&lt;br&gt;동기화가 제대로 되지 않으면 같은 쿼리에 대해 인스턴스마다 다른 결과를 반환할 수 있습니다.&lt;br&gt;따라서 RDS를 수평적으로 확장하려면 단순 복제 이상의 방법, 예를 들어 &lt;b&gt;샤딩(Sharding)&lt;/b&gt; 같은 분산 데이터베이스 설계가 필요합니다.&lt;br&gt;그리고 이러한 분산 시스템의 동작 원리를 이해하기 위해 등장하는 개념이 바로 &lt;b&gt;CAP 이론&lt;/b&gt;입니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. CAP란?&lt;/h3&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mR3Db/btsO87nY44M/wnMG8Q0skMWNAxQzOMDon1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mR3Db/btsO87nY44M/wnMG8Q0skMWNAxQzOMDon1/img.png&quot; data-alt=&quot;CAP&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mR3Db/btsO87nY44M/wnMG8Q0skMWNAxQzOMDon1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmR3Db%2FbtsO87nY44M%2FwnMG8Q0skMWNAxQzOMDon1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;510&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CAP&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CAP은 &lt;b&gt;Consistency(일관성)&lt;/b&gt;, &lt;b&gt;Availability(가용성)&lt;/b&gt;, **Partition Tolerance(분할 내성)의 앞 글자를 딴 개념입니다.&lt;br&gt;분산 시스템은 이 세 가지 특성을 동시에 만족할 수 없으며, 상황에 따라 이 중 2가지만 선택할 수 있다는 것이 CAP 이론의 핵심입니다.&lt;br&gt;흔히 다음과 같이 &lt;b&gt;CA / CP / AP&lt;/b&gt;의 세 가지 분류로 설명됩니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1 Consistency (일관성)&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Consistency는 분산 시스템의 모든 노드가 동일한 데이터를 보장하는 특성입니다.&lt;br&gt;사용자가 어느 노드에 요청을 보내더라도 항상 같은 결과를 받아야 합니다.&lt;br&gt;예: Kubernetes에서 사용하는 &lt;b&gt;etcd&lt;/b&gt;는 강한 일관성(strong consistency)을 보장합니다.&lt;br&gt;→ 클러스터 구성 정보가 저장된 etcd는 과반수 노드 합의(RAFT 알고리즘)를 통해 &lt;b&gt;항상 최신의 동일한 데이터&lt;/b&gt;를 반환합니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OROA0/btsO8J2aprw/Ax8ydxmyFDWBEltlBP6vT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OROA0/btsO8J2aprw/Ax8ydxmyFDWBEltlBP6vT1/img.png&quot; data-alt=&quot;kubernetes의 etcd 저장소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OROA0/btsO8J2aprw/Ax8ydxmyFDWBEltlBP6vT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOROA0%2FbtsO8J2aprw%2FAx8ydxmyFDWBEltlBP6vT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;531&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kubernetes의 etcd 저장소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2 Availability (가용성)&lt;/h4&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oLj3R/btsO6KO7JGj/bcIJN7fMoCqQArutV3Wu11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oLj3R/btsO6KO7JGj/bcIJN7fMoCqQArutV3Wu11/img.png&quot; data-alt=&quot;DynamoDB의 글로벌 테이블을 활용한 멀티 리전 배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oLj3R/btsO6KO7JGj/bcIJN7fMoCqQArutV3Wu11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoLj3R%2FbtsO6KO7JGj%2FbcIJN7fMoCqQArutV3Wu11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1302&quot; height=&quot;523&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DynamoDB의 글로벌 테이블을 활용한 멀티 리전 배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Availability는 일부 노드에 장애가 발생해도 &lt;b&gt;정상 동작하는 노드가 요청에 응답할 수 있는 특성&lt;/b&gt;을 의미합니다.&lt;br&gt;예: &lt;b&gt;DynamoDB 글로벌 테이블&lt;/b&gt;은 여러 리전에 데이터를 복제합니다. 특정 리전에 장애가 발생해도 다른 리전에서 읽기/쓰기 작업을 처리할 수 있으므로 높은 가용성을 제공합니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3 Partition Tolerance (분할 내성)&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Partition Tolerance는 &lt;b&gt;네트워크 단절(Partition)이 발생하더라도 시스템이 일부 기능을 유지할 수 있는 능력&lt;/b&gt;을 의미합니다.&lt;br&gt;예: DynamoDB는 특정 리전이 단절되더라도 나머지 리전에서 정상 응답을 할 수 있습니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. CP, AP, CA?&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1 P는 필수&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;현실의 네트워크 환경에서는 언제든 장애가 발생할 수 있으므로 Partition Tolerance(P)는 선택이 아닌 &lt;b&gt;전제 조건&lt;/b&gt;입니다.&lt;br&gt;따라서 CAP 이론을 적용할 때는 P를 기본으로 하고, 그 위에서 **C(일관성)**과 &lt;b&gt;A(가용성)&lt;/b&gt; 중 하나를 선택해야 합니다.&lt;br&gt;즉, CAP 이론은 &lt;b&gt;Partition 상황에서 가용성을 지킬 것인가, 일관성을 지킬 것인가&lt;/b&gt;를 설명하는 이론입니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2 CP (Consistency + Partition Tolerance)&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;CP 시스템은 Partition이 발생하면 응답을 멈추고, 노드 복구가 될 때까지 데이터 연산을 제한합니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;장점: 모든 노드의 데이터가 항상 일관성을 유지&lt;/li&gt;&lt;li&gt;단점: 일부 상황에서는 요청을 처리하지 못해 가용성이 낮아짐&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;etcd&lt;/b&gt; → 과반수 노드가 살아있지 않으면 읽기/쓰기를 모두 거부&lt;/li&gt;&lt;li&gt;&lt;b&gt;Zookeeper&lt;/b&gt; → 합의를 기반으로 동작하는 대표적인 CP 시스템&lt;/li&gt;&lt;/ul&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.3 AP (Availability + Partition Tolerance)&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;AP 시스템은 Partition이 발생해도 응답을 계속합니다. 장애 노드를 기다리지 않고 가용한 노드에서 요청을 처리합니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;장점: 빠른 응답, 높은 가용성&lt;/li&gt;&lt;li&gt;단점: 일관성이 일시적으로 깨질 수 있으며, 이후 동기화 과정이 필요&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;Cassandra&lt;/b&gt;, &lt;b&gt;DynamoDB&lt;/b&gt; → 네트워크 분리 상황에서도 가능한 한 응답을 제공&lt;/li&gt;&lt;/ul&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.4 CA (Consistency + Availability)&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;CA는 Partition을 고려하지 않는 조합입니다.&lt;br&gt;즉, 네트워크 단절이 &lt;b&gt;절대 발생하지 않는 환경&lt;/b&gt;을 전제로만 성립합니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;장점: 항상 일관성과 가용성을 모두 만족&lt;/li&gt;&lt;li&gt;단점: 현실의 분산 환경에서는 Partition을 배제할 수 없으므로 사실상 불가능&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;단일 노드 데이터베이스&lt;/li&gt;&lt;li&gt;네트워크 분리가 없는 &lt;b&gt;중앙 집중형 시스템&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;실제 분산 환경에서 CAP을 논할 때 CA는 주로 “이론적인 경우”로만 설명됩니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. PACELC&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 본 것처럼 CAP 이론은 &lt;b&gt;Partition이 발생했을 때 A와 C 중 무엇을 선택할 것인가&lt;/b&gt;만 설명합니다.&lt;br&gt;하지만 Partition이 없는 정상적인 상황에서는 어떤 trade-off가 존재하는지는 다루지 못합니다.&lt;br&gt;이를 보완하기 위해 나온 개념이 &lt;b&gt;PACELC 이론&lt;/b&gt;입니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;Partition이 있을 때 (P) → Availability(A) vs Consistency(C)&lt;/li&gt;&lt;li&gt;Partition이 없을 때 (Else) → Latency(L) vs Consistency(C)&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;즉, PACELC는 &lt;b&gt;네트워크 분리 상황뿐만 아니라, 정상 상황에서도 시스템이 지향하는 특성을 함께 설명&lt;/b&gt;합니다.&lt;br&gt;PACELC의 세부적인 분류와 예시는 다음 글에서 별도로 다뤄보겠습니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고 자료&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;위키백과. CAP theorem. &lt;a href=&quot;https://en.wikipedia.org/wiki/CAP_theorem&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://en.wikipedia.org/wiki/CAP_theorem&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
      <category>SRE(site reliability engineering)/개념</category>
      <category>CAP</category>
      <category>PACELC</category>
      <category>분산시스템</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/566</guid>
      <comments>https://codingpracticing.tistory.com/566#entry566comment</comments>
      <pubDate>Tue, 19 Aug 2025 23:30:20 +0900</pubDate>
    </item>
    <item>
      <title>Burp Suite - 프록시 설정</title>
      <link>https://codingpracticing.tistory.com/565</link>
      <description>&lt;h2 id=&quot;단서 질문 및 답변&quot; data-ke-size=&quot;size26&quot;&gt;단서 질문 및 답변&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp Suite란?&lt;/li&gt;
&lt;li&gt;프록시 서버란?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;핵심 요약&quot; data-ke-size=&quot;size26&quot;&gt;핵심 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp Suite는 프록시 서버를 통해서 웹브라우저의 요청을 중간에서 가로채거나 API 요청 캡처 등 다양한 보안 관련 기능을 제공한다.&lt;/li&gt;
&lt;li&gt;Burp Suite를 사용하기 위해선 웹브라우저가 Burp Suite의 프록시 서버를 사용하도록 설정해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;핵심 필기&quot; data-ke-size=&quot;size26&quot;&gt;핵심 필기&lt;/h2&gt;
&lt;h3 id=&quot;burp-suite&quot; data-ke-size=&quot;size23&quot;&gt;Burp Suite란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 전문가 혹은 보안 전문가들이 사용하는 도구 모음으로 다음과 같은 기능을 가진다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;API 요청 캡처&lt;/li&gt;
&lt;li&gt;Web Application crawling&lt;/li&gt;
&lt;li&gt;API fuzzing&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;프록시 서버 설정하기&quot; data-ke-size=&quot;size23&quot;&gt;프록시 서버 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Burp Suite를 실행하면 프록시 서버가 실행된다. 프록시 서버는 클라이언트와 서버 간에 발생하는 트래픽을 가로채거나 스누핑할 수 있다. 흔히 말하는 중간자(Man In the Middle) 역할을 수행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6dGsK/btsPDlz5r6O/fK4a0cG68ANCjkjGp92LQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6dGsK/btsPDlz5r6O/fK4a0cG68ANCjkjGp92LQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6dGsK/btsPDlz5r6O/fK4a0cG68ANCjkjGp92LQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6dGsK%2FbtsPDlz5r6O%2FfK4a0cG68ANCjkjGp92LQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1188&quot; height=&quot;268&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Burp Suite의 프록시 서버가 웹브라우저의 트래픽을 가로채기 위해선 &lt;b&gt;웹브라우저에서 프록시 서버 설정이 필요하다.&lt;/b&gt; Firefox나 Chrome 등 대부분의 웹브라우저는 별다른 확장 프로그램을 사용할 필요 없이 설정 메뉴에서 프록시 메뉴를 직접 설정할 수 있다. 하지만, &lt;b&gt;FoxyProxy와 같은 확장 도구를 사용하는 게 편리하다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A4ipY/btsPEDfEtzm/kRDOS2U5C3R5kUDcXuRs9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A4ipY/btsPEDfEtzm/kRDOS2U5C3R5kUDcXuRs9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A4ipY/btsPEDfEtzm/kRDOS2U5C3R5kUDcXuRs9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA4ipY%2FbtsPEDfEtzm%2FkRDOS2U5C3R5kUDcXuRs9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;468&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Foxy Proxy를 사용하면 프록시 서버 설정을 간단하게 켰다 끌 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;foxy-proxy&quot; data-ke-size=&quot;size23&quot;&gt;Foxy Proxy 설정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjA7bI/btsPCkBSIJM/5CKvpGX6UHBVxxB1GOGk20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjA7bI/btsPCkBSIJM/5CKvpGX6UHBVxxB1GOGk20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjA7bI/btsPCkBSIJM/5CKvpGX6UHBVxxB1GOGk20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjA7bI%2FbtsPCkBSIJM%2F5CKvpGX6UHBVxxB1GOGk20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1227&quot; height=&quot;524&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;기본적으로 Burp Suite의 프록시 서버는 로컬호스트의 8080 포트를 사용한다.&lt;br /&gt;따라서, Foxy Proxy 설정을 127.0.0.1:8080으로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프록시 서버를 설정했으니 google.com에 접속해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRKizo/btsPCm7tWRg/i4edbopgWJZwPoED4ESe21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRKizo/btsPCm7tWRg/i4edbopgWJZwPoED4ESe21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRKizo/btsPCm7tWRg/i4edbopgWJZwPoED4ESe21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRKizo%2FbtsPCm7tWRg%2Fi4edbopgWJZwPoED4ESe21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;560&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;프록시 서버를 설정하니 google.com에 접속이 불가능해졌다. 에러 메시지를 보면 PortSwigger CA 때문에 이슈가 발생했다고 나온다. 왜 이런 일이 발생할까?&lt;/p&gt;
&lt;h3 id=&quot;burp-suite-1&quot; data-ke-size=&quot;size23&quot;&gt;웹브라우저는 Burp Suite의 인증서를 신뢰하지 않는다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LS4Dh/btsPEDmqctd/KdK5VhJtYRXcA8PZyAfBwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LS4Dh/btsPEDmqctd/KdK5VhJtYRXcA8PZyAfBwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LS4Dh/btsPEDmqctd/KdK5VhJtYRXcA8PZyAfBwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLS4Dh%2FbtsPEDmqctd%2FKdK5VhJtYRXcA8PZyAfBwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;694&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;프록시 서버를 사용하지 않는 경우,&lt;/b&gt; 웹 브라우저는 직접 서버와 TLS 핸드셰이크를 수행하며 이 과정에서 서버가 제공하는 인증서를 전달 받는다. 브라우저는 해당 인증서가 신뢰할 수 있는 CA(Certificate Authority)에서 발급 받은 것인지 검증한다. 그렇다면 프록시 서버를 사용하면 이 과정이 어떻게 변할까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YBdVp/btsPDaMfx9R/g06wZSgdriIc1JNXXpU2Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YBdVp/btsPDaMfx9R/g06wZSgdriIc1JNXXpU2Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YBdVp/btsPDaMfx9R/g06wZSgdriIc1JNXXpU2Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYBdVp%2FbtsPDaMfx9R%2Fg06wZSgdriIc1JNXXpU2Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1137&quot; height=&quot;503&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;정답은 &lt;b&gt;사용자와 프록시 서버 사이에 TLS 핸드셰이크가 발생&lt;/b&gt;하고 이 과정에서 프록시 서버가 전달한 인증서를 브라우저가 검증한다. 하지만 기본적으로 &lt;b&gt;웹브라우저는 Burp Suite가 사용하는 PortSwigger CA를 신뢰하지 않는다.&lt;/b&gt; 따라서, Burp Suite의 루트 인증서(PortSwigger CA)를 브라우저의 신뢰 목록에 등록해야 한다.&lt;/p&gt;
&lt;h3 id=&quot;fire-fox-burp-suite-ca&quot; data-ke-size=&quot;size23&quot;&gt;FireFox에 Burp Suite CA 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firefox에서 Burp Suite의 인증서를 추가하겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpyMZ/btsPCQ8kzrX/ICzek0FHvspa6iRR2AXGok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpyMZ/btsPCQ8kzrX/ICzek0FHvspa6iRR2AXGok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpyMZ/btsPCQ8kzrX/ICzek0FHvspa6iRR2AXGok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtpyMZ%2FbtsPCQ8kzrX%2FICzek0FHvspa6iRR2AXGok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1330&quot; height=&quot;747&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FireFox의 설정으로 들어가서 보안 설정으로 들어간다.&lt;/li&gt;
&lt;li&gt;밑으로 쭉 내리면 인증서 구간이 나온다.&lt;/li&gt;
&lt;li&gt;인증서 보기를 클릭하면 위처럼 현재 웹브라우저에서 신뢰하는 CA 목록이 나온다.&lt;/li&gt;
&lt;li&gt;Import를 누르면 인증서를 추가할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1345&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7PStJ/btsPC7IQPtZ/fFhUqesdz845wjY4bdQUGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7PStJ/btsPC7IQPtZ/fFhUqesdz845wjY4bdQUGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7PStJ/btsPC7IQPtZ/fFhUqesdz845wjY4bdQUGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7PStJ%2FbtsPC7IQPtZ%2FfFhUqesdz845wjY4bdQUGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1345&quot; height=&quot;747&quot; data-origin-width=&quot;1345&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;5. 위처럼 해당 CA를 신뢰한다고 설정하면 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Burp Suite 인증서 신뢰 설정을 끝냈으니 다시 google.com에 접속해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;767&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciMsOQ/btsPBKHLts5/kK6wXkMpy9A1hnLANqXk5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciMsOQ/btsPBKHLts5/kK6wXkMpy9A1hnLANqXk5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciMsOQ/btsPBKHLts5/kK6wXkMpy9A1hnLANqXk5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciMsOQ%2FbtsPBKHLts5%2FkK6wXkMpy9A1hnLANqXk5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1524&quot; height=&quot;767&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;767&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;제대로 접속되는 걸 볼 수 있다. 이제 인증서를 자세히 들여다 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEikbW/btsPDccftbR/3O05g5sSwZtwNXG9D9QKg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEikbW/btsPDccftbR/3O05g5sSwZtwNXG9D9QKg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEikbW/btsPDccftbR/3O05g5sSwZtwNXG9D9QKg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEikbW%2FbtsPDccftbR%2F3O05g5sSwZtwNXG9D9QKg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;543&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;프록시 서버를 사용하지 않고 직접 google.com에 요청하면, 서버는 Google Trust Services에서 발급 받은 인증서를 전달한다. 이 인증서는 웹브라우저에 기본적으로 등록된 신뢰할 수 있는 CA가 서명한 것이므로 별다른 경고 없이 정상적으로 HTTPS 통신이 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, Burp Suite의 프록시 서버를 거쳐 같은 요청을 보내면 브라우저가 받는 인증서는 PortSwigger CA에서 발급 받은 인증서다. 이 CA는 방금 직접 우리가 브라우저에 등록해둔 루트 인증서로 신뢰 목록에 추가했기 때문에 브라우저가 해당 인증서를 유효한 것으로 판단하고 안전하게 통신을 허용하게 된다.&lt;/p&gt;
&lt;h3 id=&quot;burp-suite-intercept&quot; data-ke-size=&quot;size23&quot;&gt;Burp Suite로 트래픽 Intercept하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd62sK/btsPD0IV364/GnVH6pbxiDrIXMKZTQv7l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd62sK/btsPD0IV364/GnVH6pbxiDrIXMKZTQv7l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd62sK/btsPD0IV364/GnVH6pbxiDrIXMKZTQv7l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd62sK%2FbtsPD0IV364%2FGnVH6pbxiDrIXMKZTQv7l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1518&quot; height=&quot;484&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제 Burp Suite에서 Intercept를 키면 요청을 가로챌 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;참고 자료&quot; data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://portswigger.net/burp/documentation/desktop/external-browser-config/certificate&quot;&gt;Installing Burp's CA Certificate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>--------------보안--------------/Burp Suite</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/565</guid>
      <comments>https://codingpracticing.tistory.com/565#entry565comment</comments>
      <pubDate>Wed, 30 Jul 2025 14:24:49 +0900</pubDate>
    </item>
    <item>
      <title>AWS Lambda 503 Server Error: Service Unavailable for url</title>
      <link>https://codingpracticing.tistory.com/564</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 상황&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;구름 3조 - finguard 아키텍처-페이지-8.drawio.png&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Anuoh/btsPs0RGp0v/Uutvtv2rmDkPkyXgzax3rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Anuoh/btsPs0RGp0v/Uutvtv2rmDkPkyXgzax3rk/img.png&quot; data-alt=&quot;부하테스트 중에&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Anuoh/btsPs0RGp0v/Uutvtv2rmDkPkyXgzax3rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAnuoh%2FbtsPs0RGp0v%2FUutvtv2rmDkPkyXgzax3rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1904&quot; height=&quot;515&quot; data-filename=&quot;구름 3조 - finguard 아키텍처-페이지-8.drawio.png&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부하테스트 중에&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부하 테스트를 위해 &lt;b&gt;Locust&lt;/b&gt;를 사용하여 서비스에 트래픽을 유입시켰고, 다음과 같은 문제가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RPS 30 ~ 40 수준에서 HTTP 503 Service Unavailable 에러가 반복적으로 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 평균 응답 속도는 약 300ms로 정상 범위 내에 있었음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;추측&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot from 2025-07-23 11-03-45.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k02ky/btsPuZ4xYGK/EEhxlOVGrxIZltnLijjnlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k02ky/btsPuZ4xYGK/EEhxlOVGrxIZltnLijjnlk/img.png&quot; data-alt=&quot;503 에러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k02ky/btsPuZ4xYGK/EEhxlOVGrxIZltnLijjnlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk02ky%2FbtsPuZ4xYGK%2FEEhxlOVGrxIZltnLijjnlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;439&quot; data-filename=&quot;Screenshot from 2025-07-23 11-03-45.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;503 에러&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 503 에러는 일반적으로 다음과 같은 상황에서 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버가 유지보수 중이거나 다운됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버가 과부하 상태로 더 이상 요청을 처리할 수 없음&lt;/p&gt;
&lt;p data-end=&quot;588&quot; data-start=&quot;405&quot; data-ke-size=&quot;size16&quot;&gt;우리 서비스는 AWS Lambda 기반의 서버리스 아키텍처로 구성되어 있어, &lt;b&gt;트래픽 증가 시 자동으로 함수 인스턴스가 확장되며 요청을 처리해야 한다.&lt;/b&gt;&lt;br /&gt;그런데도 503 에러가 발생했다는 것은, &lt;b&gt;Lambda 함수의 동시 실행 수가 제한되어 있고, 해당 제한에 도달했을 가능성이 높다&lt;/b&gt;고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;648&quot; data-start=&quot;607&quot; data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;CloudWatch에서 Lambda 동시성 지표 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot from 2025-07-23 11-00-05.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKuntI/btsPuYEzZxS/sxVWCl0cg9FG6CE6vIzIt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKuntI/btsPuYEzZxS/sxVWCl0cg9FG6CE6vIzIt1/img.png&quot; data-alt=&quot;Lambda 함수의 동시성 지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKuntI/btsPuYEzZxS/sxVWCl0cg9FG6CE6vIzIt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKuntI%2FbtsPuYEzZxS%2FsxVWCl0cg9FG6CE6vIzIt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1654&quot; height=&quot;813&quot; data-filename=&quot;Screenshot from 2025-07-23 11-00-05.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;813&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda 함수의 동시성 지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 &lt;b&gt;ConcurrentExecutions&lt;/b&gt; 메트릭을 확인해보니, &lt;b&gt;동시 실행 수가 정확히 10에서 멈춰 있다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;779&quot; data-start=&quot;752&quot; data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;Lambda 함수 설정에서 동시성 제한 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;구름 3조 - finguard 아키텍처-페이지-8.drawio(2).png&quot; data-origin-width=&quot;1505&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sVS5R/btsPuMj42EE/sqixXtcowwToCC0iVwmah0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sVS5R/btsPuMj42EE/sqixXtcowwToCC0iVwmah0/img.png&quot; data-alt=&quot;Lambda 함수가 최대 동시성이 10이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sVS5R/btsPuMj42EE/sqixXtcowwToCC0iVwmah0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsVS5R%2FbtsPuMj42EE%2FsqixXtcowwToCC0iVwmah0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1505&quot; height=&quot;206&quot; data-filename=&quot;구름 3조 - finguard 아키텍처-페이지-8.drawio(2).png&quot; data-origin-width=&quot;1505&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda 함수가 최대 동시성이 10이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Lambda 함수는 Reserved Concurrency를 사용하지 않고, Unreserved Concurrency를&amp;nbsp;사용 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, &lt;b&gt;예약되지 않은 계정 동시성이 10밖에 되지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;940&quot; data-start=&quot;911&quot; data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;Service Quotas 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CwIq0/btsPuE7GgAf/6sgxGNaZ9L4TeHM7MGAXX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CwIq0/btsPuE7GgAf/6sgxGNaZ9L4TeHM7MGAXX1/img.png&quot; data-alt=&quot;AWS 콘솔 &amp;amp;gt; Service Quotas &amp;amp;gt; Lambda &amp;amp;gt; Concurrent executions 항목을 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CwIq0/btsPuE7GgAf/6sgxGNaZ9L4TeHM7MGAXX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCwIq0%2FbtsPuE7GgAf%2F6sgxGNaZ9L4TeHM7MGAXX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1468&quot; height=&quot;501&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS 콘솔 &amp;gt; Service Quotas &amp;gt; Lambda &amp;gt; Concurrent executions 항목을 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정 전체에 허용된 동시성 한도가 &lt;b&gt;기본값인 1000이 아닌 10으로 설정되어 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;Lambda 확장 한계에 도달하여 더 이상 확장이 불가능했고, 이로 인해 503 에러가 발생했다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceU0lA/btsPtAydvto/SOoVQ23owG83hKR6rdoHkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceU0lA/btsPtAydvto/SOoVQ23owG83hKR6rdoHkK/img.png&quot; data-alt=&quot;Lambda 함수 동시성 제한 상향 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceU0lA/btsPtAydvto/SOoVQ23owG83hKR6rdoHkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceU0lA%2FbtsPtAydvto%2FSOoVQ23owG83hKR6rdoHkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1481&quot; height=&quot;506&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda 함수 동시성 제한 상향 요청&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 콘솔에서 Lambda 동시성 제한 상향 요청을 제출하여 최대 동시성을 1000으로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAUTw/btsPvgE0yeK/nXeYIaK5K1hQ0tsk5DhNF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAUTw/btsPvgE0yeK/nXeYIaK5K1hQ0tsk5DhNF1/img.png&quot; data-alt=&quot;Lambda 확장 요청이 완료됐단 이메일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAUTw/btsPvgE0yeK/nXeYIaK5K1hQ0tsk5DhNF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAUTw%2FbtsPvgE0yeK%2FnXeYIaK5K1hQ0tsk5DhNF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;220&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda 확장 요청이 완료됐단 이메일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3시간쯤 지나서 요청이 처리됐단 이메일이 도착했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1671&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1VAar/btsPt5dFUeq/nvNPkmDbnpkkTD5Z0zkQq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1VAar/btsPt5dFUeq/nvNPkmDbnpkkTD5Z0zkQq1/img.png&quot; data-alt=&quot;Lambda가 동시에 12개까지 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1VAar/btsPt5dFUeq/nvNPkmDbnpkkTD5Z0zkQq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1VAar%2FbtsPt5dFUeq%2FnvNPkmDbnpkkTD5Z0zkQq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1671&quot; height=&quot;812&quot; data-origin-width=&quot;1671&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda가 동시에 12개까지 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7NV09/btsPt1PU1EY/Ia4n8kUtcI9mf6U1Txt0n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7NV09/btsPt1PU1EY/Ia4n8kUtcI9mf6U1Txt0n1/img.png&quot; data-alt=&quot;처음과 동일한 부하 테스트 실행 시에도 에러가 발생하지 않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7NV09/btsPt1PU1EY/Ia4n8kUtcI9mf6U1Txt0n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7NV09%2FbtsPt1PU1EY%2FIa4n8kUtcI9mf6U1Txt0n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;248&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;처음과 동일한 부하 테스트 실행 시에도 에러가 발생하지 않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 다시 부하테스트를 시도했을 때, 최대 동시성이 12까지 도달했으며 에러가 발생하지 않았다.&lt;/p&gt;</description>
      <category>AWS/트러블슈팅</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/564</guid>
      <comments>https://codingpracticing.tistory.com/564#entry564comment</comments>
      <pubDate>Wed, 23 Jul 2025 12:00:25 +0900</pubDate>
    </item>
    <item>
      <title>Kubernetes The connection to the server [IP] was refused 트러블슈팅</title>
      <link>https://codingpracticing.tistory.com/563</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;kube-apiserver에 접근이 안되는 문제가 발생해서 트러블 슈팅을 기록으로 남긴다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;err=&quot;couldn't get current server API group list: Get \&quot;http://localhost:8080/api?timeout=32s&quot;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NrcB4/btsPoQ7hGzc/UxzWIyBVqiNQzaT8ADqxd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NrcB4/btsPoQ7hGzc/UxzWIyBVqiNQzaT8ADqxd0/img.png&quot; data-alt=&quot;error 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NrcB4/btsPoQ7hGzc/UxzWIyBVqiNQzaT8ADqxd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNrcB4%2FbtsPoQ7hGzc%2FUxzWIyBVqiNQzaT8ADqxd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;436&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;error 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 상황:&lt;/b&gt; kubectl 명령어 실행 시에 localhost:8080과 연결 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인:&lt;/b&gt; ~/.kube/config 파일 존재하지 않거나 빈 값(kubectl config view를 통해 설정값 확인 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 방법:&lt;/b&gt; /etc/kubernetes/admin.conf 파일을 ~/.kube/config로 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 kubectl 명령어는 ~/.kube/config 파일을 설정 값으로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;~/.kube/config 파일엔 kube-apiserver의 엔드포인트나 클러스터 접근을 위한 인증서 등 클러스터 사용을 위한 정보가 들어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 만약, ~/.kube/config 파일이 없다면 kubectl 명령어는 기본 경로를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 사용되는 기본 경로가 localhost:8080이다. 이는 kubernetes 깃허브 소스 코드에서 직접 확인 가능하다.&lt;/p&gt;
&lt;figure id=&quot;og_1752775188025&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;client-go/tools/clientcmd/client_config.go at a21e7a8bf0d6c98bb9652fb45e48cb8de15392b4 &amp;middot; kubernetes/client-go&quot; data-og-description=&quot;Go client for Kubernetes. Contribute to kubernetes/client-go development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kubernetes/client-go/blob/a21e7a8bf0d6c98bb9652fb45e48cb8de15392b4/tools/clientcmd/client_config.go#L56&quot; data-og-url=&quot;https://github.com/kubernetes/client-go/blob/a21e7a8bf0d6c98bb9652fb45e48cb8de15392b4/tools/clientcmd/client_config.go&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FgRdq/hyZnfP90dQ/VNGhQWTd3ikuxSfvZD0CIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/b8l5XP/hyZnAUdCsX/KJJ9z87StHNhqKIlzjoC60/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/kubernetes/client-go/blob/a21e7a8bf0d6c98bb9652fb45e48cb8de15392b4/tools/clientcmd/client_config.go#L56&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kubernetes/client-go/blob/a21e7a8bf0d6c98bb9652fb45e48cb8de15392b4/tools/clientcmd/client_config.go#L56&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FgRdq/hyZnfP90dQ/VNGhQWTd3ikuxSfvZD0CIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/b8l5XP/hyZnAUdCsX/KJJ9z87StHNhqKIlzjoC60/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;client-go/tools/clientcmd/client_config.go at a21e7a8bf0d6c98bb9652fb45e48cb8de15392b4 &amp;middot; kubernetes/client-go&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Go client for Kubernetes. Contribute to kubernetes/client-go development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byPegC/btsPnnZPDae/zP3Q9h1ksnicmBijZBfXz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byPegC/btsPnnZPDae/zP3Q9h1ksnicmBijZBfXz0/img.png&quot; data-alt=&quot;환경변수가 없으면 localhost:8080을 기본 서버 주소로 반환한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byPegC/btsPnnZPDae/zP3Q9h1ksnicmBijZBfXz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyPegC%2FbtsPnnZPDae%2FzP3Q9h1ksnicmBijZBfXz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;895&quot; height=&quot;514&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경변수가 없으면 localhost:8080을 기본 서버 주소로 반환한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;err=&quot;couldn't get current server API group list: Get \&quot;&lt;a href=&quot;https://cp.cluster.local:6443/api?timeout=32s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cp.cluster.local:6443/api?timeout=32s&lt;/a&gt;\&quot;:&amp;nbsp;dial&amp;nbsp;tcp&amp;nbsp;192.168.56.10:6443:&amp;nbsp;connect:&amp;nbsp;connection&amp;nbsp;refused&quot;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 상황:&lt;/b&gt; kubectl 명령어 실행 시에 kube-apiserver와 연결 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인:&lt;/b&gt; 위 오류를 유발하는 원인은 굉장히 많다.(DNS lookup실패, iptables Deny, 인증서 문제 등) 이번 경우엔 kubelet 설정값 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 방법:&lt;/b&gt; kubelet conf값 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;트러블슈팅:&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. kube-apiserver 실행 여부 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSRW5D/btsPn2t3jC1/NqbRB5t4hBli4ov68pBK91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSRW5D/btsPn2t3jC1/NqbRB5t4hBli4ov68pBK91/img.png&quot; data-alt=&quot;kube-apiserver 실행 여부 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSRW5D/btsPn2t3jC1/NqbRB5t4hBli4ov68pBK91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSRW5D%2FbtsPn2t3jC1%2FNqbRB5t4hBli4ov68pBK91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1437&quot; height=&quot;137&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kube-apiserver 실행 여부 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 실행 중인 컨테이너를 확인해봤다. kube-apiserver가 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. /etc/kubernetes/manifests 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubelet은 kube-apiserver와 통신할 필요 없이 kubelet이 직접 실행하는 pod들이 존재한다. 이를 static pod(정적 파드)라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static pod는 kubelet이 알아서 실행하므로 따로 명령어를 실행하거나 할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, static pod가 실행되지 않았으므로 해당 경로에 제대로 yaml 파일들이 존재하는지 확인해보겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IJTrP/btsPnt6CXRc/CHjdLwQt0uZCeWZX2Qh8Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IJTrP/btsPnt6CXRc/CHjdLwQt0uZCeWZX2Qh8Qk/img.png&quot; data-alt=&quot;파일들은 설정되어 있다. 그런데, 컨테이너를 생성하진 않는다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IJTrP/btsPnt6CXRc/CHjdLwQt0uZCeWZX2Qh8Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIJTrP%2FbtsPnt6CXRc%2FCHjdLwQt0uZCeWZX2Qh8Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;956&quot; height=&quot;274&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일들은 설정되어 있다. 그런데, 컨테이너를 생성하진 않는다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static pod를 위한 yaml파일들이 설정된 상태지만 어째서인지 컨테이너들이 실행되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 그러면 컨테이너 실행의 주체인 kubelet의 상태를 확인할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. kubelet 실행 여부 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static pod가 설정되어 있더라도 해당 yaml을 컨테이너로 만드는 건 kubelet의 역할이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubelet이 일을 안하고 있을 확률이 높다. systemctl 커맨드로 상태를 확인해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf9QCX/btsPpdH5M6S/4N3krHTH4JuHNaC8UUVlDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf9QCX/btsPpdH5M6S/4N3krHTH4JuHNaC8UUVlDk/img.png&quot; data-alt=&quot;kubelet은 잘 실행 중이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf9QCX/btsPpdH5M6S/4N3krHTH4JuHNaC8UUVlDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf9QCX%2FbtsPpdH5M6S%2F4N3krHTH4JuHNaC8UUVlDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1324&quot; height=&quot;356&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kubelet은 잘 실행 중이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubelet은 잘 실행 중이다. 잘 실행 중이므로 이제 로그를 직접 확인하는 방법만 남았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. journalctl로 kubelet 로그 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uAKAv/btsPng7r7Ld/jDGknnOt6qMWlz9A0crTcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uAKAv/btsPng7r7Ld/jDGknnOt6qMWlz9A0crTcK/img.png&quot; data-alt=&quot;journalctl을 통해 kubelet의 로그를 추적&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uAKAv/btsPng7r7Ld/jDGknnOt6qMWlz9A0crTcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuAKAv%2FbtsPng7r7Ld%2FjDGknnOt6qMWlz9A0crTcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1907&quot; height=&quot;78&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;journalctl을 통해 kubelet의 로그를 추적&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 로그를 보면 static pod의 경로가 /etc/kubernetes/manisfests가 아닌 /etc/kubernetes/manisfests2를 사용함을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, kubelet의 설정 값이 잘못됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. kubelet 설정 파일 찾기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 한 번 systemctl status kubelet을 통해서 kubelet이 어떤 설정 파일을 사용하는지 확인하겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTpeHC/btsPnHKgqom/infSFav6q7NOgtwm36Rga0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTpeHC/btsPnHKgqom/infSFav6q7NOgtwm36Rga0/img.png&quot; data-alt=&quot;kubelet 실행에 쓰이는 설정 파일들이 나열된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTpeHC/btsPnHKgqom/infSFav6q7NOgtwm36Rga0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTpeHC%2FbtsPnHKgqom%2FinfSFav6q7NOgtwm36Rga0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1885&quot; height=&quot;335&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kubelet 실행에 쓰이는 설정 파일들이 나열된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 설정값 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GUxps/btsPoqVrZ4C/eeT7AJRLyCq5AKGVs1NM21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GUxps/btsPoqVrZ4C/eeT7AJRLyCq5AKGVs1NM21/img.png&quot; data-alt=&quot;잘못된 설정 값 발견&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GUxps/btsPoqVrZ4C/eeT7AJRLyCq5AKGVs1NM21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGUxps%2FbtsPoqVrZ4C%2FeeT7AJRLyCq5AKGVs1NM21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;335&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘못된 설정 값 발견&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/kubernetes/manifests가 아닌 /etc/kubernetes/manifests2로 설정되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정하고 kubelet을 재시작하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. 재시작 후 컨테이너 실행 결과 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1847&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rkK1L/btsPnZKPs4t/qblFm3sssUVYvns8Wy6LUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rkK1L/btsPnZKPs4t/qblFm3sssUVYvns8Wy6LUk/img.png&quot; data-alt=&quot;컨테이너가 제대로 실행된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rkK1L/btsPnZKPs4t/qblFm3sssUVYvns8Wy6LUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrkK1L%2FbtsPnZKPs4t%2FqblFm3sssUVYvns8Wy6LUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1847&quot; height=&quot;387&quot; data-origin-width=&quot;1847&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컨테이너가 제대로 실행된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. kubectl 명령 실행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vDlWy/btsPmv49HFK/emXnOc0J09tR4r7wWC1Lb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vDlWy/btsPmv49HFK/emXnOc0J09tR4r7wWC1Lb0/img.png&quot; data-alt=&quot;kubectl 명령어 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vDlWy/btsPmv49HFK/emXnOc0J09tR4r7wWC1Lb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvDlWy%2FbtsPmv49HFK%2FemXnOc0J09tR4r7wWC1Lb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1257&quot; height=&quot;284&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kubectl 명령어 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl 명령어가 잘 실행된다. 현재 worker 노드가 없어 taint로 인해 nginx가 스케쥴링 되진 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Kubernetes/트러블슈팅</category>
      <category>kubernetes</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/563</guid>
      <comments>https://codingpracticing.tistory.com/563#entry563comment</comments>
      <pubDate>Fri, 18 Jul 2025 03:16:37 +0900</pubDate>
    </item>
    <item>
      <title>AWS self managed kubernetes 구축 아이디어</title>
      <link>https://codingpracticing.tistory.com/562</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Custom Controller 기반 Cluster Autoscaling&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unschedulable 이벤트가 발생하면 custom controller 또는 watcher가 이를 감지(현재 트래픽 기반으로 추가 개수 설정)&lt;/li&gt;
&lt;li&gt;AWS CLI 또는 SDK를 통해 EC2 인스턴스를 생성 (Auto Scaling Group 또는 직접)&lt;/li&gt;
&lt;li&gt;EC2는 User Data를 통해 kubeadm join을 자동 실행하여 클러스터에 등록&lt;/li&gt;
&lt;li&gt;Pod가 정상적으로 스케줄됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고려사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubeadm join을 어떤 방식으로 구성할 것인지 결정 필요
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인증서 기반: /etc/kubernetes/pki를 S3 등에 저장 &amp;rarr; 보안 문제 발생 가능성&lt;/li&gt;
&lt;li&gt;토큰 기반: kubeadm token create &amp;rarr; EC2 인스턴스에 안전하게 전달하는 방식 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;토큰 만료 방지 (장기 토큰 또는 주기적 재발급 필요)&lt;/li&gt;
&lt;li&gt;EC2 생성 후 ALB Target Group에 자동 등록 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. kubeadm 환경에서 AWS Load Balancer Controller 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ingress 리소스를 감시하여 ALB 생성, 삭제, Target Group 생성 및 자동 관리&lt;/li&gt;
&lt;li&gt;EC2 오토스케일링 시 새로운 노드가 Target Group에 자동 등록됨&lt;/li&gt;
&lt;li&gt;Pod 단위 IAM 역할 부여는 불가능하므로 EC2 Role에 의존해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필요 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Controller Pod가 사용할 수 있는 AWS IAM 권한
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 Instance Profile 또는 IRSA equivalent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Helm 또는 manifest를 이용한 aws-load-balancer-controller 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Pod 단위 IAM Role이 불가능하므로 Node Pool + Namespace 분리 전략&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IAM Role을 기능별로 나누고, Node Pool을 그에 따라 분리 (예: S3 접근용, RDS 접근용)&lt;/li&gt;
&lt;li&gt;Pod에는 NodeAffinity와 toleration 설정을 통해 특정 Node에만 배치&lt;/li&gt;
&lt;li&gt;네임스페이스를 기반으로 RBAC 및 네트워크를 분리하여 보안성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;효과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 IAM Role이 모든 Pod에 공유되는 구조에서 최소 권한 원칙 일부 유지 가능&lt;/li&gt;
&lt;li&gt;IRSA를 사용할 수 없는 kubeadm 환경에서 현실적인 권한 분리 수단&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Ingress 기반 서비스 분리 (검색, 주문 등)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ingress 리소스를 path 또는 host 기반으로 구성하여 여러 서비스로 라우팅&lt;/li&gt;
&lt;li&gt;ALB 도메인을 통해 외부 요청 수신&lt;/li&gt;
&lt;li&gt;각 요청은 Ingress Controller를 통해 Kubernetes Service로 전달&lt;/li&gt;
&lt;li&gt;Service는 Pod의 IP가 유동적이더라도 안정적인 라우팅을 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 개념&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pod IP는 유동적이지만, Service가 이를 추상화하여 항상 접근 가능하게 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. VPC CNI 기반 target-type: ip와 kubeadm 구조 비교&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubeadm 환경에서는 ALB &amp;rarr; NodePort &amp;rarr; kube-proxy &amp;rarr; Pod 구조로 hop 수가 많음&lt;/li&gt;
&lt;li&gt;EKS에서 VPC CNI를 사용하면 Pod에 직접 ENI가 부여되어 ALB가 바로 Pod로 트래픽 전달 (hop이 적고 성능이 좋음)&lt;/li&gt;
&lt;li&gt;kubeadm에서는 이 구조가 구현 불가능하므로, 성능 민감한 서비스는 노드 배치 최적화가 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배치 최적화 예시&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서로 자주 호출하는 서비스는 동일 노드 또는 동일 가용 영역에 배치&lt;/li&gt;
&lt;li&gt;NodeAffinity, TopologySpreadConstraints 등을 활용하여 네트워크 hop 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. kubeflow 기반 재학습 파이프라인 구축&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 파이프라인이 없어 재학습이 안됨.&lt;/li&gt;
&lt;li&gt;kubeflow 사용하여 지속적 학습 구축&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필요 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubeflow 설치 시에 istio가 필수&lt;/li&gt;
&lt;li&gt;인스턴스 크기: 최소 xlarge&lt;/li&gt;
&lt;li&gt;인스턴스 개수: 최소 xlarge&lt;/li&gt;
&lt;li&gt;taint나 nodeaffinity 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고려사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 수집 방법&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s3 -&amp;gt; lambda -&amp;gt; SQS -&amp;gt; lambda -&amp;gt; kubeflow&lt;/li&gt;
&lt;li&gt;s3 -&amp;gt; lambda -&amp;gt; SQS -&amp;gt; kubeflow polling&amp;nbsp;&lt;/li&gt;
&lt;li&gt;s3 -&amp;gt; kinesis -&amp;gt; kubeflow(실시간성, 제일 비쌈)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/562</guid>
      <comments>https://codingpracticing.tistory.com/562#entry562comment</comments>
      <pubDate>Wed, 16 Jul 2025 21:55:06 +0900</pubDate>
    </item>
    <item>
      <title>AWS fcm 병목 지점 찾기</title>
      <link>https://codingpracticing.tistory.com/561</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 상황&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;저희 팀 프로젝트는 사기 의심 거래가 발생하면 FCM을 통해 사용자에게 알림을 보내도록 설계했습니다.&lt;br&gt;이제 첫 테스트를 하는 중인데 첫 번째 알림 발송까지 무려 33초가 걸렸습니다.&lt;br&gt;아래는 CloudWatch Log insights를 통해 추출한 로그입니다.&lt;/p&gt;&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[
    {
        &quot;@timestamp&quot;: &quot;2025-07-09 08:50:41.765&quot;,
        &quot;@log&quot;: &quot;secret:/aws/lambda/FinGuard-Backend-dev-createTransaction&quot;
    },
    {
        &quot;@timestamp&quot;: &quot;2025-07-09 08:51:14.996&quot;,
        &quot;@log&quot;: &quot;secret:/aws/lambda/sns-receive-and-send-fcm&quot;
    }
]&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;거래 발생 → FCM 발송 사이까지 걸린 시간이 무려 33초입니다.&lt;br&gt;트래픽이 없던 상황임에도 이 정도의 지연은 비정상적입니다.&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 원인 추측&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;추측1. Cold Start&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;서버리스 아키텍처이므로 Lambda의 Cold Start로 인한 지연 문제일 가능성이 있습니다.&lt;br&gt;Init Duration에 얼마나 많은 시간이 소요 되는 지 확인해보겠습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;CloudWatch Log Insights&lt;/b&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VHdU1/btsPcU22U0m/o5O72ccjYO6qxkMK7wM4sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VHdU1/btsPcU22U0m/o5O72ccjYO6qxkMK7wM4sk/img.png&quot; data-alt=&quot;CloudWatch Log Insights에서 로그를 쿼리할 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VHdU1/btsPcU22U0m/o5O72ccjYO6qxkMK7wM4sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVHdU1%2FbtsPcU22U0m%2Fo5O72ccjYO6qxkMK7wM4sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1812&quot; height=&quot;555&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CloudWatch Log Insights에서 로그를 쿼리할 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;아래는 Init Duration의 평균, 최대, 최소 시간 쿼리문입니다.&lt;/p&gt;&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;fields @timestamp, @message
| filter @message like /Init Duration/
| parse @message /Init Duration: (?&amp;lt;init_duration&amp;gt;[0-9.]+) ms/
| stats     
    count() as cold_starts,    
    avg(init_duration) as avg_init_ms,    
    max(init_duration) as max_init_ms,    
    min(init_duration) as min_init_ms&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGQAT/btsPbJIqyi7/PEGLhlnhBR7ZBAyDLEPRnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGQAT/btsPbJIqyi7/PEGLhlnhBR7ZBAyDLEPRnk/img.png&quot; data-alt=&quot;Init Duration 로그 집계 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGQAT/btsPbJIqyi7/PEGLhlnhBR7ZBAyDLEPRnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGQAT%2FbtsPbJIqyi7%2FPEGLhlnhBR7ZBAyDLEPRnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1415&quot; height=&quot;323&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Init Duration 로그 집계 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 다음과 같습니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;평균 시간: 782ms&lt;/li&gt;&lt;li&gt;최대 시간: 1550ms&lt;/li&gt;&lt;li&gt;최소 시간: 68ms&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, Cold Start는 아무리 길어도 2초를 넘지 않습니다.&lt;/b&gt;&lt;br&gt;최악의 경우를 가정해도 총합해서 걸리는 시간은 1550ms * 3(Lambda 개수) = 4.65초 수준입니다.&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;추측2. Lambda 타임아웃으로 인한 SQS 메시지 재처리&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 확인해보면, SQS 메시지를 처리하던 Lambda가 실패한 뒤 약 24초 후(Lambda 타임아웃 시간 포함 30초)에 다시 실행되는 현상을 확인할 수 있습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nRqKh/btsPa0c4Zjf/Ur0wHdJrxJhfYlTIcmggFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nRqKh/btsPa0c4Zjf/Ur0wHdJrxJhfYlTIcmggFK/img.png&quot; data-alt=&quot;실행에 실패한 Lambda가 다시 시작된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nRqKh/btsPa0c4Zjf/Ur0wHdJrxJhfYlTIcmggFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnRqKh%2FbtsPa0c4Zjf%2FUr0wHdJrxJhfYlTIcmggFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1221&quot; height=&quot;93&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행에 실패한 Lambda가 다시 시작된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 30초라는 시간은 바로 SQS의 기본 Visibility Timeout(가시성 제한 시간) 때문입니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbv3Se/btsPaO4SWcl/ke5MdkWhrKHuj1kJJzFMM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbv3Se/btsPaO4SWcl/ke5MdkWhrKHuj1kJJzFMM0/img.png&quot; data-alt=&quot;SQS 메시지 가시성 제한 시간은 기본 30초다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbv3Se/btsPaO4SWcl/ke5MdkWhrKHuj1kJJzFMM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbv3Se%2FbtsPaO4SWcl%2Fke5MdkWhrKHuj1kJJzFMM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;273&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQS 메시지 가시성 제한 시간은 기본 30초다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;문제의 원인은, Lambda가 &lt;b&gt;SageMaker serverless endpoint를 호출했지만 endpoint의 Cold Start&lt;/b&gt;로 인해 &lt;b&gt;Lambda가 응답을 받지 못하고&amp;nbsp;&amp;nbsp;타임아웃&lt;/b&gt; 되기 때문입니다.&lt;br&gt;이로 인해 SQS의 메시지는 삭제되지 않은 채 invisible 상태로 유지되었고, Visibility Timeout이 만료된 시점에 다시 visible 상태로 전환되면서 같은 메시지로 Lambda가 재실행된 것입니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ieyp5/btsPcIPiIZl/DHbLe3pq9dRRPcITJ70KSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ieyp5/btsPcIPiIZl/DHbLe3pq9dRRPcITJ70KSk/img.png&quot; data-alt=&quot;SQS에 거래 내역 메시지가 도착한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ieyp5/btsPcIPiIZl/DHbLe3pq9dRRPcITJ70KSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIeyp5%2FbtsPcIPiIZl%2FDHbLe3pq9dRRPcITJ70KSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;309&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQS에 거래 내역 메시지가 도착한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6lnDK/btsPbhMqjwo/ury6t4GNVBnw9KD7e5BfsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6lnDK/btsPbhMqjwo/ury6t4GNVBnw9KD7e5BfsK/img.png&quot; data-alt=&quot;SQS는 Lambda를 트리거하며 해당 메시지는 가시성 제한 처리 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6lnDK/btsPbhMqjwo/ury6t4GNVBnw9KD7e5BfsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6lnDK%2FbtsPbhMqjwo%2Fury6t4GNVBnw9KD7e5BfsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;309&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQS는 Lambda를 트리거하며 해당 메시지는 가시성 제한 처리 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCHJhJ/btsPckulv09/MMoSOfx3VGzAs80nlVvK6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCHJhJ/btsPckulv09/MMoSOfx3VGzAs80nlVvK6k/img.png&quot; data-alt=&quot;Lambda가 SageMaker에 요청을 보낸다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCHJhJ/btsPckulv09/MMoSOfx3VGzAs80nlVvK6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCHJhJ%2FbtsPckulv09%2FMMoSOfx3VGzAs80nlVvK6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;345&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda가 SageMaker에 요청을 보낸다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diJL4F/btsPcmZZET4/kRhXHoyq2r2HyZBvC0EkTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diJL4F/btsPcmZZET4/kRhXHoyq2r2HyZBvC0EkTk/img.png&quot; data-alt=&quot;SageMaker Serverless Endpoint는 Cold Start로 인해 프로비저닝에 많은 시간을 소요한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diJL4F/btsPcmZZET4/kRhXHoyq2r2HyZBvC0EkTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiJL4F%2FbtsPcmZZET4%2FkRhXHoyq2r2HyZBvC0EkTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;340&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SageMaker Serverless Endpoint는 Cold Start로 인해 프로비저닝에 많은 시간을 소요한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbz80J/btsPbG5XYIF/F0SPBLCpctZiKFRRyx7zS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbz80J/btsPbG5XYIF/F0SPBLCpctZiKFRRyx7zS1/img.png&quot; data-alt=&quot;6초가 지나도 SageMaker는 여전히 프로비저닝 중이며 Lambda는 시간 제한 초과로 종료된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbz80J/btsPbG5XYIF/F0SPBLCpctZiKFRRyx7zS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbz80J%2FbtsPbG5XYIF%2FF0SPBLCpctZiKFRRyx7zS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;340&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;6초가 지나도 SageMaker는 여전히 프로비저닝 중이며 Lambda는 시간 제한 초과로 종료된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di9Hay/btsPaO4SYGb/D3t45LK2dti7F1S8tmOhl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di9Hay/btsPaO4SYGb/D3t45LK2dti7F1S8tmOhl0/img.png&quot; data-alt=&quot;Lambda 실행 시간 6초 + 24초 =&amp;amp;gt; 30초가 지나 SQS 메시지 가시성 제한이 해제된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di9Hay/btsPaO4SYGb/D3t45LK2dti7F1S8tmOhl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi9Hay%2FbtsPaO4SYGb%2FD3t45LK2dti7F1S8tmOhl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;390&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda 실행 시간 6초 + 24초 =&amp;gt; 30초가 지나 SQS 메시지 가시성 제한이 해제된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WFfGZ/btsPaqwiyAx/EUlJrBgiKztb90ZVooumI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WFfGZ/btsPaqwiyAx/EUlJrBgiKztb90ZVooumI0/img.png&quot; data-alt=&quot;SQS가 다시 Lambda를 트리거하고 SageMaker에 요청한다. SageMaker는 이전 요청으로 인해 프로비저닝이 끝난 상태이므로 Lambda에게 바로 응답한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WFfGZ/btsPaqwiyAx/EUlJrBgiKztb90ZVooumI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWFfGZ%2FbtsPaqwiyAx%2FEUlJrBgiKztb90ZVooumI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;340&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQS가 다시 Lambda를 트리거하고 SageMaker에 요청한다. SageMaker는 이전 요청으로 인해 프로비저닝이 끝난 상태이므로 Lambda에게 바로 응답한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방안&lt;/h2&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;&lt;li&gt;Lambda 함수 제한 시간 상향&lt;/li&gt;&lt;/ol&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Lambda 함수가 SageMaker의 응답을 안정적으로 받을 수 있도록 기존 6초였던 Lambda의 시간 제한을 20초로 여유 있게 설정했습니다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;재발 방지&lt;/h2&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;&lt;li&gt;Lambda 타임아웃 발생 시 CloudWatch Alarm 설정&lt;/li&gt;&lt;/ol&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1791&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfXR4/btsPcz5TmdO/PKUCvvtJ4jjBBO9koBm7Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfXR4/btsPcz5TmdO/PKUCvvtJ4jjBBO9koBm7Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfXR4/btsPcz5TmdO/PKUCvvtJ4jjBBO9koBm7Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtfXR4%2FbtsPcz5TmdO%2FPKUCvvtJ4jjBBO9koBm7Rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1791&quot; height=&quot;776&quot; data-origin-width=&quot;1791&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zur04/btsPcRZyf3t/0JhYj8fmj1lze9AMVLTqT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zur04/btsPcRZyf3t/0JhYj8fmj1lze9AMVLTqT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zur04/btsPcRZyf3t/0JhYj8fmj1lze9AMVLTqT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzur04%2FbtsPcRZyf3t%2F0JhYj8fmj1lze9AMVLTqT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;891&quot; height=&quot;418&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 발생 시 Slack으로 알림을 보내서 개발자가 대처를 할 수 있도록 CloudWatch Alarm을 설정했습니다.&lt;/p&gt;</description>
      <category>AWS/트러블슈팅</category>
      <category>aws</category>
      <category>cloudwatch</category>
      <category>fcm</category>
      <category>lambda</category>
      <category>serverless</category>
      <category>sns</category>
      <category>병목</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/561</guid>
      <comments>https://codingpracticing.tistory.com/561#entry561comment</comments>
      <pubDate>Thu, 10 Jul 2025 01:00:26 +0900</pubDate>
    </item>
    <item>
      <title>SageMaker Serverless Endpoint와 Lambda 간 통신 불가 트러블슈팅</title>
      <link>https://codingpracticing.tistory.com/560</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;팀프로젝트 중, 백엔드 개발 담당 팀원이 Lambda 함수가 SageMaker와 통신이 안된다는 문제를 겪고 계셔서 트러블 슈팅을 진행했다.&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 상황&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Lambda 함수가 SageMaker Endpoint로부터 응답을 받지 못하고 타임아웃 후 종료&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인 추측하기&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추측 1. Lambda의 제한 시간이 짧다.&lt;/b&gt;&lt;br&gt;SageMaker serverless 엔드포인트는 Lambda와 동일하게 Cold Start 현상이 존재한다.&lt;br&gt;첫 호출 시엔 프로비저닝에 수 초 이상 소요될 수 있다.&lt;br&gt;Lambda의 제한 시간이 짧다면, SageMaker의 프로비저닝 시간을 기다리는 동안 시간 초과가 발생했을 수 있다.&lt;br&gt;&lt;b&gt;반론:&lt;/b&gt;&lt;br&gt;- Cold Start는 첫 요청에만 발생하며, 이후엔 Hot Start로 빠른 응답이 가능하다.&lt;br&gt;- 하지만 Lambda의 두 번째 호출에도 동일하게 타임아웃이 발생했다. 즉, Hot Start인데도 응답을 받지 못했다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;추측 2. 권한 부족&lt;/b&gt;&lt;br&gt;SameMaker는 IAM 기반 인증을 사용하며 해당 엔트포인트를 호출하기 위해선 sagemaker:InvokeEndpoint 권한이 필요하다.&lt;br&gt;&lt;b&gt;반론:&lt;/b&gt;&lt;br&gt;- 권한이 부족하면 SageMaker에서 요청을 즉시 거부한다.&lt;br&gt;- CloudWatch로 SageMaker의 엔드포인트 로그를 확인했을 땐, Lambda로부터 요청 자체가 들어오지 않았다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;추측 3. 네트워크 문제&lt;/b&gt;&lt;br&gt;통신 자체가 안됐으므로 네트워크 문제일 가능성이 가장 유력하다.&lt;br&gt;Lambda의 네트워크 설정을 확인했더니 Lambda가 VPC에 배치되어 있었다. 설계한 내용과 달랐다.&lt;br&gt;현재 우리 팀프로젝트의 아키텍처는 아래와 같다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWaPgO/btsPa3zaCRu/p7k3x5BQJf4EhPJhj5LF0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWaPgO/btsPa3zaCRu/p7k3x5BQJf4EhPJhj5LF0k/img.png&quot; data-alt=&quot;클라우드 운영 비용을 최대한 줄이기 위해 모든 서비스가 Serverless로 구성된 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWaPgO/btsPa3zaCRu/p7k3x5BQJf4EhPJhj5LF0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWaPgO%2FbtsPa3zaCRu%2Fp7k3x5BQJf4EhPJhj5LF0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1096&quot; height=&quot;962&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클라우드 운영 비용을 최대한 줄이기 위해 모든 서비스가 Serverless로 구성된 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위를 보면 별 문제 없어 보이지만 상세 구성도는 아래와 같다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;1767&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qrt58/btsPbj2QoJg/JET2KRKtfkdA1ZUqyz4M50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qrt58/btsPbj2QoJg/JET2KRKtfkdA1ZUqyz4M50/img.png&quot; data-alt=&quot;SageMaker와 Lambda가 VPC 외부에 존재한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qrt58/btsPbj2QoJg/JET2KRKtfkdA1ZUqyz4M50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqrt58%2FbtsPbj2QoJg%2FJET2KRKtfkdA1ZUqyz4M50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1910&quot; height=&quot;1767&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;1767&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SageMaker와 Lambda가 VPC 외부에 존재한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;SageMaker의 서버리스 엔드포인트는 현재 VPC 구성을 지원하지 않으며 VPC Endpoint도 제공하지 않는다.&lt;br&gt;&lt;b&gt;따라서, SageMaker의 엔드포인트와 통신하기 위해선 퍼블릭 인터넷을 통해야 한다.&lt;/b&gt;&lt;br&gt;즉, Lambda를 VPC 내부에 배치하고 NAT Gateway를 통하는 방법과 Lambda를 VPC와 연결하지 않는 방법이 있다.&lt;br&gt;현재 아키텍처는 고가용성을 목표로 하는 만큼 NAT Gateway를 사용한다면 최소 두 대가 필요하다. 그렇게 된다면 운영비에 상당 부분을 차지하게 된다.&lt;br&gt;따라서, 비용 절약을 위해 Lambda를 VPC 외부에 배치했다.&lt;br&gt;문제의 원인은 Lambda가 VPC에 연결된 채 배포되어 퍼블릭 인터넷을 통한 SageMaker 엔드포인트 접근이 불가능했던 것이다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cilSh3/btsO9qCFtN7/NB3Qy7SXyiFR8nlyvQvhQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cilSh3/btsO9qCFtN7/NB3Qy7SXyiFR8nlyvQvhQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cilSh3/btsO9qCFtN7/NB3Qy7SXyiFR8nlyvQvhQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcilSh3%2FbtsO9qCFtN7%2FNB3Qy7SXyiFR8nlyvQvhQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1364&quot; height=&quot;627&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고자료&lt;/h3&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;AWS. SageMaker Serverless Endpoint.&lt;br&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/serverless-endpoints.html?utm_source=chatgpt.com&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/serverless-endpoints.html?utm_source=chatgpt.com&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS/트러블슈팅</category>
      <category>aws</category>
      <category>Lamda</category>
      <category>SageMaker</category>
      <category>serverless</category>
      <author>가나무마</author>
      <guid isPermaLink="true">https://codingpracticing.tistory.com/560</guid>
      <comments>https://codingpracticing.tistory.com/560#entry560comment</comments>
      <pubDate>Wed, 9 Jul 2025 00:54:48 +0900</pubDate>
    </item>
  </channel>
</rss>