<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Gom3rye</title>
    <link>https://gom3rye.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 24 Jul 2026 15:16:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Gom3rye</managingEditor>
    <item>
      <title>구현 문제에서 '새 배열 교체' vs. '좌표 집합만 교체'</title>
      <link>https://gom3rye.tistory.com/389</link>
      <description>&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;언제 '새 배열'을 만들고, 언제 '좌표 집합'만 쓸까?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이 두 방식을 구별하는 기준은 &quot;데이터의 밀도&quot;와 &quot;참조 방식&quot;에 있다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;A. 매 단계 '새 배열' 생성이 유리한 경우 (밀도가 높을 때)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;상태 전파&lt;/b&gt;: 한 칸의 변화가 주변 칸에 연쇄적으로 영향을 줄 때 (예: &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;10,0,0&quot;&gt;모래바람, 불 번지기, 물 시뮬레이션&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;주변 참조&lt;/b&gt;: board[i][j]의 다음 값이 board[i-1][j], board[i+1][j] 등 주변 8칸의 &lt;b data-index-in-node=&quot;64&quot; data-path-to-node=&quot;10,1,0&quot;&gt;모든 상태&lt;/b&gt;에 의존할 때&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;객체가 꽉 찼을 때&lt;/b&gt;: 보드의 거의 모든 칸에 데이터가 들어있어서 좌표만 따로 관리하는 게 더 메모리를 많이 먹을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;B. '좌표 집합(Set/Dict)'만 관리해도 되는 경우 (밀도가 낮을 때)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;독립적 이동&lt;/b&gt;: 객체들이 서로의 상태를 실시간으로 참조하지 않고, 각자 자기 갈 길을 갈 때 (예: &lt;b data-index-in-node=&quot;55&quot; data-path-to-node=&quot;12,0,0&quot;&gt;아두이노, 로봇, 총알&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;희소 데이터(Sparse Data)&lt;/b&gt;: &lt;span data-index-in-node=&quot;21&quot; data-math=&quot;100 \times 100&quot;&gt;100*100 &lt;/span&gt;보드에 객체는 고작 10~20개뿐일 때. (10,000칸을 다 뒤지는 것보다 20개 좌표만 보는 게 훨씬 빠름)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0&quot;&gt;충돌 판정 중심&lt;/b&gt;: 이동 후 &quot;겹치면 삭제&quot; 같은 로직이 핵심일 때 (&lt;b&gt;딕셔너리가 보드보다 훨씬 유리함&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;13&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;문제를 알아보는 결정적 힌트&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;다음에 문제를 볼 때 이 질문을 스스로에게 던져보기&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;16&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;16,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0&quot;&gt;&quot;내가 지금 보드(board[i][j])의 '빈 공간(.)'을 연산에 쓰고 있는가?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;YES&lt;/b&gt;: 빈 공간이 물길이 되거나, 빈 공간의 개수를 세야 하거나, 주변 빈 공간으로 확산된다면 &lt;b data-index-in-node=&quot;54&quot; data-path-to-node=&quot;17,0,0&quot;&gt;매번 새 배열&lt;/b&gt;을 만드는 게 편하다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;NO&lt;/b&gt;: 빈 공간은 그냥 배경일 뿐이고, 중요한 건 'I'와 'R'의 위치뿐이라면 &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;17,1,0&quot;&gt;좌표 관리&lt;/b&gt;가 훨씬 유리하다. 마지막에 출력할 때만 그 좌표들을 보드에 찍어주면 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;보드가 &quot;출력용 도구&quot;인지, &quot;내부 로직을 계산하는 데 필수적인 데이터 구조&quot;인지 파악해보자!&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>코딩테스트 준비</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/389</guid>
      <comments>https://gom3rye.tistory.com/389#entry389comment</comments>
      <pubDate>Fri, 23 Jan 2026 16:21:11 +0900</pubDate>
    </item>
    <item>
      <title>DP vs. Stack vs. Heapq</title>
      <link>https://gom3rye.tistory.com/388</link>
      <description>&lt;h3 data-end=&quot;144&quot; data-start=&quot;123&quot; data-ke-size=&quot;size23&quot;&gt;  DP / Stack의 본질&lt;/h3&gt;
&lt;blockquote data-end=&quot;168&quot; data-start=&quot;145&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;168&quot; data-start=&quot;147&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;과거에서부터 일직선으로 작동한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;182&quot; data-start=&quot;170&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;무슨 의미냐 하면은&lt;/p&gt;
&lt;h3 data-end=&quot;190&quot; data-start=&quot;184&quot; data-ke-size=&quot;size23&quot;&gt;DP&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;278&quot; data-start=&quot;191&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;223&quot; data-start=&quot;191&quot;&gt;상태가 dp[i] &amp;rarr; dp[i+1]로 &lt;b&gt;단방향&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;252&quot; data-start=&quot;224&quot;&gt;한 번 계산된 과거 상태는 &lt;b&gt;되돌리지 않음&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;253&quot;&gt;과거 선택이 &amp;ldquo;최선&amp;rdquo;이라는 전제 하에 누적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;320&quot; data-start=&quot;280&quot; data-ke-size=&quot;size16&quot;&gt;  그래서&lt;br /&gt;✔ &amp;ldquo;지금 선택이 나중에 틀릴 수 있는 문제&amp;rdquo;에는 부적합&lt;/p&gt;
&lt;hr data-end=&quot;325&quot; data-start=&quot;322&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;336&quot; data-start=&quot;327&quot; data-ke-size=&quot;size23&quot;&gt;Stack&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;416&quot; data-start=&quot;337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;365&quot; data-start=&quot;337&quot;&gt;&lt;b&gt;가장 최근 선택만&lt;/b&gt; 취소 가능 (LIFO)&lt;/li&gt;
&lt;li data-end=&quot;393&quot; data-start=&quot;366&quot;&gt;&amp;ldquo;조건 위반 시, 방금 넣은 것만 제거&amp;rdquo; 가능&lt;/li&gt;
&lt;li data-end=&quot;416&quot; data-start=&quot;394&quot;&gt;&lt;b&gt;임의의 과거 선택 제거 불가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;430&quot; data-start=&quot;418&quot; data-ke-size=&quot;size16&quot;&gt;  백준) 컵라면 문제에서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;484&quot; data-start=&quot;431&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;456&quot; data-start=&quot;431&quot;&gt;제거해야 할 건 &amp;ldquo;가장 컵라면 적은 문제&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;484&quot; data-start=&quot;457&quot;&gt;이게 꼭 &lt;b&gt;마지막에 넣은 것&lt;/b&gt;이 아니다 ❌&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;489&quot; data-start=&quot;486&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;513&quot; data-start=&quot;491&quot; data-ke-size=&quot;size26&quot;&gt;  Heap(우선순위 큐)의 본질&lt;/h2&gt;
&lt;blockquote data-end=&quot;550&quot; data-start=&quot;514&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;550&quot; data-start=&quot;516&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 기준으로 과거 선택을 언제든지 되돌릴 수 있다&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;552&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;552&quot; data-ke-size=&quot;size16&quot;&gt;이게 힙의 핵심 능력  &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;645&quot; data-start=&quot;568&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;597&quot; data-start=&quot;568&quot;&gt;힙은 &lt;b&gt;시간 순서가 아니라 가치 순서&lt;/b&gt;로 관리&lt;/li&gt;
&lt;li data-end=&quot;618&quot; data-start=&quot;598&quot;&gt;따라서 과거에 &amp;ldquo;최선처럼 보였던 선택&amp;rdquo;도 더 좋은 선택이 오면 &lt;b&gt;즉시 폐기 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;667&quot; data-start=&quot;647&quot; data-ke-size=&quot;size16&quot;&gt;  그래서 힙은 이런 문제에 강함:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;708&quot; data-start=&quot;668&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;681&quot; data-start=&quot;668&quot;&gt;&amp;ldquo;일단 다 넣어본다&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;708&quot; data-start=&quot;682&quot;&gt;&amp;ldquo;조건 위반 시, 제일 나쁜 것 하나 제거&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;713&quot; data-start=&quot;710&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;737&quot; data-start=&quot;715&quot; data-ke-size=&quot;size26&quot;&gt;  컵라면 문제로 다시 연결해보면&lt;/h2&gt;
&lt;h3 data-end=&quot;745&quot; data-start=&quot;739&quot; data-ke-size=&quot;size23&quot;&gt;상황&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;804&quot; data-start=&quot;746&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;767&quot; data-start=&quot;746&quot;&gt;데드라인 2까지는 문제 2개만 가능&lt;/li&gt;
&lt;li data-end=&quot;781&quot; data-start=&quot;768&quot;&gt;이미 2개를 골랐는데&lt;/li&gt;
&lt;li data-end=&quot;804&quot; data-start=&quot;782&quot;&gt;컵라면 100짜리 문제가 새로 등장함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;816&quot; data-start=&quot;806&quot; data-ke-size=&quot;size23&quot;&gt;해야 할 일&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;864&quot; data-start=&quot;817&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;841&quot; data-start=&quot;817&quot;&gt;과거 선택 중 &lt;b&gt;컵라면 최소&lt;/b&gt;를 제거&lt;/li&gt;
&lt;li data-end=&quot;864&quot; data-start=&quot;842&quot;&gt;이게 언제 들어온 문제인지는 중요 ❌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;878&quot; data-start=&quot;866&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;힙만 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;883&quot; data-start=&quot;880&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;910&quot; data-start=&quot;885&quot; data-ke-size=&quot;size26&quot;&gt;즉,&lt;/h2&gt;
&lt;blockquote data-end=&quot;1064&quot; data-start=&quot;912&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1064&quot; data-start=&quot;914&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DP나 스택은 과거 선택이 한 방향으로만 누적되며, 한 번 선택한 것이 나중에 뒤집히지 않는다.&lt;br /&gt;반면 heapq는 우선순위를 기준으로 관리되기 때문에 과거에 최선이라고 선택한 것도 나중에 더 좋은 선택이 나오면 즉시 되돌릴 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1089&quot; data-start=&quot;1086&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1113&quot; data-start=&quot;1091&quot; data-ke-size=&quot;size26&quot;&gt;  코테용 암기 포인트!&lt;/h2&gt;
&lt;blockquote data-end=&quot;1152&quot; data-start=&quot;1115&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1152&quot; data-start=&quot;1117&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;과거 선택을 나중에 우선순위로 취소해야 하면 힙을 쓰자.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>코딩테스트 준비</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/388</guid>
      <comments>https://gom3rye.tistory.com/388#entry388comment</comments>
      <pubDate>Fri, 2 Jan 2026 20:57:31 +0900</pubDate>
    </item>
    <item>
      <title>투 포인터가 가능한 문제 판별법 (체크리스트)</title>
      <link>https://gom3rye.tistory.com/387</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래 조건 중 &lt;b&gt;3개 이상&lt;/b&gt; 맞으면 거의 확정&lt;/p&gt;
&lt;hr data-end=&quot;217&quot; data-start=&quot;214&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;252&quot; data-start=&quot;219&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ &amp;ldquo;연속한 구간(부분 수열)&amp;rdquo;이라는 말이 있는가?&lt;/h2&gt;
&lt;p data-end=&quot;277&quot; data-start=&quot;254&quot; data-ke-size=&quot;size16&quot;&gt;투 포인터의 &lt;b&gt;절대적 전제 조건&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;321&quot; data-start=&quot;279&quot; data-ke-size=&quot;size16&quot;&gt;✔ 연속한&lt;br /&gt;✔ 부분 수열&lt;br /&gt;✔ subarray&lt;br /&gt;✔ 구간 [L, R]&lt;/p&gt;
&lt;p data-end=&quot;349&quot; data-start=&quot;323&quot; data-ke-size=&quot;size16&quot;&gt;❌ 순열, 조합, 임의 선택 &amp;rarr; 투 포인터 아님&lt;/p&gt;
&lt;hr data-end=&quot;354&quot; data-start=&quot;351&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;382&quot; data-start=&quot;356&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ 구간에 대한 &amp;ldquo;조건&amp;rdquo;이 단조적인가?&lt;/h2&gt;
&lt;h3 data-end=&quot;412&quot; data-start=&quot;384&quot; data-ke-size=&quot;size23&quot;&gt;  단조성(monotonicity)이 핵심&lt;/h3&gt;
&lt;blockquote data-end=&quot;449&quot; data-start=&quot;414&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;416&quot; data-ke-size=&quot;size16&quot;&gt;오른쪽을 늘리면 조건이 &lt;b&gt;점점 나빠지거나 / 좋아지거나&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;457&quot; data-start=&quot;451&quot; data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;607&quot; data-start=&quot;459&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;조건&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;단조성&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;507&quot; data-start=&quot;482&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;490&quot; data-start=&quot;482&quot;&gt;합 &amp;le; K&lt;/td&gt;
&lt;td data-end=&quot;507&quot; data-start=&quot;490&quot; data-col-size=&quot;sm&quot;&gt;right &amp;uarr; &amp;rarr; 합 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;538&quot; data-start=&quot;508&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;516&quot; data-start=&quot;508&quot;&gt;중복 없음&lt;/td&gt;
&lt;td data-end=&quot;538&quot; data-start=&quot;516&quot; data-col-size=&quot;sm&quot;&gt;right &amp;uarr; &amp;rarr; 중복 가능성 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;574&quot; data-start=&quot;539&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;556&quot; data-start=&quot;539&quot;&gt;서로 다른 수 개수 &amp;le; K&lt;/td&gt;
&lt;td data-end=&quot;574&quot; data-start=&quot;556&quot; data-col-size=&quot;sm&quot;&gt;right &amp;uarr; &amp;rarr; 개수 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;607&quot; data-start=&quot;575&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;589&quot; data-start=&quot;575&quot;&gt;최대 &amp;minus; 최소 &amp;le; K&lt;/td&gt;
&lt;td data-end=&quot;607&quot; data-start=&quot;589&quot; data-col-size=&quot;sm&quot;&gt;right &amp;uarr; &amp;rarr; 차이 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;641&quot; data-start=&quot;609&quot; data-ke-size=&quot;size16&quot;&gt;  조건이 깨지면 left를 움직여 &lt;b&gt;회복 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;646&quot; data-start=&quot;643&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;675&quot; data-start=&quot;648&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ &amp;ldquo;최대 / 최소 / 개수&amp;rdquo;를 묻는가?&lt;/h2&gt;
&lt;p data-end=&quot;693&quot; data-start=&quot;677&quot; data-ke-size=&quot;size16&quot;&gt;투 포인터의 전형적인 질문들:&lt;/p&gt;
&lt;p data-end=&quot;742&quot; data-start=&quot;695&quot; data-ke-size=&quot;size16&quot;&gt;✔ 가능한 최대 길이&lt;br /&gt;✔ 가능한 최소 길이&lt;br /&gt;✔ 조건을 만족하는 구간의 개수&lt;/p&gt;
&lt;p data-end=&quot;765&quot; data-start=&quot;744&quot; data-ke-size=&quot;size16&quot;&gt;이 중 하나면 &lt;b&gt;의심 1단계 통과&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;770&quot; data-start=&quot;767&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;795&quot; data-start=&quot;772&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ N이 크다 (보통 &amp;ge; 10⁵)&lt;/h2&gt;
&lt;p data-end=&quot;811&quot; data-start=&quot;797&quot; data-ke-size=&quot;size16&quot;&gt;이건 거의 신호등  &lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;901&quot; data-start=&quot;813&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;N가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;854&quot; data-start=&quot;839&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;845&quot; data-start=&quot;839&quot;&gt;10&amp;sup3;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;854&quot; data-start=&quot;845&quot;&gt;O(N&amp;sup2;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;883&quot; data-start=&quot;855&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;861&quot; data-start=&quot;855&quot;&gt;10⁵&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;883&quot; data-start=&quot;861&quot;&gt;O(N) or O(N log N)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;901&quot; data-start=&quot;884&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;890&quot; data-start=&quot;884&quot;&gt;10⁶&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;901&quot; data-start=&quot;890&quot;&gt;거의 O(N)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;933&quot; data-start=&quot;903&quot; data-ke-size=&quot;size16&quot;&gt;  연속 + 조건 + N 큼 &amp;rarr; 투 포인터 거의 확정&lt;/p&gt;
&lt;hr data-end=&quot;938&quot; data-start=&quot;935&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;970&quot; data-start=&quot;940&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ &amp;ldquo;하나씩 늘려보면 된다&amp;rdquo;는 느낌이 드는가?&lt;/h2&gt;
&lt;p data-end=&quot;1000&quot; data-start=&quot;972&quot; data-ke-size=&quot;size16&quot;&gt;문제를 읽을 때 이런 생각이 들면 바로 투 포인터:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1076&quot; data-start=&quot;1002&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1031&quot; data-start=&quot;1002&quot;&gt;&amp;ldquo;오른쪽을 늘리다가 안 되면 왼쪽 줄이면 되겠네&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1032&quot;&gt;&amp;ldquo;중복 나오면 앞(left)에서 빼면 되겠네&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1076&quot; data-start=&quot;1054&quot;&gt;&amp;ldquo;합이 넘치면 앞(left)에서 줄이면 되겠네&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1100&quot; data-start=&quot;1078&quot; data-ke-size=&quot;size16&quot;&gt;  이 생각 자체가 투 포인터 사고방식&lt;/p&gt;
&lt;hr data-end=&quot;1105&quot; data-start=&quot;1102&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1132&quot; data-start=&quot;1107&quot;&gt;❌ 투 포인터가 &lt;b&gt;절대 안 되는&lt;/b&gt; 경우&lt;/h1&gt;
&lt;h2 data-end=&quot;1165&quot; data-start=&quot;1149&quot; data-ke-size=&quot;size26&quot;&gt;  1. 연속이 아니다&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;수열에서 K개를 골라서 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1203&quot; data-start=&quot;1193&quot; data-ke-size=&quot;size16&quot;&gt;❌ 투 포인터 불가&lt;/p&gt;
&lt;hr data-end=&quot;1208&quot; data-start=&quot;1205&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1227&quot; data-start=&quot;1210&quot; data-ke-size=&quot;size26&quot;&gt;  2. 조건이 비단조적&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;합이 정확히 K &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1254&quot; data-start=&quot;1251&quot; data-ke-size=&quot;size16&quot;&gt;합은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1291&quot; data-start=&quot;1255&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1265&quot; data-start=&quot;1255&quot;&gt;늘리면 커졌다가&lt;/li&gt;
&lt;li data-end=&quot;1277&quot; data-start=&quot;1266&quot;&gt;줄이면 작아졌다가&lt;/li&gt;
&lt;li data-end=&quot;1291&quot; data-start=&quot;1278&quot;&gt;다시 늘리면 또 커짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1311&quot; data-start=&quot;1293&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;슬라이딩 윈도우 불가&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1336&quot; data-start=&quot;1313&quot; data-ke-size=&quot;size16&quot;&gt;(단, 양수만 있을 때는 예외적으로 가능)&lt;/p&gt;
&lt;hr data-end=&quot;1341&quot; data-start=&quot;1338&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1366&quot; data-start=&quot;1343&quot; data-ke-size=&quot;size26&quot;&gt;  3. 뒤에서 상태가 바뀌는 문제&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;나중 선택이 앞의 상태를 바꾼다 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1418&quot; data-start=&quot;1399&quot; data-ke-size=&quot;size16&quot;&gt;  DP / 그리디 / 스택 문제&lt;/p&gt;
&lt;hr data-end=&quot;1423&quot; data-start=&quot;1420&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1441&quot; data-start=&quot;1425&quot;&gt;  대표 문제 유형 매핑&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1640&quot; data-start=&quot;1443&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 48.4884%;&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1499&quot; data-start=&quot;1470&quot;&gt;
&lt;td style=&quot;width: 48.4884%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1490&quot; data-start=&quot;1470&quot;&gt;중복 없는 연속 부분 수열 개수&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1499&quot; data-start=&quot;1490&quot;&gt;투 포인터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1526&quot; data-start=&quot;1500&quot;&gt;
&lt;td style=&quot;width: 48.4884%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1517&quot; data-start=&quot;1500&quot;&gt;합이 K 이하인 최대 길이&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1526&quot; data-start=&quot;1517&quot;&gt;투 포인터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1550&quot; data-start=&quot;1527&quot;&gt;
&lt;td style=&quot;width: 48.4884%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1541&quot; data-start=&quot;1527&quot;&gt;서로 다른 수 &amp;le; K&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1550&quot; data-start=&quot;1541&quot;&gt;투 포인터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1574&quot; data-start=&quot;1551&quot;&gt;
&lt;td style=&quot;width: 48.4884%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1565&quot; data-start=&quot;1551&quot;&gt;최소 길이 부분 수열&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1574&quot; data-start=&quot;1565&quot;&gt;투 포인터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1599&quot; data-start=&quot;1575&quot;&gt;
&lt;td style=&quot;width: 48.4884%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1591&quot; data-start=&quot;1575&quot;&gt;스카이라인 / 히스토그램&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1599&quot; data-start=&quot;1591&quot;&gt;❌ 스택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1620&quot; data-start=&quot;1600&quot;&gt;
&lt;td style=&quot;width: 48.4884%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1611&quot; data-start=&quot;1600&quot;&gt;스위치 / 토글&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1620&quot; data-start=&quot;1611&quot;&gt;❌ 그리디&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1640&quot; data-start=&quot;1621&quot;&gt;
&lt;td style=&quot;width: 48.4884%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1632&quot; data-start=&quot;1621&quot;&gt;모든 경우의 수&lt;/td&gt;
&lt;td style=&quot;width: 51.3953%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1640&quot; data-start=&quot;1632&quot;&gt;❌ DP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1645&quot; data-start=&quot;1642&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1664&quot; data-start=&quot;1647&quot;&gt;  빠른 판별 3문장 법칙&lt;/h1&gt;
&lt;p data-end=&quot;1690&quot; data-start=&quot;1666&quot; data-ke-size=&quot;size16&quot;&gt;문제 보자마자 스스로에게 물어볼 질문&lt;/p&gt;
&lt;p data-end=&quot;1766&quot; data-start=&quot;1692&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;연속인가?&lt;/b&gt;&lt;br /&gt;2️⃣ &lt;b&gt;오른쪽 늘리면 조건이 단조적으로 변하나?&lt;/b&gt;&lt;br /&gt;3️⃣ &lt;b&gt;안 되면 왼쪽 줄이면 회복되나?&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1785&quot; data-start=&quot;1768&quot; data-ke-size=&quot;size16&quot;&gt;  전부 YES &amp;rarr; 투 포인터&lt;/p&gt;
&lt;hr data-end=&quot;1790&quot; data-start=&quot;1787&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1815&quot; data-start=&quot;1792&quot;&gt;  한 줄 요약&lt;/h1&gt;
&lt;blockquote data-end=&quot;1856&quot; data-start=&quot;1817&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1856&quot; data-start=&quot;1819&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연속 + 조건 단조 + N 큼&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;투 포인터&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>코딩테스트 준비</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/387</guid>
      <comments>https://gom3rye.tistory.com/387#entry387comment</comments>
      <pubDate>Wed, 31 Dec 2025 20:01:02 +0900</pubDate>
    </item>
    <item>
      <title>stack vs. heapq 문제 차이 비교</title>
      <link>https://gom3rye.tistory.com/386</link>
      <description>&lt;h1 data-end=&quot;109&quot; data-start=&quot;95&quot;&gt;  핵심 한 줄 요약&lt;/h1&gt;
&lt;blockquote data-end=&quot;192&quot; data-start=&quot;111&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;192&quot; data-start=&quot;113&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;heapq는 &amp;ldquo;여러 후보 중 최선 1개를 계속 고르는 문제&amp;rdquo;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;stack은 &amp;ldquo;앞에서 한 선택을 뒤에서 취소해야 하는 문제&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;221&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;이 한 줄을 기준으로 보면 대부분 문제가 정리된다.&lt;/p&gt;
&lt;hr data-end=&quot;226&quot; data-start=&quot;223&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;260&quot; data-start=&quot;228&quot;&gt;1️⃣ heapq 문제&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;329&quot; data-start=&quot;275&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;283&quot; data-start=&quot;275&quot;&gt;회의실 배정&lt;/li&gt;
&lt;li data-end=&quot;307&quot; data-start=&quot;284&quot;&gt;&lt;b&gt;동시에 열리는 회의의 최대 개수&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;329&quot; data-start=&quot;308&quot;&gt;또는 &lt;b&gt;필요한 최소 회의실 수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;334&quot; data-start=&quot;331&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;361&quot; data-start=&quot;336&quot; data-ke-size=&quot;size23&quot;&gt;  이 문제에서 우리가 반복하는 질문&lt;/h3&gt;
&lt;blockquote data-end=&quot;420&quot; data-start=&quot;363&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;420&quot; data-start=&quot;365&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지금 시작하는 회의가 기존 회의 중 &lt;b&gt;가장 빨리 끝나는 회의&lt;/b&gt;를 재사용할 수 있는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;463&quot; data-start=&quot;422&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;매 순간 여러 회의 중 &amp;lsquo;가장 빨리 끝나는 회의 1개&amp;rsquo;만 중요&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;468&quot; data-start=&quot;465&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;492&quot; data-start=&quot;470&quot; data-ke-size=&quot;size23&quot;&gt;  그래서 heapq가 딱 맞음&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;651&quot; data-start=&quot;577&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;608&quot; data-start=&quot;577&quot;&gt;q에는 &lt;b&gt;현재 진행 중인 회의들의 종료 시간&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;636&quot; data-start=&quot;609&quot;&gt;q[0] = &lt;b&gt;가장 빨리 끝나는 회의&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;651&quot; data-start=&quot;637&quot;&gt;그 하나만 보면 됨 ❗&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1765942463690&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for start, end in info: 
    if q and q[0] &amp;lt;= start: # 재활용 가능 
        heapq.heappop(q) 
    heapq.heappush(q, end)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;674&quot; data-start=&quot;653&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;470&quot; data-end=&quot;492&quot; data-ke-size=&quot;size23&quot;&gt;  과거 선택을 취소하지 않음&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;711&quot; data-start=&quot;675&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;695&quot; data-start=&quot;675&quot;&gt;이미 시작한 회의는 되돌리지 않음&lt;/li&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;696&quot;&gt;단지 &amp;ldquo;끝났는지&amp;rdquo;만 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;716&quot; data-start=&quot;713&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;748&quot; data-start=&quot;718&quot;&gt;2️⃣ 반대로 stack 문제는 뭐가 다를까?&lt;/h1&gt;
&lt;h3 data-end=&quot;772&quot; data-start=&quot;750&quot; data-ke-size=&quot;size23&quot;&gt;❌ 크게 만들기(백준 2812) 에서 우리가 묻는 질문&lt;/h3&gt;
&lt;blockquote data-end=&quot;821&quot; data-start=&quot;774&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;821&quot; data-start=&quot;776&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;현재까지 선택한 숫자 중 &lt;b&gt;어떤 걸 버릴지&lt;/b&gt; 다시 결정해야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;834&quot; data-start=&quot;823&quot; data-ke-size=&quot;size16&quot;&gt;정답: &lt;b&gt;YES&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;839&quot; data-start=&quot;836&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;856&quot; data-start=&quot;841&quot; data-ke-size=&quot;size23&quot;&gt;  예제 다시 보기&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;4177252841 K=4 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;886&quot; data-start=&quot;881&quot; data-ke-size=&quot;size16&quot;&gt;진행 중:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765942619056&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;4
41
417 &amp;larr; 7이 1보다 크고, 4보다 크니까 차례대로 빼주기
77
772 &amp;larr; 2 등장 &amp;rarr; 앞의 7은 유지
7725 &amp;larr; 5 등장 &amp;rarr; 앞의 2는 제거해야 더 큼 ❗
7752&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1006&quot; data-start=&quot;979&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;이미 선택한 숫자를 다시 취소해야 함&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1011&quot; data-start=&quot;1008&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1033&quot; data-start=&quot;1013&quot; data-ke-size=&quot;size23&quot;&gt;❌ heapq로는 이게 불가능&lt;/h3&gt;
&lt;p data-end=&quot;1042&quot; data-start=&quot;1035&quot; data-ke-size=&quot;size16&quot;&gt;heapq는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1110&quot; data-start=&quot;1043&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1060&quot; data-start=&quot;1043&quot;&gt;&amp;ldquo;가장 큰 것&amp;rdquo;을 알려줄 뿐&lt;/li&gt;
&lt;li data-end=&quot;1078&quot; data-start=&quot;1061&quot;&gt;&lt;b&gt;누가 언제 들어왔는지&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1093&quot; data-start=&quot;1079&quot;&gt;&lt;b&gt;앞자리에 있는지&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1110&quot; data-start=&quot;1094&quot;&gt;&lt;b&gt;지금 지워야 하는지&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1129&quot; data-start=&quot;1112&quot; data-ke-size=&quot;size16&quot;&gt;  이 정보들을 전부 잃어버림&lt;/p&gt;
&lt;hr data-end=&quot;1134&quot; data-start=&quot;1131&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1153&quot; data-start=&quot;1136&quot;&gt;3️⃣ 구조적으로 비교해보자&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1386&quot; data-start=&quot;1155&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기준&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;heapq (회의실)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;stack (크게 만들기)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1249&quot; data-start=&quot;1213&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1221&quot; data-start=&quot;1213&quot;&gt;후보 개수&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1228&quot; data-start=&quot;1221&quot;&gt;여러 개&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1249&quot; data-start=&quot;1228&quot;&gt;사실상 &lt;b&gt;연속된 과거 선택&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1283&quot; data-start=&quot;1250&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1258&quot; data-start=&quot;1250&quot;&gt;관심 대상&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1271&quot; data-start=&quot;1258&quot;&gt;항상 &amp;ldquo;최선 1개&amp;rdquo;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1283&quot; data-start=&quot;1271&quot;&gt;바로 직전 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1304&quot; data-start=&quot;1284&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1295&quot; data-start=&quot;1284&quot;&gt;과거 선택 취소&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1299&quot; data-start=&quot;1295&quot;&gt;❌&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1304&quot; data-start=&quot;1299&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1328&quot; data-start=&quot;1305&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1313&quot; data-start=&quot;1305&quot;&gt;순서 유지&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1320&quot; data-start=&quot;1313&quot;&gt;중요 ❌&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1328&quot; data-start=&quot;1320&quot;&gt;필수 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1360&quot; data-start=&quot;1329&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1337&quot; data-start=&quot;1329&quot;&gt;핵심 연산&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1346&quot; data-start=&quot;1337&quot;&gt;최솟값 조회&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1360&quot; data-start=&quot;1346&quot;&gt;pop / push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1386&quot; data-start=&quot;1361&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1369&quot; data-start=&quot;1361&quot;&gt;문제 본질&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1377&quot; data-start=&quot;1369&quot;&gt;자원 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1386&quot; data-start=&quot;1377&quot;&gt;선택 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1391&quot; data-start=&quot;1388&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1420&quot; data-start=&quot;1393&quot;&gt;4️⃣ 결정적인 질문 3가지&lt;/h1&gt;
&lt;h2 data-end=&quot;1431&quot; data-start=&quot;1422&quot; data-ke-size=&quot;size26&quot;&gt;✅ 질문 1&lt;/h2&gt;
&lt;blockquote data-end=&quot;1459&quot; data-start=&quot;1432&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1459&quot; data-start=&quot;1434&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금 선택이 나중에 취소될 수 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1490&quot; data-start=&quot;1461&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1474&quot; data-start=&quot;1461&quot;&gt;YES &amp;rarr; stack&lt;/li&gt;
&lt;li data-end=&quot;1490&quot; data-start=&quot;1475&quot;&gt;NO &amp;rarr; heapq 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1495&quot; data-start=&quot;1492&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1506&quot; data-start=&quot;1497&quot; data-ke-size=&quot;size26&quot;&gt;✅ 질문 2&lt;/h2&gt;
&lt;blockquote data-end=&quot;1541&quot; data-start=&quot;1507&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1541&quot; data-start=&quot;1509&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;후보가 여러 개 있고, 그중 최선 하나만 중요할까?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1569&quot; data-start=&quot;1543&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1556&quot; data-start=&quot;1543&quot;&gt;YES &amp;rarr; heapq&lt;/li&gt;
&lt;li data-end=&quot;1569&quot; data-start=&quot;1557&quot;&gt;NO &amp;rarr; stack&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1574&quot; data-start=&quot;1571&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1585&quot; data-start=&quot;1576&quot; data-ke-size=&quot;size26&quot;&gt;✅ 질문 3&lt;/h2&gt;
&lt;blockquote data-end=&quot;1611&quot; data-start=&quot;1586&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1611&quot; data-start=&quot;1588&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입력 순서를 반드시 유지해야 하나?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1642&quot; data-start=&quot;1613&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1626&quot; data-start=&quot;1613&quot;&gt;YES &amp;rarr; stack&lt;/li&gt;
&lt;li data-end=&quot;1642&quot; data-start=&quot;1627&quot;&gt;NO &amp;rarr; heapq 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1647&quot; data-start=&quot;1644&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1672&quot; data-start=&quot;1649&quot;&gt;5️⃣ 두 문제를 한 문장으로 비교하면&lt;/h1&gt;
&lt;h3 data-end=&quot;1684&quot; data-start=&quot;1674&quot; data-ke-size=&quot;size23&quot;&gt;회의실 문제&lt;/h3&gt;
&lt;blockquote data-end=&quot;1727&quot; data-start=&quot;1685&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1727&quot; data-start=&quot;1687&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지금까지 열린 회의 중 &lt;b&gt;가장 빨리 끝나는 것 하나만 알면 된다&lt;/b&gt;&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1739&quot; data-start=&quot;1729&quot; data-ke-size=&quot;size23&quot;&gt;크게 만들기&lt;/h3&gt;
&lt;blockquote data-end=&quot;1776&quot; data-start=&quot;1740&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1776&quot; data-start=&quot;1742&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;앞자리에 있는 &lt;b&gt;작은 숫자는 언제든지 취소될 수 있다&lt;/b&gt;&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>코딩테스트 준비</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/386</guid>
      <comments>https://gom3rye.tistory.com/386#entry386comment</comments>
      <pubDate>Wed, 17 Dec 2025 12:50:52 +0900</pubDate>
    </item>
    <item>
      <title>Union-Find를 쓸 수 있는 문제 유형 5가지</title>
      <link>https://gom3rye.tistory.com/385</link>
      <description>&lt;h1 data-end=&quot;2207&quot; data-start=&quot;2176&quot;&gt;  Union-Find를 떠올려야 하는 신호(패턴)&lt;/h1&gt;
&lt;p data-end=&quot;2254&quot; data-start=&quot;2209&quot; data-ke-size=&quot;size16&quot;&gt;아래 상황 중 하나라도 보이면 &lt;b&gt;무조건 Union-Find부터 의심&lt;/b&gt;해야 해.&lt;/p&gt;
&lt;hr data-end=&quot;2259&quot; data-start=&quot;2256&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2317&quot; data-start=&quot;2261&quot; data-ke-size=&quot;size26&quot;&gt;✔ &lt;b&gt;1) &quot;합치기(union) / 묶기 / 연결하기 / 같은 그룹&quot;이라는 표현이 나올 때&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2320&quot; data-start=&quot;2318&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2419&quot; data-start=&quot;2321&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2346&quot; data-start=&quot;2321&quot;&gt;친구 관계(Friend Network)&lt;/li&gt;
&lt;li data-end=&quot;2361&quot; data-start=&quot;2347&quot;&gt;SNS 팔로우 묶기&lt;/li&gt;
&lt;li data-end=&quot;2374&quot; data-start=&quot;2362&quot;&gt;같은 팀 만들기&lt;/li&gt;
&lt;li data-end=&quot;2395&quot; data-start=&quot;2375&quot;&gt;섬/영역/구역을 하나로 합치기&lt;/li&gt;
&lt;li data-end=&quot;2419&quot; data-start=&quot;2396&quot;&gt;사람/도형/원소들을 같은 집합으로 묶기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2424&quot; data-start=&quot;2421&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2466&quot; data-start=&quot;2426&quot; data-ke-size=&quot;size26&quot;&gt;✔ &lt;b&gt;2) 결과가 &quot;그룹 크기&quot; 또는 &quot;연결 요소 개수&quot;일 때&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2533&quot; data-start=&quot;2467&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2488&quot; data-start=&quot;2467&quot;&gt;&amp;ldquo;현재 속한 네트워크의 인원 출력&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;2507&quot; data-start=&quot;2489&quot;&gt;&amp;ldquo;몇 개의 영역이 생기는가?&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;2520&quot; data-start=&quot;2508&quot;&gt;&amp;ldquo;그룹별 개수는?&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;2533&quot; data-start=&quot;2521&quot;&gt;&amp;ldquo;분리된 구역은?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2538&quot; data-start=&quot;2535&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2585&quot; data-start=&quot;2540&quot; data-ke-size=&quot;size26&quot;&gt;✔ &lt;b&gt;3) 서로 겹치거나 닿는 기하학 도형(선분, 원, 직사각형) 문제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2600&quot; data-start=&quot;2586&quot; data-ke-size=&quot;size16&quot;&gt;이 문제도 여기에 해당됨.&lt;/p&gt;
&lt;p data-end=&quot;2607&quot; data-start=&quot;2602&quot; data-ke-size=&quot;size16&quot;&gt;유형 예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2680&quot; data-start=&quot;2608&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2638&quot; data-start=&quot;2608&quot;&gt;원 1억 개 &amp;rarr; 겹치는 원들을 하나의 영역으로 묶기&lt;/li&gt;
&lt;li data-end=&quot;2661&quot; data-start=&quot;2639&quot;&gt;직사각형이 맞닿는지 파악하기 &amp;rarr; 묶기&lt;/li&gt;
&lt;li data-end=&quot;2680&quot; data-start=&quot;2662&quot;&gt;점/선분이 이어지는지 &amp;rarr; 묶기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2685&quot; data-start=&quot;2682&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2732&quot; data-start=&quot;2687&quot; data-ke-size=&quot;size26&quot;&gt;✔ &lt;b&gt;4) 실시간으로 &amp;ldquo;두 개의 무언가를 연결하라&amp;rdquo; &amp;rarr; 이후 질의 발생&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2735&quot; data-start=&quot;2733&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2779&quot; data-start=&quot;2736&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2756&quot; data-start=&quot;2736&quot;&gt;A와 B를 같은 집합으로 만들어라&lt;/li&gt;
&lt;li data-end=&quot;2779&quot; data-start=&quot;2757&quot;&gt;이후 X와 Y가 같은 집합인지 물어봄&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2807&quot; data-start=&quot;2781&quot; data-ke-size=&quot;size16&quot;&gt;이런 구조는 &lt;b&gt;90% Union-Find&lt;/b&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;2812&quot; data-start=&quot;2809&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2866&quot; data-start=&quot;2814&quot; data-ke-size=&quot;size26&quot;&gt;✔ &lt;b&gt;5) BFS/DFS로 하면 10^6~10^7 이상 연결 관계가 생겨서 느릴 때&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2900&quot; data-start=&quot;2867&quot; data-ke-size=&quot;size16&quot;&gt;Union-Find는 거의 O(1)로 작동하니 훨씬 적합함.&lt;/p&gt;
&lt;hr data-end=&quot;2905&quot; data-start=&quot;2902&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2935&quot; data-start=&quot;2907&quot;&gt;  Union-Find 자주 나오는 대표 문제&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3160&quot; data-start=&quot;2937&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3160&quot; data-start=&quot;2965&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;유형&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3001&quot; data-start=&quot;2965&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2975&quot; data-start=&quot;2965&quot;&gt;친구/네트워크&lt;/td&gt;
&lt;td data-end=&quot;3001&quot; data-start=&quot;2975&quot; data-col-size=&quot;sm&quot;&gt;Friend Network, 집합의 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3027&quot; data-start=&quot;3002&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3011&quot; data-start=&quot;3002&quot;&gt;기하학 영역&lt;/td&gt;
&lt;td data-end=&quot;3027&quot; data-start=&quot;3011&quot; data-col-size=&quot;sm&quot;&gt;원/직사각형 접촉 문제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3064&quot; data-start=&quot;3028&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3040&quot; data-start=&quot;3028&quot;&gt;서버/컴퓨터 연결&lt;/td&gt;
&lt;td data-end=&quot;3064&quot; data-start=&quot;3040&quot; data-col-size=&quot;sm&quot;&gt;네트워크 연결 여부, 최소 비용 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3091&quot; data-start=&quot;3065&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3073&quot; data-start=&quot;3065&quot;&gt;클러스터링&lt;/td&gt;
&lt;td data-end=&quot;3091&quot; data-start=&quot;3073&quot; data-col-size=&quot;sm&quot;&gt;그룹 묶기, 그룹 수 세기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3119&quot; data-start=&quot;3092&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3105&quot; data-start=&quot;3092&quot;&gt;부모-자식/팀 배정&lt;/td&gt;
&lt;td data-end=&quot;3119&quot; data-start=&quot;3105&quot; data-col-size=&quot;sm&quot;&gt;A와 B는 같은 팀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3160&quot; data-start=&quot;3120&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3140&quot; data-start=&quot;3120&quot;&gt;어떤 조건에 의해 &amp;ldquo;둘을 연결&amp;rdquo;&lt;/td&gt;
&lt;td data-end=&quot;3160&quot; data-start=&quot;3140&quot; data-col-size=&quot;sm&quot;&gt;예: 길이 연결되면 같은 구역&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;3165&quot; data-start=&quot;3162&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3202&quot; data-start=&quot;3167&quot;&gt;⭐ 앞으로 이런 문제 보면 바로 Union-Find 떠올리기&lt;/h1&gt;
&lt;p data-end=&quot;3232&quot; data-start=&quot;3204&quot; data-ke-size=&quot;size16&quot;&gt;문제를 보면 &lt;b&gt;딱 두 가지 체크&lt;/b&gt;만 하면 된다.&lt;/p&gt;
&lt;h3 data-end=&quot;3266&quot; data-start=&quot;3234&quot; data-ke-size=&quot;size23&quot;&gt;✔ Q1. &quot;두 개의 무언가를 연결해야 하나?&quot;&lt;/h3&gt;
&lt;p data-end=&quot;3288&quot; data-start=&quot;3267&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; YES면 Union-Find 후보.&lt;/p&gt;
&lt;h3 data-end=&quot;3334&quot; data-start=&quot;3290&quot; data-ke-size=&quot;size23&quot;&gt;✔ Q2. &quot;그룹 크기 / 그룹 개수 / 같은 그룹 여부&quot; 출력인가?&lt;/h3&gt;
&lt;p data-end=&quot;3353&quot; data-start=&quot;3335&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 100% Union-Find.&lt;/p&gt;
&lt;p data-end=&quot;3382&quot; data-start=&quot;3355&quot; data-ke-size=&quot;size16&quot;&gt;이 두 조건이 동시에 나오면 &amp;rarr; &lt;b&gt;확정&lt;/b&gt;이다.&lt;/p&gt;</description>
      <category>코딩테스트 준비</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/385</guid>
      <comments>https://gom3rye.tistory.com/385#entry385comment</comments>
      <pubDate>Tue, 9 Dec 2025 23:50:06 +0900</pubDate>
    </item>
    <item>
      <title>투 포인터를 쓸 수 있는 문제 유형 10가지</title>
      <link>https://gom3rye.tistory.com/384</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;공통점은 전부 &lt;b&gt;두 개의 증가하는 포인터로 어떤 조건을 만족하는 두 수(또는 구간)를 찾는 형태&lt;/b&gt;라는 점!&lt;/p&gt;
&lt;hr data-end=&quot;150&quot; data-start=&quot;147&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;197&quot; data-start=&quot;152&quot;&gt;  1. &lt;b&gt;차이(difference)가 특정 값이 되는 두 수 찾기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;243&quot; data-start=&quot;198&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대표 문제:&lt;/b&gt; &amp;ldquo;수열에서 |A[j] &amp;ndash; A[i]| = K 되는 쌍 찾기&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;373&quot; data-start=&quot;244&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;342&quot; data-start=&quot;244&quot;&gt;정렬된 배열에서
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;342&quot; data-start=&quot;259&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;282&quot; data-start=&quot;259&quot;&gt;diff &amp;lt; K &amp;rarr; right 증가&lt;/li&gt;
&lt;li data-end=&quot;307&quot; data-start=&quot;285&quot;&gt;diff &amp;gt; K &amp;rarr; left 증가&lt;/li&gt;
&lt;li data-end=&quot;342&quot; data-start=&quot;310&quot;&gt;diff == K &amp;rarr; 정답 처리 후 right 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;373&quot; data-start=&quot;343&quot;&gt;딱 이 문제 &lt;b&gt;다이어트 문제 구현과 동일 패턴&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;378&quot; data-start=&quot;375&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;435&quot; data-start=&quot;380&quot;&gt;  2. &lt;b&gt;두 수의 합이 특정 값이 되는 pair 찾기 (Two-Sum sorted)&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;461&quot; data-start=&quot;436&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시:&lt;/b&gt; BOJ 3273 두 수의 합&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;543&quot; data-start=&quot;462&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;487&quot; data-start=&quot;462&quot;&gt;sum &amp;lt; target &amp;rarr; left++&lt;/li&gt;
&lt;li data-end=&quot;514&quot; data-start=&quot;488&quot;&gt;sum &amp;gt; target &amp;rarr; right--&lt;/li&gt;
&lt;li data-end=&quot;543&quot; data-start=&quot;515&quot;&gt;sum == target &amp;rarr; answer++&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;599&quot; data-start=&quot;545&quot; data-ke-size=&quot;size16&quot;&gt;이 문제는 하나는 증가, 하나는 감소지만&lt;br /&gt;&amp;ldquo;조건 비교를 통한 포인터 이동&amp;rdquo;이라는 패턴은 동일.&lt;/p&gt;
&lt;hr data-end=&quot;604&quot; data-start=&quot;601&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;646&quot; data-start=&quot;606&quot;&gt;  3. &lt;b&gt;두 수의 합이 특정 값 이하인 최대 pair 수&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;685&quot; data-start=&quot;647&quot; 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-end=&quot;753&quot; data-start=&quot;686&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;735&quot; data-start=&quot;686&quot;&gt;weight[left] + weight[right] &amp;le; limit &amp;rarr; left++&lt;/li&gt;
&lt;li data-end=&quot;753&quot; data-start=&quot;736&quot;&gt;아니면 &amp;rarr; right--&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;755&quot; data-ke-size=&quot;size16&quot;&gt;특정 한계를 넘지 않는 최적의 조합을 찾는 문제.&lt;/p&gt;
&lt;hr data-end=&quot;787&quot; data-start=&quot;784&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;826&quot; data-start=&quot;789&quot;&gt;  4. &lt;b&gt;두 수의 차이가 최소가 되는 pair 찾기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;892&quot; data-start=&quot;827&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수열이 정렬되어 있을 때 가능한 가장 작은 차이를 찾는 문제&lt;/b&gt;&lt;br /&gt;예: &amp;ldquo;수열에서 두 수의 최소 차이 찾기&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;967&quot; data-start=&quot;893&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;915&quot; data-start=&quot;893&quot;&gt;diff &amp;lt; best &amp;rarr; 업데이트&lt;/li&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;916&quot;&gt;diff == 0 &amp;rarr; 바로 종료&lt;/li&gt;
&lt;li data-end=&quot;967&quot; data-start=&quot;938&quot;&gt;diff &amp;gt; best &amp;rarr; left/right 조절&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;972&quot; data-start=&quot;969&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1007&quot; data-start=&quot;974&quot;&gt;  5. &lt;b&gt;정렬된 배열에서 제곱 수 차이 문제&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1090&quot; data-start=&quot;1008&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;x&amp;sup2; - y&amp;sup2; = C&lt;br /&gt;를 만족하는 x, y 찾기&lt;br /&gt;&amp;rarr; 바로 다이어트 문제와 동일 패턴&lt;br /&gt;(x&amp;sup2; - y&amp;sup2; = (x+y)(x-y))&lt;/p&gt;
&lt;p data-end=&quot;1118&quot; data-start=&quot;1092&quot; data-ke-size=&quot;size16&quot;&gt;다른 N에서 나오는 변형 문제로 자주 등장한다.&lt;/p&gt;
&lt;hr data-end=&quot;1123&quot; data-start=&quot;1120&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1178&quot; data-start=&quot;1125&quot;&gt;  6. &lt;b&gt;부분합이 특정 값 이상 되는 최소 구간 (투포인터 + 슬라이딩 윈도우)&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1198&quot; data-start=&quot;1179&quot; data-ke-size=&quot;size16&quot;&gt;예: BOJ 1806 &amp;ldquo;부분합&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1259&quot; data-start=&quot;1199&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1225&quot; data-start=&quot;1199&quot;&gt;sum &amp;lt; target &amp;rarr; right++&lt;/li&gt;
&lt;li data-end=&quot;1259&quot; data-start=&quot;1226&quot;&gt;sum &amp;ge; target &amp;rarr; 길이 갱신 후 left++&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1310&quot; data-start=&quot;1261&quot; data-ke-size=&quot;size16&quot;&gt;이 문제는 &quot;합&quot; 기반이지만&lt;br /&gt;포인터를 한 번씩 증가시키는 단조 탐색이라는 점이 동일.&lt;/p&gt;
&lt;hr data-end=&quot;1315&quot; data-start=&quot;1312&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1360&quot; data-start=&quot;1317&quot;&gt;  7. &lt;b&gt;연속 부분수열이 특정 조건을 만족하는 최대/최소 길이&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1408&quot; data-start=&quot;1361&quot; data-ke-size=&quot;size16&quot;&gt;예: &amp;ldquo;서로 다른 숫자가 K개 이하가 되도록 하는 최대 구간 길이&amp;rdquo;&lt;br /&gt;투포인터로&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1449&quot; data-start=&quot;1409&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1428&quot; data-start=&quot;1409&quot;&gt;조건 만족 &amp;rarr; right++&lt;/li&gt;
&lt;li data-end=&quot;1449&quot; data-start=&quot;1429&quot;&gt;조건 만족 안 함 &amp;rarr; left++&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1478&quot; data-start=&quot;1451&quot; data-ke-size=&quot;size16&quot;&gt;단조성 + 윈도우라는 점에서 구조가 완전히 동일.&lt;/p&gt;
&lt;hr data-end=&quot;1483&quot; data-start=&quot;1480&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1523&quot; data-start=&quot;1485&quot;&gt;  8. &lt;b&gt;두 배열에서 x + y = target 찾기&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1601&quot; data-start=&quot;1524&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1542&quot; data-start=&quot;1524&quot;&gt;배열 A의 포인터 i 증가&lt;/li&gt;
&lt;li data-end=&quot;1601&quot; data-start=&quot;1543&quot;&gt;배열 B의 포인터 j 감소&lt;br /&gt;두 포인터의 상방향/하방향 이동으로 target을 찾는 투포인터 패턴.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1606&quot; data-start=&quot;1603&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1642&quot; data-start=&quot;1608&quot;&gt;  9. &lt;b&gt;A[i] * B[j] 특정 비교 문제&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1679&quot; data-start=&quot;1643&quot; data-ke-size=&quot;size16&quot;&gt;예: &amp;ldquo;곱이 특정 값을 넘지 않는 쌍의 개수 세기&amp;rdquo; 같은 문제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1726&quot; data-start=&quot;1680&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1709&quot; data-start=&quot;1680&quot;&gt;product &amp;lt; target &amp;rarr; left++&lt;/li&gt;
&lt;li data-end=&quot;1726&quot; data-start=&quot;1710&quot;&gt;else &amp;rarr; right--&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1755&quot; data-start=&quot;1728&quot; data-ke-size=&quot;size16&quot;&gt;sum, diff 뿐 아니라 곱에 대해서도 가능.&lt;/p&gt;
&lt;hr data-end=&quot;1760&quot; data-start=&quot;1757&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1812&quot; data-start=&quot;1762&quot;&gt;  10. &lt;b&gt;두 개의 리스트 병합(Merge Two Sorted Lists)&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1912&quot; data-start=&quot;1813&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1849&quot; data-start=&quot;1813&quot;&gt;두 리스트의 pointer를 각각 비교하며 오른쪽으로 이동&lt;/li&gt;
&lt;li data-end=&quot;1912&quot; data-start=&quot;1850&quot;&gt;정렬된 결과를 만든다&lt;br /&gt;두 포인터가 단조하게 증가하며 전체를 스캔한다는 점에서&lt;br /&gt;투포인터의 기본형 문제.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1917&quot; data-start=&quot;1914&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1932&quot; data-start=&quot;1919&quot;&gt;  전체 패턴 요약&lt;/h1&gt;
&lt;p data-end=&quot;1961&quot; data-start=&quot;1934&quot; data-ke-size=&quot;size16&quot;&gt;투포인터가 사용되는 상황은 다음 조건을 만족한다:&lt;/p&gt;
&lt;h3 data-end=&quot;2001&quot; data-start=&quot;1963&quot; data-ke-size=&quot;size23&quot;&gt;✔ 1. 배열 또는 수열이 &quot;단조성(정렬)&quot;을 가지고 있고&lt;/h3&gt;
&lt;h3 data-end=&quot;2001&quot; data-start=&quot;1963&quot; data-ke-size=&quot;size23&quot;&gt;✔ 2. 포인터가 움직일 때 항상 앞으로만 가고&lt;br /&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;h3 data-end=&quot;2001&quot; data-start=&quot;1963&quot; data-ke-size=&quot;size23&quot;&gt;✔ 3. 전체 복잡도가 O(N) 또는 O(N log N)으로 해결돼야 할 때&lt;br /&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2140&quot; data-start=&quot;2083&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;어떤 조건(합, 차이, 곱 등)을 만족하는 두 위치를 찾는 구조&lt;/b&gt;면 대부분 투포인터로 가능함.&lt;/p&gt;
&lt;hr data-end=&quot;2145&quot; data-start=&quot;2142&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2334&quot; data-start=&quot;2283&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&amp;ldquo;증가/감소에 따라 diff 단조 변화를 가진다&quot;&lt;br /&gt;= &lt;b&gt;투포인터 조건 만족&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2361&quot; data-start=&quot;2336&quot; data-ke-size=&quot;size16&quot;&gt;그래서 정렬도 필요 없고 투포인터가 바로 답.&lt;/p&gt;</description>
      <category>코딩테스트 준비</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/384</guid>
      <comments>https://gom3rye.tistory.com/384#entry384comment</comments>
      <pubDate>Mon, 8 Dec 2025 20:23:09 +0900</pubDate>
    </item>
    <item>
      <title>팀 프로젝트) (topic생성) MSK 테스트를 위한 bastion host EC2 만들기</title>
      <link>https://gom3rye.tistory.com/383</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;MSK는 강력한 기능이지만&amp;hellip; strimzi처럼 직접 topic을 생성하는 기능도 없고 제대로 들어오고있는지, 시험삼아 메시지 보내보고~ 이런 간단한 테스트를 위한 UI가 따로 제공되지는 않기 때문에!! 테스트를 해보려면 같은 VPC 대역에 있는 누군가를 위하여 원격으로 해보아야 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;167&quot; data-ke-size=&quot;size16&quot;&gt;이미 같은 VPC에 있는 EKS들을 써도 되지만, 한창 바쁜 때에 끼어들고 싶지 않기 때문에 이거 전용의 작고 소중한 EC2를 만들기로 했다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;251&quot; data-ke-size=&quot;size16&quot;&gt;실제 업계에서도 스탠다드로 사용하는 방식이라고 하네요. 그래서 쓰는 용어가 배스쳔호스트(bastion host)이다.&lt;/p&gt;
&lt;h1 id=&quot;EC2를-만들자&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;322&quot;&gt;EC2를 만들자&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자유롭게 하되, VPC는 solog-unified-vpc를 선택해줍니다!!&lt;/li&gt;
&lt;li&gt;보안그룹은 따로 만들어서 9092 등을 개방해도 되고, 이미 있는걸 써도 됨. 우리는 msk cluster가 쓰는 보안그룹을 재활용하기로 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;Kafka를-설치하자&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;465&quot;&gt;Kafka를 설치하자&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;478&quot; data-ke-size=&quot;size16&quot;&gt;만들어진 EC2에 접속한 후, kafka client부터 깔아준다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823282839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install -y openjdk-11-jre
sudo apt install -y make

wget https://downloads.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.tgz
tar -xzf kafka_2.13-3.9.0.tgz

echo &quot;export KAFKA_HOME=~/kafka_2.13-3.9.0&quot; &amp;gt;&amp;gt; ~/.bashrc
echo &quot;export PATH=\$PATH:\$KAFKA_HOME/bin&quot; &amp;gt;&amp;gt; ~/.bashrc
source ~/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;826&quot; data-ke-size=&quot;size16&quot;&gt;이제 어느 경로에서던 kafka-어쩌구.sh를 실행할 수 있게 되었다. tab으로 자동완성도 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;886&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;MSK-테스트해보기&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;888&quot;&gt;MSK 테스트해보기&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;900&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;902&quot; data-ke-size=&quot;size16&quot;&gt;일단 MSK의 부트스트랩 주소로 사용할&amp;hellip; 9092로 끝나는 엔드포인트 주소 뭉탱이를 터미널 변수로 해둡시다&amp;hellip; 매번 치기엔 너무 기니까&amp;hellip;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823303942&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MSK=&quot;(endpoint주소!!)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: #000000; color: #292a2e;&quot; data-testid=&quot;renderer-code-block&quot; data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span data-ds--code--row=&quot;&quot; data-testid=&quot;renderer-code-block-line-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1762823311830&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MSK=&quot;b-2.sologmskcluster.81f2k0.c4.kafka.ap-northeast-2.amazonaws.com:9092,b-1.sologmskcluster.81f2k0.c4.kafka.ap-northeast-2.amazonaws.com:9092&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;kafka-topic-만들기-test&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1150&quot; data-ke-size=&quot;size26&quot;&gt;kafka topic 만들기 test&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823327438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kafka-topics.sh --bootstrap-server $MSK \
                --create \
                --topic test-topic \
                --replication-factor 2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1318&quot; data-ke-size=&quot;size16&quot;&gt;일단 사용할 명령어는 kafka-topics.sh 이고, 옵션을 주렁주렁 줘야 하는데 차례대로&amp;hellip;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1374&quot; data-ke-size=&quot;size16&quot;&gt;--bootstrap-server : 접속할 카프카 클러스터의 주소. 아까 참고로 줬던 MSK의 주소 정보를 사용하면 된다. 암호화 없는 버전이니까 plaintext 버전, 즉 9092로 끝나는 주소를 넣어주면 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1504&quot; data-ke-size=&quot;size16&quot;&gt;--create 토픽 만들겠다는 뜻이죠? 나중에 만든 토픽 확인할 때는 이거를 --list 로 변경하면 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1568&quot; data-ke-size=&quot;size16&quot;&gt;--topic 이게 중요한 부분. 그래서 어떤 토픽을 만들건데?? 이다. 테스트니까 test-topic 이라고 해줬는데 실제로 만들 때는 실제로 사용할 토픽 이름을 여기에 써주면 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1675&quot; data-ke-size=&quot;size16&quot;&gt;--replication-factor 자가복제를 몇개 하겠냐는건데, 보통은 브로커 수만큼 해준다. 우리 브로커는 현재 두개니까 2로 넣어준다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1759&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1761&quot; data-ke-size=&quot;size16&quot;&gt;잘 만들어졌는지는 아래의 명령어로 테스트 해봅시다. 앞서 말했듯 create 대신 list 옵션을 주면 된다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823404527&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kafka-topics.sh --bootstrap-server $MSK --list&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: #000000; color: #292a2e;&quot; data-testid=&quot;renderer-code-block&quot; data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span data-ds--code--row=&quot;&quot; data-testid=&quot;renderer-code-block-line-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1875&quot; data-ke-size=&quot;size16&quot;&gt;결과값에 아까 만든 test-topic이 포함되어 있는지 확인해보자.&lt;/p&gt;
&lt;h2 id=&quot;kafka-topic-consume-&amp;amp;-produce-test&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1918&quot; data-ke-size=&quot;size26&quot;&gt;kafka topic consume &amp;amp; produce test &lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1955&quot; data-ke-size=&quot;size16&quot;&gt;이제 아까 만든 토픽에 뭔가를 produce해보고, 그게 잘 consume 되는지 확인해보자.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2011&quot; data-ke-size=&quot;size16&quot;&gt;일단 produce 되자마자 들어오는지 보기 이해서 consumer를 먼저 켜둔다. 둘이 동시에 진행해야 하니 ssh 접속도 두개를 유지해주자.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2095&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2097&quot; data-ke-size=&quot;size16&quot;&gt;먼저 아까 만든 test-topic을 대상으로 consumer를 켜둔다. 부트스트랩 서버는 아까랑 동일하게 우리의 MSK 클러스터 주소로 하고&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823435430&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kafka-console-consumer.sh --bootstrap-server $MSK --topic test-topic&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: #000000; color: #292a2e;&quot; data-testid=&quot;renderer-code-block&quot; data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span data-ds--code--row=&quot;&quot; data-testid=&quot;renderer-code-block-line-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2253&quot; data-ke-size=&quot;size16&quot;&gt;그럼 구독중인 상태가 된다. 아직 아무것도 안 뜰텐데, 그냥 그렇게 두시구 다른 ssh 창으로 넘어가서~&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2314&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2316&quot; data-ke-size=&quot;size16&quot;&gt;produce를 해보자. 동일한 부트스트랩 주소를 사용하고, 같은 test-topic을 대상으로 발행할 것이다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823457821&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kafka-console-producer.sh --bootstrap-server $MSK --topic test-topic&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: #000000; color: #292a2e;&quot; data-testid=&quot;renderer-code-block&quot; data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span data-ds--code--row=&quot;&quot; data-testid=&quot;renderer-code-block-line-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2452&quot; data-ke-size=&quot;size16&quot;&gt;이거 하고나면 &amp;gt; 표시가 뜰텐데, 여기서 뭔가 원하는걸 입력하고 엔터를 누르면 아까 구독해둔 consumer 측에 같은 메시지가 전송될 것이다!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2534&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2536&quot; data-ke-size=&quot;size16&quot;&gt;좌측 프로듀서가 보낸 Consumer Test 가 우측 consumer에 보이는 걸 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xP4DN/dJMcacam3Vt/tpooA8Ml3TKskh9CuoaZN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xP4DN/dJMcacam3Vt/tpooA8Ml3TKskh9CuoaZN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xP4DN/dJMcacam3Vt/tpooA8Ml3TKskh9CuoaZN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxP4DN%2FdJMcacam3Vt%2FtpooA8Ml3TKskh9CuoaZN0%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;846&quot; height=&quot;92&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2613&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2615&quot; data-ke-size=&quot;size16&quot;&gt;이제 여기서 우리가 실제로 사용할 topic들 정도만 만들어주고 마무리하면 된다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823513030&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kafka-topics.sh --bootstrap-server $MSK \
                --create \
                --topic service-topic \
                --replication-factor 2

kafka-topics.sh --bootstrap-server $MSK \
                --create \
                --topic system-auth-topic \
                --replication-factor 2

kafka-topics.sh --bootstrap-server $MSK \
                --create \
                --topic system-kmsg-topic \
                --replication-factor 2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3122&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3124&quot; data-ke-size=&quot;size16&quot;&gt;+ bastion host EC2의 기본 홈에 Makefile을 만들어둠. 아래의 명령어들로 간편한 동작 가능~~&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3189&quot; data-ke-size=&quot;size16&quot;&gt;Makefile (최상단 MSK 내용을 최신의 MSK bootstrap-server로 수정해서 만들고 사용하기!)&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823527350&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MSK=&quot;b-2.sologmskcluster.81f2k0.c4.kafka.ap-northeast-2.amazonaws.com:9092,b-1.sologmskcluster.81f2k0.c4.kafka.ap-northeast-2.amazonaws.com:9092&quot;

topics:
        kafka-topics.sh --bootstrap-server ${MSK} --list

service:
        kafka-console-consumer.sh --bootstrap-server ${MSK} --topic service-topic

kmsg:
        kafka-console-consumer.sh --bootstrap-server ${MSK} --topic system-kmsg-topic

auth:
        kafka-console-consumer.sh --bootstrap-server ${MSK} --topic system-auth-topic&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽 목록 확인하기&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;pre id=&quot;code_1762823539798&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make topics&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;service-topic 구독하기&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823554093&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: #000000; color: #292a2e;&quot; data-testid=&quot;renderer-code-block&quot; data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span data-ds--code--row=&quot;&quot; data-testid=&quot;renderer-code-block-line-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;system-kmsg-topic 구독하기&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823564597&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make kmsg&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: #000000; color: #292a2e;&quot; data-testid=&quot;renderer-code-block&quot; data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span data-ds--code--row=&quot;&quot; data-testid=&quot;renderer-code-block-line-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;system-auth-topic 구독하기&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823572965&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make auth&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: #000000; color: #292a2e;&quot; data-testid=&quot;renderer-code-block&quot; data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span data-ds--code--row=&quot;&quot; data-testid=&quot;renderer-code-block-line-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3896&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3898&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3900&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>현대 오토에버 클라우드 스쿨</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/383</guid>
      <comments>https://gom3rye.tistory.com/383#entry383comment</comments>
      <pubDate>Tue, 11 Nov 2025 10:14:15 +0900</pubDate>
    </item>
    <item>
      <title>팀 프로젝트) AWS MSK 구축하기 (feat. Terraform)</title>
      <link>https://gom3rye.tistory.com/382</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;공식문서: &lt;span data-renderer-start-pos=&quot;7&quot; data-annotation-mark=&quot;true&quot; data-annotation-inline-node=&quot;true&quot; data-card-url=&quot;https://docs.aws.amazon.com/ko_kr/msk/latest/developerguide/what-is-msk.html&quot; data-inline-card=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span data-testid=&quot;hover-card-trigger-wrapper&quot;&gt;&lt;a style=&quot;background-color: #ffffff; color: #1868db;&quot; href=&quot;https://docs.aws.amazon.com/ko_kr/msk/latest/developerguide/what-is-msk.html&quot; data-testid=&quot;inline-card-resolved-view&quot;&gt;&lt;span data-testid=&quot;inline-card-icon-and-title&quot;&gt;&lt;span data-testid=&quot;icon-position-wrapper&quot;&gt;&lt;/span&gt;&lt;span&gt;Amazon MSK 개발자 안내서에 오신 것을 환영합니다. - Amazon Managed Streaming for Apache Kafka&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;MSK(Managed Streaming for Apache Kafka): 고가용성을 갖춘 Apache Kafka 클러스터. AWS에서 완전 관리형으로 제공하므로 내부적인 브로커 설정, zookeeprt나 kraft 컨트롤러 등을 직접 설치하고 관리할 필요 없이 알아서 다 해줌.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;171&quot; data-ke-size=&quot;size16&quot;&gt;구축되면 &lt;b&gt;&lt;u data-renderer-mark=&quot;true&quot;&gt;bootstrapserver를 엔드포인트&lt;/u&gt;&lt;/b&gt;를 노출시켜주므로, 기존의 kafka 클러스터로 구성된 아키텍쳐에서 &lt;b&gt;&lt;u data-renderer-mark=&quot;true&quot;&gt;해당 주소만 바꿔치기&lt;/u&gt;&lt;/b&gt; 하면 간편하게 마이그레이션이 가능하다!!!!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;171&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;275&quot; data-ke-size=&quot;size16&quot;&gt;즉, 특정 VPC에 위치하여 같은 VPC 대역 안에 있는 친구들이 bootstrapserver로 접근 가능하게 함. HA를 위해 최소 2개 이상 AZ에 속한 서브넷을 필요로 하며, 서브넷당 1개 이상의 브로커가 배치됨. (브로커가 모든 AZ에 고르게 퍼져야 하는 듯. AZ가 2개면 브로커 갯수도 2의 배수로 설정해야 함 안그럼 에러 남ㅠ)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;469&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;471&quot; data-ke-size=&quot;size16&quot;&gt;준비물: 소속될 VPC, 서브넷, 보안그룹, 필요시 KSM 키나 IAM역할(우리는 생략)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;523&quot; data-ke-size=&quot;size16&quot;&gt;serverless 비용: 존재하는 것 만으로 드는 비용 + 데이터가 오가는 양마다 드는 비용(GB단위)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;584&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;586&quot; data-ke-size=&quot;size16&quot;&gt;Terraform을 이용해 원클릭으로 배포 및 삭제가 가능하도록 할 예정 (15-30분 소요)&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;640&quot; data-ke-size=&quot;size20&quot;&gt;msk.tf&lt;/h4&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823154657&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Terraform AWS Provider 설정
terraform {
  required_providers {
    aws = {
      source  = &quot;hashicorp/aws&quot;
      version = &quot;~&amp;gt; 5.0&quot; 
    }
  }
}

provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot; 
}

# 1. 기존 리소스 정보 가져오기 (Data Sources)
# --- 1-1. 기존 VPC 정보 가져오기 ---
data &quot;aws_vpc&quot; &quot;solog_vpc&quot; {
  tags = {
    Name = &quot;solog-unified-vpc&quot;
  }
}

# --- 1-2. MSK 브로커를 배치할 기존 서브넷 정보 가져오기 ---
data &quot;aws_subnets&quot; &quot;solog_public_subnets&quot; {
  filter {
    name   = &quot;vpc-id&quot;
    values = [data.aws_vpc.solog_vpc.id]
  }
}

# --- 1-3. 기존 EKS 워커 노드의 보안 그룹 정보 가져오기 ---
data &quot;aws_security_group&quot; &quot;eks_producer_sg&quot; {
  tags = {
    Name = &quot;eks-cluster-sg-eks-datacenter-cluster-1029477356&quot;
  }
}

data &quot;aws_security_group&quot; &quot;eks_consumer_sg&quot; {
  tags = {
    Name = &quot;eks-cluster-sg-eks-monitoring-cluster-1453820597&quot;
  }
}

# 2. MSK 클러스터를 위한 새 보안 그룹 생성
#variable &quot;kafka_ports&quot; {
#  description = &quot;EKS가 MSK에 접속하기 위해 열어줄 Kafka 포트 목록&quot;
#  type        = list(number)
#  default     = [9092, 9098, 9094] 
#}

resource &quot;aws_security_group&quot; &quot;msk_sg&quot; {
  name        = &quot;my-msk-cluster-sg&quot;
  description = &quot;Allow inbound traffic from EKS worker nodes to MSK&quot;
  vpc_id      = data.aws_vpc.solog_vpc.id

  # --- 인바운드 규칙 (Ingress) ---
  ingress {
    from_port                = 0
    to_port                  = 0
    protocol                 = &quot;-1&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  # --- 아웃바운드 규칙 (Egress) ---
  # MSK가 외부(EKS 응답 등)와 통신하기 위해 모든 아웃바운드를 허용합니다.
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = &quot;-1&quot; # 모든 프로토콜
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  tags = {
    Name = &quot;my-msk-cluster-sg&quot;
  }
}

# 3. AWS MSK 클러스터 생성 (KRaft + EBS)
resource &quot;aws_msk_cluster&quot; &quot;msk_cluster&quot; {
  cluster_name = &quot;solog-msk-cluster2&quot;

  kafka_version = &quot;3.6.0&quot;

  number_of_broker_nodes = 2
  broker_node_group_info {
    instance_type = &quot;kafka.t3.small&quot;

    client_subnets  = data.aws_subnets.solog_public_subnets.ids
    security_groups = [aws_security_group.msk_sg.id]

    storage_info {
      ebs_storage_info {
        volume_size = 100
        # volume_type = &quot;GP3&quot; # (선택) GP3 타입을 명시할 수 있습니다.
        # throughput = 125    # (선택) GP3 사용 시 처리량 (MiB/s)
      }
    }
  }

  # --- 보안 및 인증 설정 --- 안해~
  client_authentication {
    #sasl {
      #iam = true
    #}
    unauthenticated = true
  }

  # 전송 중 암호화 (네트워크 트래픽 암호화)
  encryption_info {
    encryption_in_transit {
      client_broker = &quot;TLS_PLAINTEXT&quot; # TLS_PLAINTEXT, TLS 중 선택
    }
  } 
#
#  # CloudWatch 로깅 설정
  logging_info {
    broker_logs {
      cloudwatch_logs {
        enabled   = true
        log_group = &quot;/aws/msk&quot;
      }
    }
  }

  tags = {
    Name = &quot;my-msk-cluster&quot;
  }
} 

# 4. (선택) 생성된 MSK 클러스터 정보 출력

output &quot;msk_cluster_arn&quot; {
  description = &quot;생성된 MSK 클러스터의 ARN&quot;
  value       = aws_msk_cluster.msk_cluster.arn
}

output &quot;msk_bootstrap_servers_iam&quot; {
  description = &quot;IAM 인증용 부트스트랩 서버 주소&quot;
  value       = aws_msk_cluster.msk_cluster.bootstrap_brokers_sasl_iam
}

output &quot;msk_bootstrap_servers_tls&quot; {
  description = &quot;TLS 인증용 부트스트랩 서버 주소&quot;
  value       = aws_msk_cluster.msk_cluster.bootstrap_brokers_tls
}

output &quot;msk_bootstrap_servers_plaintext&quot; {
  description = &quot;Plaintext (비인증, 9092 포트) 부트스트랩 서버 주소&quot;
  value       = aws_msk_cluster.msk_cluster.bootstrap_brokers
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3885&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3887&quot; data-ke-size=&quot;size16&quot;&gt;이제 output에 정의된 바와 같이 bootstrap server 주소가 stdout으로 출력 될 것임. 잘 킵해뒀다가 쓰면 끝~&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762823181599&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;msk_bootstrap_servers_plaintext = &quot;b-1.sologmskcluster2.tak97t.c4.kafka.ap-northeast-2.amazonaws.com:9092,b-2.sologmskcluster2.tak97t.c4.kafka.ap-northeast-2.amazonaws.com:9092&quot;

msk_bootstrap_servers_tls = &quot;b-1.sologmskcluster2.tak97t.c4.kafka.ap-northeast-2.amazonaws.com:9094,b-2.sologmskcluster2.tak97t.c4.kafka.ap-northeast-2.amazonaws.com:9094&quot;

msk_cluster_arn = &quot;arn:aws:kafka:ap-northeast-2:484400672545:cluster/solog-msk-cluster2/93e22e78-17bc-4d81-9755-4bf53f63b035-4&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4444&quot; data-ke-size=&quot;size16&quot;&gt;우리는 TLS 안 할거라고 했으니 9092 버전, 최상단의 버전을 쓰면 될 것임.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4492&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u data-renderer-mark=&quot;true&quot;&gt;*주의!!!&lt;/u&gt;&lt;/b&gt; 브로커별 주소가 컴마 , 로 연결된 형태로 나타나는데, 이건 고가용성을 위한 표준이므로 전체를 통으로 사용해야 함. &quot;b-1.sologmskcluster2.tak97t.c4.kafka.ap-northeast-2.amazonaws.com:9092,b-2.sologmskcluster2.tak97t.c4.kafka.ap-northeast-2.amazonaws.com:9092&quot; 이거 다 써야 함!!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4492&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4722&quot; data-ke-size=&quot;size16&quot;&gt;상세한 이유&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4733&quot; data-ke-size=&quot;size16&quot;&gt;MSK는 Kubernetes 위에서 동작하는 것이 아니라, AWS의 EC2/VPC 네트워크 위에서 직접 동작합니다. K8s의 Service 같은 자동 중계 기능이 없습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4831&quot; data-ke-size=&quot;size16&quot;&gt;대신 MSK는 Kafka가 원래 설계된 &lt;b&gt;표준 &quot;부트스트랩(Bootstrap)&quot; 방식&lt;/b&gt;을 그대로 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Kafka 클라이언트의 기본 동작:&lt;/b&gt; Kafka 클라이언트(Fluentd, Java, Python 등)는 애초에 &quot;대표 주소 1개&quot;가 아니라 &quot;브로커 주소 목록&quot;을 받도록 설계되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&amp;quot;아무거나-하나만-써도-되나요?&amp;quot;&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5000&quot; data-ke-size=&quot;size26&quot;&gt;&quot;아무거나 하나만 써도 되나요?&quot; &lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5022&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5024&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아니요, 절대 안 됩니다. 반드시 &lt;/b&gt;b-1...:9092,b-2...:9092&lt;b&gt; 전체 목록을 다 사용해야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이유: 고가용성 (High Availability, HA)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5125&quot; data-ke-size=&quot;size16&quot;&gt;만약 b-1 주소 하나만 Fluentd 설정에 넣었다고 가정해 보겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장애 상황:&lt;/b&gt; AWS가 b-1 브로커가 있는 EC2 인스턴스를 점검하거나 해당 하드웨어에 장애가 발생하면, b-1 브로커는 잠시 다운됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과:&lt;/b&gt; Fluentd는 b-1 외에 다른 주소를 모르기 때문에, MSK에 &lt;b&gt;접속 자체가 실패&lt;/b&gt;하고 데이터(로그)는 유실됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5323&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;올바른 설정:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;b-1..., b-2... &lt;b&gt;전체 목록&lt;/b&gt;을 Fluentd 설정에 넣습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장애 상황:&lt;/b&gt; b-1 브로커가 다운됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과:&lt;/b&gt; Fluentd(Kafka 클라이언트)가 &quot;어? b-1이 죽었네. 그럼 목록에 있는 다음 주소(b-2)로 접속해봐야지&quot;라며 &lt;b&gt;자동으로 &lt;/b&gt;b-2&lt;b&gt;에 접속&lt;/b&gt;하여 부트스트랩을 계속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5511&quot; data-ke-size=&quot;size16&quot;&gt;+ 참고: 포트들 뭔 차이?&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-testid=&quot;table-container&quot; data-layout=&quot;custom&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;6a4a64bb-e27e-479d-b831-3bfc9f4744ea&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-layout=&quot;default&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#efefef&quot;&gt;&lt;span&gt;&lt;b&gt;포트&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#efefef&quot;&gt;&lt;span&gt;&lt;b&gt;인증 방식 (Authentication)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#efefef&quot;&gt;&lt;span&gt;&lt;b&gt;암호화 (Encryption)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#efefef&quot;&gt;&lt;span&gt;&lt;b&gt;Terraform (client_authentication)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;9092&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;비인증&lt;/b&gt; (Unauthenticated)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;없음&lt;/b&gt; (Plaintext, 평문)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;unauthenticated = true&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;9094&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;비인증&lt;/b&gt; (Unauthenticated)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;필수&lt;/b&gt; (TLS/SSL)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;unauthenticated = true&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;9096&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;SASL/SCRAM&lt;/b&gt; (ID/PW)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;필수&lt;/b&gt; (TLS/SSL)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;sasl.scram = true&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;9098&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;AWS IAM&lt;/b&gt; (Role/User)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;필수&lt;/b&gt; (TLS/SSL)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;sasl.iam = true&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5919&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5921&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5923&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>현대 오토에버 클라우드 스쿨</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/382</guid>
      <comments>https://gom3rye.tistory.com/382#entry382comment</comments>
      <pubDate>Tue, 11 Nov 2025 10:07:04 +0900</pubDate>
    </item>
    <item>
      <title>팀 프로젝트) Terraform EKS - 3개 클러스터 통합 관리 (VPC 공유)</title>
      <link>https://gom3rye.tistory.com/381</link>
      <description>&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;1. 테라폼(Terraform)이란?&lt;/h2&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;테라폼은 &lt;b&gt;&quot;코드로 인프라를 관리(Infrastructure as Code, IaC)&quot;&lt;/b&gt;하게 해주는 도구이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;선언형 언어:&lt;/b&gt; &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;eksctl&lt;/span&gt;처럼 &quot;클러스터를 만들어 줘&quot;라는 명령을 내리는 것이 아니라, &quot;나는 VPC 1개, 서브넷 3개, EKS 클러스터 1개가 필요해.&quot;라고 &lt;b&gt;원하는 상태를 코드(&lt;/b&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;.tf&lt;/span&gt;&lt;b&gt; 파일)로 선언&lt;/b&gt;한다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;실행 계획:&lt;/b&gt; &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform plan&lt;/span&gt; 명령을 실행하면, 테라폼이 현재 인프라 상태와 코드를 비교해서 &quot;VPC를 새로 만들어야겠네. 서브넷도 3개 만들어야겠다.&quot;처럼 &lt;b&gt;변경 계획&lt;/b&gt;을 보여준다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;상태 관리:&lt;/b&gt; &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform apply&lt;/span&gt;로 계획을 실행하면, 테라폼이 실제로 AWS에 리소스를 생성하고, 생성된 리소스의 정보를 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform.tfstate&lt;/span&gt;라는 파일에 저장한다. 이 덕분에 나중에 코드를 변경해도 무엇이 바뀌어야 하는지 정확히 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;eksctl&lt;/span&gt;이나 CloudFormation과 비교하면, 테라폼은 AWS뿐만 아니라 GCP, Azure 등 &lt;b&gt;다양한 클라우드 제공자를 하나의 언어로 관리&lt;/b&gt;할 수 있고, 코드를 재사용하거나 모듈화하기에 더 유용하다.&lt;/p&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;2. 테라폼 설치&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;orderedList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;다운로드:&lt;/b&gt; HashiCorp 공식 다운로드 페이지에서 본인 OS(Windows, macOS, Linux)에 맞는 파일을 다운로드한다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;설치:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;다운로드한 파일은 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;.zip&lt;/span&gt; 압축 파일이다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;압축을 풀면 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform.exe&lt;/span&gt; (Windows) 또는 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform&lt;/span&gt; (macOS/Linux) 실행 파일 하나가 나온다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;eksctl&lt;/span&gt;을 설치하고 **환경 변수(Path)**에 경로를 추가했던 것과 똑같이, 이 파일을 원하는 폴더(예: &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;C:\Terraform&lt;/span&gt;)에 옮기고 해당 폴더 경로를 시스템 환경 변수 Path에 추가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;설치 확인:&lt;/b&gt; 터미널(CMD 또는 PowerShell)을 새로 열고 아래 명령어를 입력한다. 버전 정보가 나오면 성공이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1762822621563&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;c:\Terraform&amp;gt;terraform --version

Terraform v1.13.4
on windows_386&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;3. 사전 준비 (AWS 자격증명)&lt;/h2&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(1) IAM 사용자 생성 및 액세스키 발급&lt;/h3&gt;
&lt;h4 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size20&quot;&gt;IAM 정책(all) 생성&lt;/h4&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;IAM - 정책 - 정책 생성 - JSON&lt;/p&gt;
&lt;pre id=&quot;code_1762822638257&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
&amp;nbsp; &quot;Version&quot;: &quot;2012-10-17&quot;,
&amp;nbsp; &quot;Statement&quot;: [
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Sid&quot;: &quot;Statement1&quot;,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Effect&quot; : &quot;Allow&quot;,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Action&quot;: [
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;*&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; ],
&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Resource&quot;: [
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;*&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; ]
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size20&quot;&gt;IAM 사용자에 정책연결&lt;/h4&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;권한 설정 : 직접 정책 연결 이전에 만든 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;all&lt;/span&gt; 권한을 설정해준다.&lt;/p&gt;
&lt;h4 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size20&quot;&gt;사용자에게 액세스키 발급&lt;/h4&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;사용자 JWON - 보안자격 증명 - 액세스 키 만들기 - AWS 외부에서 실행되는 애플리케이션 - 액세스키 만들기&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;액세스 키가 만들어지면 따로 저장해놓아야 한다.&lt;/p&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(2) AWS CLI&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;AWS 리소스를 관리하기 위한 명령줄 도구이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;설치 확인:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;codeBlock&quot; data-prosemirror-content-type=&quot;node&quot; data-language=&quot;&quot;&gt;
&lt;div&gt;c:\Terraform&amp;gt;aws --version aws-cli/2.27.58 Python/3.13.4 Windows/11 exe/AMD64&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws configure&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;IAM의 사용자의 access-key 와 secret access-key를 설정해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;aws configure --profile=JWON
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;사용자 생성 시 발급받은 액세스 키를 넣어주면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1762822684129&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AWS Access Key ID [None] : ...
AWS Secret Access Key [None] : ...
Default region name [None] : ap-northeast-2
Default output format [None] : json&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;프로필 확인 : &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws configure list-profiles&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;JWON&lt;/span&gt; 로 생성된 것을 확인 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(3) kubectl&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스 클러스터와 통신하기 위한 명령줄 도구이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;다운로드: &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;curl -O &lt;a href=&quot;https://s3.us-west-2.amazonaws.com/amazon-eks/1.31.0/2024-09-&quot;&gt;https://s3.us-west-2.amazonaws.com/amazon-eks/1.31.0/2024-09-&lt;/a&gt; 12/bin/darwin/amd64/kubectl&lt;/span&gt;&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;설치 확인: &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubectl version --client&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;4.   프로젝트 구조: 3개 EKS 클러스터 통합 관리&lt;/h2&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;이전에는 3개의 클러스터(datacenter, kafka, monitoring)를 생성하기 위해 3개의 개별 폴더에서 각각 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform apply&lt;/span&gt;를 실행하는 방식을 사용했다.&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;이번에 수정된 구조(&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;solog-terraform-unified&lt;/span&gt;)는 &lt;b&gt;단일 테라폼 프로젝트&lt;/b&gt;에서 3개의 EKS 클러스터를 &lt;b&gt;동시에 관리&lt;/b&gt;하는 방식이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;VPC 공유 (비용 절감):&lt;/b&gt; &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;vpc.tf&lt;/span&gt; 파일 하나가 1개의 VPC와 2개의 공용 서브넷을 생성한다. 3개의 모든 클러스터가 이 &lt;b&gt;공유된 네트워크 자원&lt;/b&gt;을 함께 사용한다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;파일 분리 (가독성):&lt;/b&gt; 각 클러스터에 필요한 EKS, IAM 리소스는 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;eks_datacenter.tf&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;iam_datacenter.tf&lt;/span&gt;처럼 기능별/클러스터별 파일로 분리하여 관리가 용이하다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;통합 실행 (효율성):&lt;/b&gt; &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform apply&lt;/span&gt; &lt;b&gt;단 한 번의 실행&lt;/b&gt;으로 3개 클러스터와 모든 부속 자원(VPC, IAM 역할 등)이 동시에 생성, 수정, 삭제된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;5. 테라폼 코드로 EKS 클러스터 3개 동시 구축하기&lt;/h2&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;solog-terraform-unified&lt;/span&gt; 폴더 내의 각 파일은 다음과 같은 역할을 수행한다.&lt;/p&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(1) &lt;a href=&quot;http://provider.tf&quot; data-prosemirror-mark-name=&quot;link&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;provider.tf&lt;/a&gt; : 테라폼 설정 (AWS + Kubernetes)&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;테라폼이 AWS와 통신하고, &lt;b&gt;추가로 생성될 EKS 클러스터 내부(&lt;/b&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth&lt;/span&gt;&lt;b&gt; 수정)와도 통신&lt;/b&gt;할 수 있도록 설정한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubernetes&lt;/span&gt;&lt;b&gt; 프로바이더:&lt;/b&gt; &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf&lt;/span&gt;에서 클러스터 내부의 ConfigMap을 수정하기 위해 필요하다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;alias&lt;/span&gt;&lt;b&gt; (별명):&lt;/b&gt; 3개의 클러스터에 각각 접속해야 하므로, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;datacenter&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kafka&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;monitoring&lt;/span&gt;이라는 &lt;b&gt;별명&lt;/b&gt;을 부여하여 테라폼이 어떤 클러스터에 명령을 내려야 할지 구분할 수 있게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822760401&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# provider.tf

terraform {
&amp;nbsp; required_providers {
&amp;nbsp; &amp;nbsp; aws = {
&amp;nbsp; &amp;nbsp; &amp;nbsp; source = &quot;hashicorp/aws&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; version = &quot;~&amp;gt; 5.0&quot;&amp;nbsp;
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; kubernetes = {
&amp;nbsp; &amp;nbsp; &amp;nbsp; source = &quot;hashicorp/kubernetes&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; version = &quot;~&amp;gt; 2.20&quot;
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; }
}

# AWS 프로바이더 설정
provider &quot;aws&quot; {
&amp;nbsp; region = &quot;ap-northeast-2&quot;
&amp;nbsp; profile = &quot;JWON&quot;&amp;nbsp;
}

# 2. Kubernetes 프로바이더 (클러스터 &quot;내부&quot; 관리용)
# --- 3개 클러스터에 대한 접속 정보를 각각 정의 ---

# 2-1. DataCenter 클러스터 접속 정보
data &quot;aws_eks_cluster&quot; &quot;datacenter&quot; {
&amp;nbsp; name = aws_eks_cluster.datacenter_cluster.name
}
data &quot;aws_eks_cluster_auth&quot; &quot;datacenter&quot; {
&amp;nbsp; name = aws_eks_cluster.datacenter_cluster.name
}
provider &quot;kubernetes&quot; {
&amp;nbsp; alias = &quot;datacenter&quot; # &quot;datacenter&quot; 라는 별명 부여
&amp;nbsp; host = data.aws_eks_cluster.datacenter.endpoint
&amp;nbsp; cluster_ca_certificate = base64decode(data.aws_eks_cluster.datacenter.certificate_authority[0].data)
&amp;nbsp; token = data.aws_eks_cluster_auth.datacenter.token
}

# 2-2. Kafka 클러스터 접속 정보
data &quot;aws_eks_cluster&quot; &quot;kafka&quot; {
&amp;nbsp; name = aws_eks_cluster.kafka_cluster.name&amp;nbsp;
}
data &quot;aws_eks_cluster_auth&quot; &quot;kafka&quot; {
&amp;nbsp; name = aws_eks_cluster.kafka_cluster.name
}
provider &quot;kubernetes&quot; {
&amp;nbsp; alias = &quot;kafka&quot;
&amp;nbsp; host = data.aws_eks_cluster.kafka.endpoint
&amp;nbsp; cluster_ca_certificate = base64decode(data.aws_eks_cluster.kafka.certificate_authority[0].data)
&amp;nbsp; token = data.aws_eks_cluster_auth.kafka.token
}

# 2-3. Monitoring 클러스터 접속 정보
data &quot;aws_eks_cluster&quot; &quot;monitoring&quot; {
&amp;nbsp; name = aws_eks_cluster.monitoring_cluster.name
}
data &quot;aws_eks_cluster_auth&quot; &quot;monitoring&quot; {
&amp;nbsp; name = aws_eks_cluster.monitoring_cluster.name
}
provider &quot;kubernetes&quot; {
&amp;nbsp; alias = &quot;monitoring&quot;
&amp;nbsp; host = data.aws_eks_cluster.monitoring.endpoint
&amp;nbsp; cluster_ca_certificate = base64decode(data.aws_eks_cluster.monitoring.certificate_authority[0].data)
&amp;nbsp; token = data.aws_eks_cluster_auth.monitoring.token
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(2) &lt;a href=&quot;http://vpc.tf&quot; data-prosemirror-mark-name=&quot;link&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;vpc.tf&lt;/a&gt; : 공유 VPC 및 서브넷&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;3개의 클러스터가 &lt;b&gt;공동으로 사용할&lt;/b&gt; 단일 VPC와 서브넷 2개(가용 영역 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;2a&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;2c&lt;/span&gt;)를 생성한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubernetes.io/cluster/...&lt;/span&gt;&lt;b&gt; 태그:&lt;/b&gt; EKS가 이 서브넷들을 컨트롤 플레인(ELB 등)이나 워커 노드용으로 인식할 수 있도록 &lt;b&gt;3개 클러스터의 이름을 모두 &lt;/b&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;shared&lt;/span&gt;&lt;b&gt;로 태그&lt;/b&gt;하는 것이 매우 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822776473&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# vpc.tf
# [비용 절감형] 1개 VPC, 2개 AZ, 2개 서브넷으로 3개 클러스터 모두 공유

# 1. VPC 생성
resource &quot;aws_vpc&quot; &quot;solog_vpc&quot; {
&amp;nbsp; cidr_block&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= &quot;192.168.0.0/16&quot;
&amp;nbsp; enable_dns_support&amp;nbsp; &amp;nbsp;= true
&amp;nbsp; enable_dns_hostnames = true

&amp;nbsp; tags = {
&amp;nbsp; &amp;nbsp; Name = &quot;solog-unified-vpc&quot;
&amp;nbsp; }
}

# 2. 퍼블릭 서브넷 &quot;2개&quot; 생성 (2개 AZ)
resource &quot;aws_subnet&quot; &quot;solog_public_subnets&quot; {
&amp;nbsp; count&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 2
&amp;nbsp; vpc_id&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = aws_vpc.solog_vpc.id
&amp;nbsp; availability_zone&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= [&quot;ap-northeast-2a&quot;, &quot;ap-northeast-2c&quot;][count.index]
&amp;nbsp; cidr_block&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;192.168.${count.index}.0/24&quot;  
&amp;nbsp; map_public_ip_on_launch = true&amp;nbsp;

&amp;nbsp; tags = {
&amp;nbsp; &amp;nbsp; Name = &quot;solog-unified-public-subnet-${count.index + 1}&quot;
&amp;nbsp; &amp;nbsp;&amp;nbsp;
    # 3개 클러스터 이름을 모두 태그
&amp;nbsp; &amp;nbsp; &quot;kubernetes.io/cluster/eks-datacenter-cluster&quot; = &quot;shared&quot;
&amp;nbsp; &amp;nbsp; &quot;kubernetes.io/cluster/eks-kafka-cluster&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;shared&quot;
&amp;nbsp; &amp;nbsp; &quot;kubernetes.io/cluster/eks-monitoring-cluster&quot; = &quot;shared&quot;
&amp;nbsp; }
}

# 3. 인터넷 게이트웨이 생성
resource &quot;aws_internet_gateway&quot; &quot;solog_igw&quot; {
&amp;nbsp; vpc_id = aws_vpc.solog_vpc.id

&amp;nbsp; tags = {
&amp;nbsp; &amp;nbsp; Name = &quot;solog-unified-igw&quot;
&amp;nbsp; }
}

# 4. 라우트 테이블 (Public) 생성
resource &quot;aws_route_table&quot; &quot;solog_public_rt&quot; {
&amp;nbsp; vpc_id = aws_vpc.solog_vpc.id

&amp;nbsp; route {
&amp;nbsp; &amp;nbsp; cidr_block = &quot;0.0.0.0/0&quot;
&amp;nbsp; &amp;nbsp; gateway_id = aws_internet_gateway.solog_igw.id
&amp;nbsp; }

&amp;nbsp; tags = {
&amp;nbsp; &amp;nbsp; Name = &quot;solog-unified-public-rt&quot;
&amp;nbsp; }
}

# 5. 서브넷 2개를 라우트 테이블에 연결
resource &quot;aws_route_table_association&quot; &quot;solog_public_rta&quot; {
&amp;nbsp; count&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 2
&amp;nbsp; subnet_id&amp;nbsp; &amp;nbsp; &amp;nbsp; = aws_subnet.solog_public_subnets[count.index].id
&amp;nbsp; route_table_id = aws_route_table.solog_public_rt.id
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(3) iam_*.tf : 클러스터별 IAM 역할&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;3개의 클러스터는 VPC를 공유하더라도, &lt;b&gt;각자 고유한 IAM 역할(클러스터용, 노드용)이 필요&lt;/b&gt;하다. &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;iam_datacenter.tf&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;iam_kafka.tf&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;iam_monitoring.tf&lt;/span&gt; 3개 파일로 분리하여 각 클러스터에 필요한 역할을 정의한다.&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;(예시: &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;iam_datacenter.tf&lt;/span&gt; - &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kafka&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;monitoring&lt;/span&gt; 파일도 동일한 구조로 이름만 변경)&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822790785&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# iam_datacenter.tf

# 1. DataCenter EKS 클러스터(컨트롤 플레인)를 위한 IAM 역할
resource &quot;aws_iam_role&quot; &quot;eks_datacenter_cluster_role&quot; {
&amp;nbsp; name = &quot;eks-datacenter-cluster-role&quot; # 고유 이름

&amp;nbsp; # EKS 서비스가 이 역할을 맡을 수 있도록 허용
&amp;nbsp; assume_role_policy = jsonencode({
&amp;nbsp; &amp;nbsp; Version = &quot;2012-10-17&quot;,
&amp;nbsp; &amp;nbsp; Statement = [
&amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Effect = &quot;Allow&quot;,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Principal = { Service = &quot;eks.amazonaws.com&quot; },
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Action = &quot;sts:AssumeRole&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; ]
&amp;nbsp; })
}

# EKS 클러스터 역할에 필요한 정책 연결
resource &quot;aws_iam_role_policy_attachment&quot; &quot;cluster_policy_attachment_datacenter&quot; {
&amp;nbsp; policy_arn = &quot;arn:aws:iam::aws:policy/AmazonEKSClusterPolicy&quot;
&amp;nbsp; role&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= aws_iam_role.eks_datacenter_cluster_role.name
}

# 2. DataCenter 워커 노드(EC2 인스턴스)를 위한 IAM 역할
resource &quot;aws_iam_role&quot; &quot;eks_datacenter_node_role&quot; {
&amp;nbsp; name = &quot;eks-datacenter-node-role&quot; # 고유 이름

&amp;nbsp; # EC2 인스턴스가 이 역할을 맡을 수 있도록 허용
&amp;nbsp; assume_role_policy = jsonencode({
&amp;nbsp; &amp;nbsp; Version = &quot;2012-10-17&quot;,
&amp;nbsp; &amp;nbsp; Statement = [
&amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Effect = &quot;Allow&quot;,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Principal = { Service = &quot;ec2.amazonaws.com&quot; },
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Action = &quot;sts:AssumeRole&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; ]
&amp;nbsp; })
}

# 워커 노드 역할에 필요한 3가지 기본 정책 연결
resource &quot;aws_iam_role_policy_attachment&quot; &quot;node_policy_attachment_worker_datacenter&quot; {
&amp;nbsp; policy_arn = &quot;arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy&quot;
&amp;nbsp; role&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= aws_iam_role.eks_datacenter_node_role.name
}

resource &quot;aws_iam_role_policy_attachment&quot; &quot;node_policy_attachment_cni_datacenter&quot; {
&amp;nbsp; policy_arn = &quot;arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy&quot;
&amp;nbsp; role&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= aws_iam_role.eks_datacenter_node_role.name
}

resource &quot;aws_iam_role_policy_attachment&quot; &quot;node_policy_attachment_ecr_datacenter&quot; {
&amp;nbsp; policy_arn = &quot;arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly&quot;
&amp;nbsp; role&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= aws_iam_role.eks_datacenter_node_role.name
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(4) eks_*.tf : 클러스터별 EKS 정의&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;각 클러스터의 컨트롤 플레인(&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws_eks_cluster&lt;/span&gt;)과 노드 그룹(&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws_eks_node_group&lt;/span&gt;)을 정의한다. &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;role_arn&lt;/span&gt;은 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;iam_*.tf&lt;/span&gt;에서 만든 &lt;b&gt;고유한 역할&lt;/b&gt;을, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;subnet_ids&lt;/span&gt;는 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;vpc.tf&lt;/span&gt;에서 만든 &lt;b&gt;공유 서브넷&lt;/b&gt;을 참조한다.&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;(예시: &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;eks_datacenter.tf&lt;/span&gt; - &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;eks_kafka.tf&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;eks_monitoring.tf&lt;/span&gt; 파일도 동일한 패턴으로 생성한다.)&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822803626&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# eks_datacenter.tf

# 1. EKS 클러스터(컨트롤 플레인) 생성
resource &quot;aws_eks_cluster&quot; &quot;datacenter_cluster&quot; {
&amp;nbsp; name&amp;nbsp; &amp;nbsp; &amp;nbsp;= &quot;eks-datacenter-cluster&quot;
&amp;nbsp; version&amp;nbsp; = &quot;1.30&quot;
&amp;nbsp; role_arn = aws_iam_role.eks_datacenter_cluster_role.arn

&amp;nbsp; # 클러스터가 사용할 VPC 및 서브넷 정보 (공유 서브넷 참조)
&amp;nbsp; vpc_config {
&amp;nbsp; &amp;nbsp; subnet_ids = [for s in aws_subnet.solog_public_subnets : s.id]
&amp;nbsp; }

&amp;nbsp; depends_on = [
&amp;nbsp; &amp;nbsp; aws_iam_role_policy_attachment.cluster_policy_attachment_datacenter,
&amp;nbsp; &amp;nbsp; aws_vpc.solog_vpc,
&amp;nbsp; ]
}

# 2. EKS 노드 그룹 생성
resource &quot;aws_eks_node_group&quot; &quot;datacenter_nodegroup&quot; {
&amp;nbsp; cluster_name&amp;nbsp; &amp;nbsp; = aws_eks_cluster.datacenter_cluster.name
&amp;nbsp; node_group_name = &quot;eks-datacenter-nodegroup&quot;&amp;nbsp;&amp;nbsp;
&amp;nbsp; node_role_arn&amp;nbsp; &amp;nbsp;= aws_iam_role.eks_datacenter_node_role.arn
&amp;nbsp; subnet_ids&amp;nbsp; &amp;nbsp; &amp;nbsp; = [for s in aws_subnet.solog_public_subnets : s.id]
&amp;nbsp; instance_types&amp;nbsp; = [&quot;t3.medium&quot;]&amp;nbsp;

&amp;nbsp; scaling_config {
&amp;nbsp; &amp;nbsp; desired_size = 2&amp;nbsp;
&amp;nbsp; &amp;nbsp; min_size&amp;nbsp; &amp;nbsp; &amp;nbsp;= 2&amp;nbsp;
&amp;nbsp; &amp;nbsp; max_size&amp;nbsp; &amp;nbsp; &amp;nbsp;= 5&amp;nbsp;
&amp;nbsp; }
&amp;nbsp;&amp;nbsp;
&amp;nbsp; depends_on = [
&amp;nbsp; &amp;nbsp; aws_iam_role_policy_attachment.node_policy_attachment_worker_datacenter,
&amp;nbsp; &amp;nbsp; aws_iam_role_policy_attachment.node_policy_attachment_cni_datacenter,
&amp;nbsp; &amp;nbsp; aws_iam_role_policy_attachment.node_policy_attachment_ecr_datacenter,
&amp;nbsp; ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(5) &lt;a href=&quot;http://aws-auth.tf&quot; data-prosemirror-mark-name=&quot;link&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf&lt;/a&gt; : 3개 클러스터 팀원 권한 동시 설정&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;EKS 클러스터 생성자 외의 다른 팀원(IAM 사용자)이 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubectl&lt;/span&gt;로 클러스터에 접속할 수 있도록 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth&lt;/span&gt; ConfigMap에 등록해주는 파일이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;locals&lt;/span&gt;&lt;b&gt;:&lt;/b&gt; 권한을 부여할 팀원 목록을 정의한다. 이 목록은 3개 클러스터가 &lt;b&gt;공유&lt;/b&gt;한다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;provider = kubernetes.*&lt;/span&gt;&lt;b&gt;:&lt;/b&gt; &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;provider.tf&lt;/span&gt;에서 정의한 **별명(&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;alias&lt;/span&gt;)**을 사용하여, 테라폼이 &lt;b&gt;어떤 클러스터의 &lt;/b&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth&lt;/span&gt;&lt;b&gt;를 수정할지&lt;/b&gt; 정확히 지정한다. (예: &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;provider = kubernetes.datacenter&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822817281&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# aws-auth.tf

# 1. 팀원 목록을 정의합니다. (이 목록은 3개 클러스터가 공유)
locals {
&amp;nbsp; map_users = [
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; userarn&amp;nbsp; = &quot;arn:aws:iam::484400672545:user/MJ&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; username = &quot;MJ&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; groups&amp;nbsp; &amp;nbsp;= [&quot;system:masters&quot;] # 관리자 권한
&amp;nbsp; &amp;nbsp; },
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; userarn&amp;nbsp; = &quot;arn:aws:iam::484400672545:user/JWOO&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; username = &quot;JWOO&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; groups&amp;nbsp; &amp;nbsp;= [&quot;system:masters&quot;]
&amp;nbsp; &amp;nbsp; },
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; userarn&amp;nbsp; = &quot;arn:aws:iam::484400672545:user/JJ&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; username = &quot;JJ&quot;
&amp;nbsp; &amp;nbsp; &amp;nbsp; groups&amp;nbsp; &amp;nbsp;= [&quot;system:masters&quot;]
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; # ... 팀원 추가 ...
&amp;nbsp; ]
}

# --- 2. DataCenter 클러스터 권한 설정 ---

# 2-1. DataCenter 클러스터의 'aws-auth' ConfigMap을 읽어옵니다.
data &quot;kubernetes_config_map&quot; &quot;aws_auth_datacenter&quot; {
&amp;nbsp; provider = kubernetes.datacenter # DataCenter 클러스터에 접속
&amp;nbsp; metadata {
&amp;nbsp; &amp;nbsp; name&amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;aws-auth&quot;
&amp;nbsp; &amp;nbsp; namespace = &quot;kube-system&quot;
&amp;nbsp; }
}

# 2-2. DataCenter 클러스터의 'aws-auth'를 수정(Patch)합니다.
resource &quot;kubernetes_config_map_v1_data&quot; &quot;aws_auth_patch_datacenter&quot; {
&amp;nbsp; provider = kubernetes.datacenter&amp;nbsp;# DataCenter 클러스터에 접속
&amp;nbsp; metadata {
&amp;nbsp; &amp;nbsp; name&amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;aws-auth&quot;
&amp;nbsp; &amp;nbsp; namespace = &quot;kube-system&quot;
&amp;nbsp; }
&amp;nbsp; data = {
&amp;nbsp; &amp;nbsp; &quot;mapUsers&quot; = yamlencode(concat(
&amp;nbsp; &amp;nbsp; &amp;nbsp; try(yamldecode(data.kubernetes_config_map.aws_auth_datacenter.data.mapUsers), []),
&amp;nbsp; &amp;nbsp; &amp;nbsp; local.map_users
&amp;nbsp; &amp;nbsp; ))
&amp;nbsp; }
&amp;nbsp; depends_on = [
&amp;nbsp; &amp;nbsp; aws_eks_node_group.datacenter_nodegroup&amp;nbsp;
&amp;nbsp; ]
}

# --- 3. Kafka 클러스터 권한 설정 ---

# 3-1. Kafka 클러스터의 'aws-auth' ConfigMap을 읽어옵니다.
data &quot;kubernetes_config_map&quot; &quot;aws_auth_kafka&quot; {
&amp;nbsp; provider = kubernetes.kafka&amp;nbsp;# Kafka 클러스터에 접속
&amp;nbsp; metadata {
&amp;nbsp; &amp;nbsp; name&amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;aws-auth&quot;
&amp;nbsp; &amp;nbsp; namespace = &quot;kube-system&quot;
&amp;nbsp; }
}

# 3-2. Kafka 클러스터의 'aws-auth'를 수정(Patch)합니다.
resource &quot;kubernetes_config_map_v1_data&quot; &quot;aws_auth_patch_kafka&quot; {
&amp;nbsp; provider = kubernetes.kafka # Kafka 클러스터에 접속
&amp;nbsp; metadata {
&amp;nbsp; &amp;nbsp; name&amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;aws-auth&quot;
&amp;nbsp; &amp;nbsp; namespace = &quot;kube-system&quot;
&amp;nbsp; }
&amp;nbsp; data = {
&amp;nbsp; &amp;nbsp; &quot;mapUsers&quot; = yamlencode(concat(
&amp;nbsp; &amp;nbsp; &amp;nbsp; try(yamldecode(data.kubernetes_config_map.aws_auth_kafka.data.mapUsers), []),
&amp;nbsp; &amp;nbsp; &amp;nbsp; local.map_users
&amp;nbsp; &amp;nbsp; ))
&amp;nbsp; }
&amp;nbsp; depends_on = [
&amp;nbsp; &amp;nbsp; aws_eks_node_group.kafka_nodegroup&amp;nbsp;
&amp;nbsp; ]
}


# --- 4. Monitoring 클러스터 권한 설정 ---

# 4-1. Monitoring 클러스터의 'aws-auth' ConfigMap을 읽어옵니다.
data &quot;kubernetes_config_map&quot; &quot;aws_auth_monitoring&quot; {
&amp;nbsp; provider = kubernetes.monitoring&amp;nbsp;# Monitoring 클러스터에 접속
&amp;nbsp; metadata {
&amp;nbsp; &amp;nbsp; name&amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;aws-auth&quot;
&amp;nbsp; &amp;nbsp; namespace = &quot;kube-system&quot;
&amp;nbsp; }
}

# 4-2. Monitoring 클러스터의 'aws-auth'를 수정(Patch)합니다.
resource &quot;kubernetes_config_map_v1_data&quot; &quot;aws_auth_patch_monitoring&quot; {
&amp;nbsp; provider = kubernetes.monitoring&amp;nbsp;# Monitoring 클러스터에 접속
&amp;nbsp; metadata {
&amp;nbsp; &amp;nbsp; name&amp;nbsp; &amp;nbsp; &amp;nbsp; = &quot;aws-auth&quot;
&amp;nbsp; &amp;nbsp; namespace = &quot;kube-system&quot;
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; data = {
&amp;nbsp; &amp;nbsp; &quot;mapUsers&quot; = yamlencode(concat(
&amp;nbsp; &amp;nbsp; &amp;nbsp; try(yamldecode(data.kubernetes_config_map.aws_auth_monitoring.data.mapUsers), []),
&amp;nbsp; &amp;nbsp; &amp;nbsp; local.map_users
&amp;nbsp; &amp;nbsp; ))
&amp;nbsp; }
&amp;nbsp; depends_on = [
&amp;nbsp; &amp;nbsp; aws_eks_node_group.monitoring_nodegroup&amp;nbsp;
&amp;nbsp; ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;(6) &lt;a href=&quot;http://outputs.tf&quot; data-prosemirror-mark-name=&quot;link&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;outputs.tf&lt;/a&gt; : 3개 클러스터 접속 정보 출력&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform apply&lt;/span&gt; 완료 후, 터미널에 3개 클러스터 각각의 이름, 엔드포인트, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubeconfig&lt;/span&gt; 업데이트 명령어를 출력한다.&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822830408&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# outputs.tf

# --- 1. DataCenter 클러스터 ---
output &quot;datacenter_cluster_name&quot; {
&amp;nbsp; description = &quot;DataCenter EKS 클러스터 이름&quot;
&amp;nbsp; value = aws_eks_cluster.datacenter_cluster.name
}

output &quot;datacenter_cluster_endpoint&quot; {
&amp;nbsp; description = &quot;DataCenter EKS 클러스터 엔드포인트 URL&quot;
&amp;nbsp; value = aws_eks_cluster.datacenter_cluster.endpoint
}

output &quot;datacenter_kubeconfig_command&quot; {
&amp;nbsp; description = &quot;DataCenter 클러스터 접속을 위한 kubeconfig 업데이트 명령어&quot;
&amp;nbsp; value = &quot;aws eks update-kubeconfig --region ap-northeast-2 --name ${aws_eks_cluster.datacenter_cluster.name} --profile JWON&quot;
}

# --- 2. Kafka 클러스터 ---
output &quot;kafka_cluster_name&quot; {
&amp;nbsp; description = &quot;Kafka EKS 클러스터 이름&quot;
&amp;nbsp; value = aws_eks_cluster.kafka_cluster.name
}

output &quot;kafka_cluster_endpoint&quot; {
&amp;nbsp; description = &quot;Kafka EKS 클러스터 엔드포인트 URL&quot;
&amp;nbsp; value = aws_eks_cluster.kafka_cluster.endpoint
}

output &quot;kafka_kubeconfig_command&quot; {
&amp;nbsp; description = &quot;Kafka 클러스터 접속을 위한 kubeconfig 업데이트 명령어&quot;
&amp;nbsp; value = &quot;aws eks update-kubeconfig --region ap-northeast-2 --name ${aws_eks_cluster.kafka_cluster.name} --profile JWON&quot;
}

# --- 3. Monitoring 클러스터 ---
output &quot;monitoring_cluster_name&quot; {
&amp;nbsp; description = &quot;Monitoring EKS 클러스터 이름&quot;
&amp;nbsp; value = aws_eks_cluster.monitoring_cluster.name
}

output &quot;monitoring_cluster_endpoint&quot; {
&amp;nbsp; description = &quot;Monitoring EKS 클러스터 엔드포인트 URL&quot;
&amp;nbsp; value = aws_eks_cluster.monitoring_cluster.endpoint
}

output &quot;monitoring_kubeconfig_command&quot; {
&amp;nbsp; description = &quot;Monitoring 클러스터 접속을 위한 kubeconfig 업데이트 명령어&quot;
&amp;nbsp; value = &quot;aws eks update-kubeconfig --region ap-northeast-2 --name ${aws_eks_cluster.monitoring_cluster.name} --profile JWON&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;6. 테라폼 실행 (클러스터 3개 동시 생성)&lt;/h2&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;solog-terraform-unified&lt;/span&gt; 폴더의 터미널에서 아래 명령어들을 차례로 실행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;orderedList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform init&lt;/span&gt;&lt;b&gt; (초기화)&lt;/b&gt; 테라폼이 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;provider.tf&lt;/span&gt; 파일을 읽고 필요한 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws&lt;/span&gt; 프로바이더와 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubernetes&lt;/span&gt; 프로바이더 플러그인을 다운로드한다. (폴더당 최초 1회만 실행)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;blockquote&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  [중요]&lt;/b&gt; 처음 테라폼 실행 시 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf&lt;/span&gt; 파일은 빼주어야 한다. 아직 접속할 클러스터가 없기 때문에 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubernetes&lt;/span&gt; 프로바이더가 인증을 시도하다 에러가 발생하기 때문이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;orderedList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf&lt;/span&gt; 파일명을 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf.bak&lt;/span&gt; 등으로 임시 변경한다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform init&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;plan&lt;/span&gt;, &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;apply&lt;/span&gt;를 진행하여 EKS 클러스터를 생성한다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;apply&lt;/span&gt; 완료 후 7. 클러스터 접속을 진행하여 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubeconfig&lt;/span&gt;에 클러스터 정보를 등록한다. (이 과정이 있어야 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubernetes&lt;/span&gt; 프로바이더가 정상 동작한다.)&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf.bak&lt;/span&gt; 파일명을 다시 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf&lt;/span&gt;로 변경한다.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform apply&lt;/span&gt;를 한 번 더 실행하면 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth&lt;/span&gt; 관련 변경 사항(팀원 권한)만 추가로 반영된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000;&quot; contenteditable=&quot;false&quot;&gt;
&lt;pre id=&quot;code_1762822842219&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform init
Initializing provider plugins...
- Finding hashicorp/aws versions matching &quot;~&amp;gt; 5.0&quot;...
- Finding hashicorp/kubernetes versions matching &quot;~&amp;gt; 2.20&quot;...
...
Terraform has been successfully initialized!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;2. terraform plan&lt;/span&gt;&lt;b&gt; (실행 계획)&lt;/b&gt; 테라폼이 모든 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;.tf&lt;/span&gt; 코드를 읽고 AWS에 &lt;b&gt;&quot;무엇을&quot;&lt;/b&gt; 만들지 미리보기로 보여준다. (실제 생성 X) 공유 VPC 관련 리소스 + 3개 클러스터의 IAM 역할 + 3개 EKS 클러스터 + 3개 노드 그룹 등 수십 개의 리소스가 목록에 나타난다.&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000;&quot; contenteditable=&quot;false&quot;&gt;
&lt;pre id=&quot;code_1762822871480&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform plan
...
Plan: 50 to add, 0 to change, 0 to destroy. # (리소스 개수는 예시)
...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;3. terraform apply&lt;/span&gt;&lt;b&gt; (적용)&lt;/b&gt; 실행 계획을 확인한 후, 실제로 모든 리소스를 생성한다. 3개의 클러스터가 동시에 생성되므로 15~20분 이상 소요될 수 있다.&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822893552&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform apply
...
Plan: 50 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
&amp;nbsp; Only 'yes' will be accepted to approve.

&amp;nbsp; Enter a value: yes&amp;nbsp; &amp;lt;-- &quot;yes&quot;를 직접 입력하고 엔터

...
aws_eks_cluster.datacenter_cluster: Creating...
aws_eks_cluster.kafka_cluster: Creating...
aws_eks_cluster.monitoring_cluster: Creating...
...
Apply complete! Resources: 50 added, 0 changed, 0 destroyed.

Outputs:

datacenter_cluster_endpoint = &quot;https://&amp;lt;...&amp;gt;.eks.amazonaws.com&quot;
datacenter_cluster_name = &quot;eks-datacenter-cluster&quot;
datacenter_kubeconfig_command = &quot;aws eks update-kubeconfig ... --name eks-datacenter-cluster --profile JWON&quot;
kafka_cluster_endpoint = &quot;https://&amp;lt;...&amp;gt;.eks.amazonaws.com&quot;
kafka_cluster_name = &quot;eks-kafka-cluster&quot;
kafka_kubeconfig_command = &quot;aws eks update-kubeconfig ... --name eks-kafka-cluster --profile JWON&quot;
monitoring_cluster_endpoint = &quot;https://&amp;lt;...&amp;gt;.eks.amazonaws.com&quot;
monitoring_cluster_name = &quot;eks-monitoring-cluster&quot;
monitoring_kubeconfig_command = &quot;aws eks update-kubeconfig ... --name eks-monitoring-cluster --profile JWON&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;7. 클러스터 접속 (kubeconfig 설정)&lt;/h2&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;테라폼은 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;~/.kube/config&lt;/span&gt; 파일을 자동으로 업데이트하지 않는다.&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform apply&lt;/span&gt; 완료 후 출력(Outputs)된 &lt;b&gt;3개의 &lt;/b&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubeconfig_command&lt;/span&gt;&lt;b&gt; 값을&lt;/b&gt; 복사해서 터미널에 &lt;b&gt;각각&lt;/b&gt; 붙여넣고 실행해야 한다.&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000;&quot; contenteditable=&quot;false&quot;&gt;
&lt;pre id=&quot;code_1762822902344&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. DataCenter 클러스터 접속 정보 추가
$ aws eks update-kubeconfig --region ap-northeast-2 --name eks-datacenter-cluster --profile JWON
Added new context arn:aws:eks:ap-northeast-2:ACCOUNT_ID:cluster/eks-datacenter-cluster to C:\Users\...\.kube\config

# 2. Kafka 클러스터 접속 정보 추가
$ aws eks update-kubeconfig --region ap-northeast-2 --name eks-kafka-cluster --profile JWON
Added new context arn:aws:eks:ap-northeast-2:ACCOUNT_ID:cluster/eks-kafka-cluster to C:\Users\...\.kube\config

# 3. Monitoring 클러스터 접속 정보 추가
$ aws eks update-kubeconfig --region ap-northeast-2 --name eks-monitoring-cluster --profile JWON
Added new context arn:aws:eks:ap-northeast-2:ACCOUNT_ID:cluster/eks-monitoring-cluster to C:\Users\...\.kube\config&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;이제 kubectl로 3개 클러스터에 모두 접속되는지 확인한다.&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822915352&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 컨텍스트 목록 확인 (3개 클러스터가 모두 보여야 함)
$ kubectl config get-contexts

CURRENT&amp;nbsp; &amp;nbsp;NAME&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CLUSTER&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arn:aws:eks:...:cluster/eks-datacenter-cluster&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arn:aws:eks:...:cluster/eks-datacenter-cluster
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arn:aws:eks:...:cluster/eks-kafka-cluster&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arn:aws:eks:...:cluster/eks-kafka-cluster
*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;arn:aws:eks:...:cluster/eks-monitoring-cluster&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;arn:aws:eks:...:cluster/eks-monitoring-cluster

# 2. 현재 활성 클러스터(monitoring) 노드 조회
$ kubectl get nodes
NAME&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;STATUS&amp;nbsp; &amp;nbsp;ROLES&amp;nbsp; &amp;nbsp; AGE&amp;nbsp; &amp;nbsp;VERSION
ip-192-168-0-10.ap-northeast-2.compute.internal&amp;nbsp; &amp;nbsp;Ready&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&amp;nbsp; &amp;nbsp;2m&amp;nbsp; &amp;nbsp; v1.30...
ip-192-168-1-20.ap-northeast-2.compute.internal&amp;nbsp; &amp;nbsp; Ready&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&amp;nbsp; &amp;nbsp;2m&amp;nbsp; &amp;nbsp; v1.30...

# 3. 다른 클러스터(예: kafka)로 컨텍스트 변경
$ kubectl config use-context arn:aws:eks:...:cluster/eks-kafka-cluster
Switched to context &quot;arn:aws:eks:...:cluster/eks-kafka-cluster&quot;.

# 4. Kafka 클러스터 노드 조회
$ kubectl get nodes
NAME&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;STATUS&amp;nbsp; &amp;nbsp;ROLES&amp;nbsp; &amp;nbsp; AGE&amp;nbsp; &amp;nbsp;VERSION
ip-192-168-0-30.ap-northeast-2.compute.internal&amp;nbsp; &amp;nbsp;Ready&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&amp;nbsp; &amp;nbsp;3m&amp;nbsp; &amp;nbsp; v1.30...
ip-192-168-1-40.ap-northeast-2.compute.internal&amp;nbsp; &amp;nbsp; Ready&amp;nbsp; &amp;nbsp; &amp;lt;none&amp;gt;&amp;nbsp; &amp;nbsp;3m&amp;nbsp; &amp;nbsp; v1.30...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;팀원들이 해야 할 일 (권한 부여 후)&lt;/h3&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;관리자가 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws-auth.tf&lt;/span&gt;를 포함하여 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform apply&lt;/span&gt;를 완료했다면, 팀원들은 각자 PC에서 다음을 수행해야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;orderedList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;AWS CLI 설치 및 본인 IAM 사용자로 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws configure --profile [본인프로필]&lt;/span&gt; 설정.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubectl&lt;/span&gt; 설치.&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;b&gt;(중요)&lt;/b&gt; 관리자에게 3개 클러스터의 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;update-kubeconfig&lt;/span&gt; 명령어를 받아서 &lt;b&gt;3개 모두 실행&lt;/b&gt;한다. (위 7번 항목과 동일)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;blockquote&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;default&lt;/span&gt; 에 액세스 키 넣어놨으면 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;--profile [각자 프로필]&lt;/span&gt; 이 부분 빼고 쳐도 돼요&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws eks update-kubeconfig --region ap-northeast-2 --name eks-datacenter-cluster --profile [각자 프로필]&lt;/span&gt;&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws eks update-kubeconfig --region ap-northeast-2 --name eks-kafka-cluster --profile [각자 프로필]&lt;/span&gt;&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;aws eks update-kubeconfig --region ap-northeast-2 --name eks-monitoring-cluster --profile [각자 프로필]&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;이제 팀원들도 &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubectl&lt;/span&gt;로 3개 클러스터에 모두 접속할 수 있다.&lt;/p&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;8. 클러스터 삭제 (정리)&lt;/h2&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;단일 프로젝트로 통합 관리할 때의 가장 큰 장점이다. &lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;terraform destroy&lt;/span&gt; &lt;b&gt;단 하나의 명령어&lt;/b&gt;로 3개의 EKS 클러스터, 3개의 노드 그룹, 공유 VPC, 모든 IAM 역할 등 생성했던 &lt;b&gt;모든 리소스(50+개)를 한 번에 삭제&lt;/b&gt;한다.&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762822930888&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform destroy

...
Plan: 0 to add, 0 to change, 50 to destroy.
...
Do you really want to destroy all resources?
&amp;nbsp; Only 'yes' will be accepted to approve.

&amp;nbsp; Enter a value: yes&amp;nbsp; &amp;lt;-- &quot;yes&quot; 입력

...
aws_eks_node_group.datacenter_nodegroup: Destroying...
aws_eks_node_group.kafka_nodegroup: Destroying...
aws_eks_node_group.monitoring_nodegroup: Destroying...
...
Destroy complete! Resources: 50 destroyed.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;rule&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-prosemirror-mark-name=&quot;code&quot; data-prosemirror-content-type=&quot;mark&quot;&gt;kubectl config get-contexts&lt;/span&gt; 로 쓸데 없는 context 뜰 때 아래 명령어로 정리해주기&lt;/p&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;원래는 eks-datacenter-cluster, eks-kafka-cluster, eks-monitoring-cluster 3개만 있으면 됨&lt;/p&gt;
&lt;div data-prosemirror-mark-name=&quot;breakout&quot; data-prosemirror-content-type=&quot;mark&quot; data-width=&quot;760&quot; data-mode=&quot;wide&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000;&quot; contenteditable=&quot;false&quot;&gt;
&lt;pre id=&quot;code_1762822939776&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. datacenter 컨텍스트 삭제
kubectl config delete-context arn:aws:eks:ap-northeast-2:484400672545:cluster/datacenter

# 2. datacenter 클러스터 정보 삭제
kubectl config delete-cluster arn:aws:eks:ap-northeast-2:484400672545:cluster/datacenter

# 3. datacenter 사용자 정보 삭제
kubectl config delete-user arn:aws:eks:ap-northeast-2:484400672545:cluster/datacenter&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>현대 오토에버 클라우드 스쿨</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/381</guid>
      <comments>https://gom3rye.tistory.com/381#entry381comment</comments>
      <pubDate>Tue, 11 Nov 2025 10:02:26 +0900</pubDate>
    </item>
    <item>
      <title>팀 프로젝트) Grafana를 위한 AWS API Gateway, Lambda, SNS 설정</title>
      <link>https://gom3rye.tistory.com/380</link>
      <description>&lt;h1 id=&quot;Prometheus-Metric-정보를-Grafana-Alertmanager,-API-Gateway와-Lambda를-통해-AWS-SNS로-전송하기&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1&quot;&gt;Prometheus Metric 정보를 Grafana Alertmanager, API Gateway와 Lambda를 통해 AWS SNS로 전송하기&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;84&quot; data-ke-size=&quot;size16&quot;&gt;온프레미스(On-premise) 환경의 Prometheus에서 발생하는 metric을 grafana에서 받아서 알림 기본 정보를 AWS의 API Gateway로 보내 SNS(Simple Notification Service)로 전송하는 아키텍처를 구축&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Lambda-함수-생성-및-권한-설정&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;228&quot; data-ke-size=&quot;size23&quot;&gt;Lambda 함수 생성 및 권한 설정&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;250&quot; data-ke-size=&quot;size16&quot;&gt;다음으로 API Gateway로부터 요청을 받아 SNS로 메시지를 전달하는 Lambda 함수를 생성한다.&lt;/p&gt;
&lt;h4 id=&quot;각각의-metric을-담당하는-Lambda-함수-생성&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;310&quot; data-ke-size=&quot;size20&quot;&gt;각각의 metric을 담당하는 Lambda 함수 생성&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;341&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의&lt;/b&gt;: 코드 내의 SNS_TOPIC_ARN 변수 값을 환경 변수에 설정해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3M33q/dJMcaa4HcDO/ncHdpZA6B8bKVGvDDmKyF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3M33q/dJMcaa4HcDO/ncHdpZA6B8bKVGvDDmKyF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3M33q/dJMcaa4HcDO/ncHdpZA6B8bKVGvDDmKyF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3M33q%2FdJMcaa4HcDO%2FncHdpZA6B8bKVGvDDmKyF1%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;722&quot; height=&quot;348&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 기준 람다 함수 (10/2)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1762822478437&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import json
import os
import re
import boto3
from datetime import datetime

SNS_TOPIC_ARN = os.environ[&quot;SNS_TOPIC_ARN&quot;]
AWS_REGION = os.environ.get(&quot;AWS_REGION&quot;, &quot;ap-northeast-2&quot;)
sns = boto3.client(&quot;sns&quot;, region_name=AWS_REGION)

def extract_numeric_value(value_string: str) -&amp;gt; str:
    &quot;&quot;&quot;Grafana의 valueString에서 숫자만 추출 (예: 10, 85.4 등)&quot;&quot;&quot;
    if not value_string:
        return &quot;데이터 없음&quot;
    # &quot;value=10&quot; 또는 &quot;value=85.4321&quot; 같은 패턴에서 숫자만 추출
    match = re.search(r&quot;value\s*=\s*([0-9]+(?:\.[0-9]+)?)&quot;, value_string)
    if match:
        return match.group(1)
    # 혹시 숫자 형태가 다르면 fallback으로 전체에서 숫자 추출
    match = re.search(r&quot;([0-9]+(?:\.[0-9]+)?)&quot;, value_string)
    return match.group(1) if match else &quot;데이터 없음&quot;

def clean_summary(summary: str) -&amp;gt; str:
    if not summary:
        return &quot;요약 정보 없음&quot;
    return summary.replace(&quot;%!f(&amp;lt;nil&amp;gt;)&quot;, &quot;데이터 없음&quot;).replace(&quot;[no value]&quot;, &quot;데이터 없음&quot;)

def lambda_handler(event, context):
    print(&quot;[CPU] Event received:&quot;, json.dumps(event)[:1500])

    # 1️⃣ Body 파싱
    body = event.get(&quot;body&quot;, event)
    if isinstance(body, str):
        body = json.loads(body)
    payload = body

    alerts = payload.get(&quot;alerts&quot;, [])
    now_utc = datetime.utcnow().strftime(&quot;%Y-%m-%d %H:%M:%S UTC&quot;)

    details = []

    for a in alerts:
        labels = a.get(&quot;labels&quot;, {})
        annotations = a.get(&quot;annotations&quot;, {})

        # 인스턴스명
        instance = (
            a.get(&quot;instance&quot;)
            or labels.get(&quot;instance&quot;)
            or labels.get(&quot;pod&quot;)
            or labels.get(&quot;node&quot;)
            or &quot;데이터 없음&quot;
        )

        # ✅ valueString에서 숫자만 추출
        raw_value = a.get(&quot;valueString&quot;) or a.get(&quot;current_value&quot;) or &quot;&quot;
        cpu_value = extract_numeric_value(raw_value)

        # 요약 메시지 정리
        summary = clean_summary(
            annotations.get(&quot;summary&quot;) or annotations.get(&quot;description&quot;) or &quot;요약 정보 없음&quot;
        )

        start_time = (
            a.get(&quot;startsAt&quot;, &quot;&quot;).replace(&quot;T&quot;, &quot; &quot;).replace(&quot;Z&quot;, &quot; UTC&quot;)
            if a.get(&quot;startsAt&quot;)
            else &quot;시간 정보 없음&quot;
        )

        details.append(
            f&quot;  인스턴스: {instance}\n&quot;
            f&quot;  현재 CPU 사용률: {cpu_value} %\n&quot;
            f&quot;  요약: {summary}\n&quot;
            f&quot;⏰ 발생 시각: {start_time}\n&quot;
        )

    subject = &quot;  [Grafana] CPU 사용률이 90%를 초과했습니다 !!!&quot;
    message = f&quot;&quot;&quot;
⚙️ CPU 사용률 이상 감지
━━━━━━━━━━━━━━━━━━━━━━━
  감지 시각: {now_utc}
  알림 개수: {len(alerts)}건

  상세 정보:
{'-'*40}
{chr(10).join(details)}

 ️ 조치 가이드:
- CPU 사용률이 90% 이상인 인스턴스의 프로세스 상태를 점검하세요.
- 불필요한 백그라운드 작업을 중단하거나, 리소스 할당량을 조정하세요.
- 필요 시 워크로드를 다른 노드로 분산하거나 스케일 아웃을 고려하세요.
&quot;&quot;&quot;

    sns.publish(TopicArn=SNS_TOPIC_ARN, Message=message, Subject=subject[:100])
    return {&quot;statusCode&quot;: 200, &quot;body&quot;: json.dumps({&quot;ok&quot;: True})}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;API-Gateway-엔드포인트-생성-및-Lambda-연동&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3134&quot; data-ke-size=&quot;size23&quot;&gt;API Gateway 엔드포인트 생성 및 Lambda 연동&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3168&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 외부(ElastAlert)에서 HTTP 요청을 보낼 수 있는 엔드포인트를 생성하고, 이를 Lambda 함수와 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz96FS/dJMb99Lt7NG/hcdZVnynAKnKjxkKtwDXG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz96FS/dJMb99Lt7NG/hcdZVnynAKnKjxkKtwDXG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz96FS/dJMb99Lt7NG/hcdZVnynAKnKjxkKtwDXG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz96FS%2FdJMb99Lt7NG%2FhcdZVnynAKnKjxkKtwDXG1%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;662&quot; height=&quot;750&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각각 과정에 대한 설명은 &lt;b&gt;Elastalert2를 위한 AWS API Gateway, Lambda, SNS 설정&lt;/b&gt; 게시글에 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>현대 오토에버 클라우드 스쿨</category>
      <author>Gom3rye</author>
      <guid isPermaLink="true">https://gom3rye.tistory.com/380</guid>
      <comments>https://gom3rye.tistory.com/380#entry380comment</comments>
      <pubDate>Tue, 11 Nov 2025 09:55:20 +0900</pubDate>
    </item>
  </channel>
</rss>