<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>김신건의 로그 - 위키 / cloud</title><description>&apos;cloud&apos; 카테고리 위키 페이지 최신 업데이트</description><link>https://shinkeonkim.com/</link><language>ko-KR</language><item><title>[AWS] CloudWatch: 메트릭, 로그, 알람</title><link>https://shinkeonkim.com/wiki/cloud/aws-cloudwatch/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-cloudwatch/</guid><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CloudWatch&lt;/strong&gt; = AWS 의 &lt;em&gt;모니터링 + 로그 + 알람&lt;/em&gt; 통합 서비스.&lt;br&gt;
메트릭 수집, 로그 집계, 대시보드, 알람, 이상 감지를 하나의 서비스에서 제공.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;해결책&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;EC2 / Lambda CPU 급등 감지&lt;/td&gt;&lt;td&gt;Alarm + SNS 알림&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;서비스 응답 P99 추적&lt;/td&gt;&lt;td&gt;Custom Metric + Dashboard&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;에러 로그 실시간 분석&lt;/td&gt;&lt;td&gt;Logs Insights 쿼리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;여러 alarm 동시 발생 노이즈&lt;/td&gt;&lt;td&gt;Composite Alarm 으로 통합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;이상 패턴 자동 감지&lt;/td&gt;&lt;td&gt;Anomaly Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EC2 메모리 / 디스크 수집&lt;/td&gt;&lt;td&gt;CloudWatch Agent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ECS / EKS 컨테이너 모니터링&lt;/td&gt;&lt;td&gt;Container Insights&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;여러 메트릭 결합 계산&lt;/td&gt;&lt;td&gt;Metric Math&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;관측-가능성-3가지-축&quot;&gt;관측 가능성 3가지 축&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App[서비스]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App --&gt; M[&quot;Metrics: 수치 시계열&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App --&gt; L[&quot;Logs: 이벤트 기록&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App --&gt; T[&quot;Traces: X-Ray SDK&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    M --&gt; CW[CloudWatch]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L --&gt; CW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    T --&gt; XR[&quot;X-Ray&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW --&gt; D[&quot;Dashboard / Alarm&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    XR --&gt; D&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Metrics + Logs 는 CloudWatch 가 담당, Traces 는 X-Ray (별도 서비스).&lt;br&gt;
세 축이 모두 있어야 진단 가능한 시스템.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;4가지-구성&quot;&gt;4가지 구성&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW[CloudWatch]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW --&gt; M[Metrics]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW --&gt; L[Logs]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW --&gt; A[Alarms]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW --&gt; D[Dashboards]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW --&gt; SY[&quot;Synthetics (canaries)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW --&gt; RUM[&quot;RUM: Real User Monitoring&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;metrics&quot;&gt;Metrics&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;종류&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Standard resolution&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;1분 단위&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;High resolution&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;1초 단위 (별도 비용)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Built-in&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;AWS service 자동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Custom&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PutMetricData&lt;/code&gt; API&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cw.put_metric_data(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Namespace&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;MyApp&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    MetricData&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &apos;MetricName&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;OrdersPlaced&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &apos;Value&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &apos;Unit&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Count&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &apos;Dimensions&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            { &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Name&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Region&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Value&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;us-east-1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            { &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Name&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Service&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Value&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;order-api&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;embedded-metric-format-emf&quot;&gt;Embedded Metric Format (EMF)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;_aws&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Timestamp&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1719318060000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;CloudWatchMetrics&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Namespace&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;MyApp&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Dimensions&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Service&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Metrics&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Latency&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Unit&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Milliseconds&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Service&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Latency&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;125&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;user_id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;u_42&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;로그로 출력하면 CloudWatch 가 자동으로 메트릭 추출&lt;/em&gt;. PutMetricData API 호출 없음. &lt;em&gt;대량 메트릭의 비용 절감&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;metric-math&quot;&gt;Metric Math&lt;/h2&gt;
&lt;p&gt;여러 메트릭을 &lt;em&gt;수식으로 결합&lt;/em&gt;, 새로운 파생 메트릭 계산.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Metrics&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    MetricStat&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Metric&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;MetricName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Errors&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Namespace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;MyApp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Stat&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Sum&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Period&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    MetricStat&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Metric&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;MetricName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Requests&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Namespace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;MyApp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Stat&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Sum&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Period&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;error_rate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Expression&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;errors / requests * 100&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Label&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Error Rate&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;수식 예시&lt;/th&gt;&lt;th&gt;용도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;errors / requests * 100&lt;/code&gt;&lt;/td&gt;&lt;td&gt;에러율 계산&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SUM([m1, m2, m3])&lt;/code&gt;&lt;/td&gt;&lt;td&gt;여러 서비스 합산&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ANOMALY_DETECTION_BAND(m1, 2)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;이상 감지 밴드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;FILL(m1, 0)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;누락 데이터 0 채움&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;cloudwatch-agent&quot;&gt;CloudWatch Agent&lt;/h2&gt;
&lt;p&gt;EC2 / 온프레미스에서 &lt;em&gt;OS 레벨 메트릭&lt;/em&gt; 수집.&lt;br&gt;
기본 메트릭에 포함되지 않는 &lt;em&gt;메모리, 디스크 사용률&lt;/em&gt; 을 수집하려면 필수.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;metrics&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;namespace&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;MyApp/EC2&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;metrics_collected&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;mem&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;measurement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;mem_used_percent&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;disk&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;measurement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;disk_used_percent&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;resources&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/data&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;cpu&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;measurement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;cpu_usage_idle&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;cpu_usage_iowait&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;totalcpu&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;SSM Parameter Store 에 설정 저장 → 전체 fleet 동기화 가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;container-insights&quot;&gt;Container Insights&lt;/h2&gt;
&lt;p&gt;ECS / EKS 컨테이너 환경의 &lt;em&gt;CPU, 메모리, 네트워크, Pod 상태&lt;/em&gt; 자동 수집.&lt;/p&gt;

















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;지원 환경&lt;/th&gt;&lt;th&gt;메트릭 예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;ECS&lt;/td&gt;&lt;td&gt;TaskCPUUtilization, ServiceCount&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EKS&lt;/td&gt;&lt;td&gt;pod_cpu_utilization, node_memory_utilization&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# EKS 에 Container Insights 활성화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; eks&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-addon&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --cluster-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-cluster&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --addon-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; amazon-cloudwatch-observability&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;컨테이너 레벨 성능 문제 진단. Auto Scaling 트리거로 활용 가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;logs&quot;&gt;Logs&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App[App] --&gt;|stdout| Container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Container --&gt;|&quot;awslogs driver&quot;| LG[&quot;Log Group&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    LG --&gt; LS[&quot;Log Stream&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    LG --&gt; Insights[&quot;Logs Insights&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    LG --&gt; Sub[&quot;Subscription Filter&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Sub --&gt; Lambda[Lambda]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Sub --&gt; Kinesis[Kinesis]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;logs-insights-쿼리&quot;&gt;Logs Insights (쿼리)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;fields @timestamp, @message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; @message &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;like&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ERROR&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;stats&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; count&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;by&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; bin(5m)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;| sort @timestamp &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;desc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;limit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 50&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;subscription-filter&quot;&gt;Subscription Filter&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;로그 → Lambda / Kinesis&lt;/em&gt; 실시간 stream. 외부 시스템 (Datadog, ELK) 으로 export.&lt;/p&gt;
&lt;h2 id=&quot;alarms&quot;&gt;Alarms&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Alarm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  MetricName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;CPUUtilization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Namespace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS/EC2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Statistic&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Average&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Period&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  EvaluationPeriods&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Threshold&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  ComparisonOperator&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;GreaterThanThreshold&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  AlarmActions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:sns:...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;5번 연속 1분 평균 CPU &gt; 80% → SNS 알림.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;composite-alarm&quot;&gt;Composite Alarm&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;AlarmRule&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  ALARM(&quot;HighCPU&quot;) AND&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  ALARM(&quot;HighLatency&quot;) AND&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  NOT ALARM(&quot;Maintenance&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;복수 alarm 결합&lt;/em&gt;. &lt;em&gt;유의미한 사고&lt;/em&gt; 만 알림 (false positive 감소).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;anomaly-detection&quot;&gt;Anomaly Detection&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Metrics&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;m1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    MetricStat&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ad1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Expression&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ANOMALY_DETECTION_BAND(m1, 2)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;머신러닝으로 &lt;em&gt;정상 범위 학습 + 이상치 감지&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;cloudwatch-vs-3rd-party&quot;&gt;CloudWatch vs 3rd-party&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;CloudWatch&lt;/th&gt;&lt;th&gt;Datadog / NewRelic&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;AWS 통합&lt;/td&gt;&lt;td&gt;&lt;em&gt;최고&lt;/em&gt;&lt;/td&gt;&lt;td&gt;통합 plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UI&lt;/td&gt;&lt;td&gt;기본&lt;/td&gt;&lt;td&gt;&lt;em&gt;우수&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;가격&lt;/td&gt;&lt;td&gt;metric 수에 비례&lt;/td&gt;&lt;td&gt;호스트 기반&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Distributed tracing&lt;/td&gt;&lt;td&gt;X-Ray 별도&lt;/td&gt;&lt;td&gt;&lt;em&gt;통합&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;APM&lt;/td&gt;&lt;td&gt;제한&lt;/td&gt;&lt;td&gt;&lt;em&gt;완전&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;대부분의 큰 회사&lt;/em&gt; = CloudWatch 기본 + Datadog 등 으로 &lt;em&gt;세분&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;비용-최적화&quot;&gt;비용 최적화&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;전략&lt;/th&gt;&lt;th&gt;효과&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;PutMetricData 대신 EMF&lt;/td&gt;&lt;td&gt;API 호출 비용 절감&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dimension cardinality 제한&lt;/td&gt;&lt;td&gt;메트릭 수 통제&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Log retention 정책 설정&lt;/td&gt;&lt;td&gt;S3 export 후 삭제&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;High resolution 필요한 것만 선택&lt;/td&gt;&lt;td&gt;1초 해상도 비용 절감&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Metric Math 활용&lt;/td&gt;&lt;td&gt;파생 메트릭 별도 저장 불필요&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;메트릭 비용 폭증&lt;/strong&gt; = 각 dimension 조합 = 별도 metric. &lt;em&gt;cardinality&lt;/em&gt; 관리.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log retention 기본 &lt;em&gt;영원&lt;/em&gt;&lt;/strong&gt; = 무한 비용. &lt;em&gt;retention 정책&lt;/em&gt; 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PutMetricData &lt;em&gt;API call 비용&lt;/em&gt;&lt;/strong&gt; = EMF 로 &lt;em&gt;log 로 메트릭&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alarm 의 &lt;em&gt;INSUFFICIENT_DATA&lt;/em&gt;&lt;/strong&gt; = 데이터 부족으로 alarm 못 보내. &lt;code&gt;TreatMissingData&lt;/code&gt; 명시.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EC2 메모리/디스크 미수집&lt;/strong&gt; = 기본 메트릭에 없음. CloudWatch Agent 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Group 별도 retention&lt;/strong&gt; = Log Group 마다 개별 설정해야 함. 전체 계정 기본값 없음.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[prometheus]]&lt;/li&gt;
&lt;li&gt;[[opentelemetry]]&lt;/li&gt;
&lt;li&gt;[[slo-sli-error-budget]]&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail]]&lt;/li&gt;
&lt;li&gt;[[aws-lambda]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloudwatch</category><category>observability</category><category>metrics</category><category>logs</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] Lambda: 서버리스 함수, 트리거, 동시성</title><link>https://shinkeonkim.com/wiki/cloud/aws-lambda/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-lambda/</guid><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; = &lt;em&gt;서버리스 함수 실행&lt;/em&gt;. &lt;em&gt;이벤트 트리거&lt;/em&gt; → &lt;em&gt;함수 실행&lt;/em&gt; → 결과 / 비동기 처리. &lt;em&gt;서버 관리 0&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;Lambda 적합성&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;REST API (API Gateway + Lambda)&lt;/td&gt;&lt;td&gt;적합, 짧은 처리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;S3 업로드 후 이미지 리사이즈&lt;/td&gt;&lt;td&gt;적합, 이벤트 처리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DynamoDB Streams 변경 감지&lt;/td&gt;&lt;td&gt;적합, poll 처리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SQS 메시지 소비&lt;/td&gt;&lt;td&gt;적합, 자동 스케일&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;웹소켓 상시 연결 유지&lt;/td&gt;&lt;td&gt;&lt;em&gt;부적합&lt;/em&gt;, ECS 권장&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15분 초과 ML 추론&lt;/td&gt;&lt;td&gt;&lt;em&gt;부적합&lt;/em&gt;, ECS/Batch 권장&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU 워크로드&lt;/td&gt;&lt;td&gt;&lt;em&gt;부적합&lt;/em&gt;, EC2 권장&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;트리거-종류&quot;&gt;트리거 종류&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HTTP[&quot;API Gateway / ALB&quot;] --&gt; L[Lambda]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SQS --&gt; L&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SNS --&gt; L&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Kinesis --&gt; L&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DDB[&quot;DynamoDB Streams&quot;] --&gt; L&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3[&quot;S3 events&quot;] --&gt; L&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    EB[EventBridge] --&gt; L&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW[&quot;CloudWatch Events&quot;] --&gt; L&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cognito --&gt; L&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;트리거&lt;/th&gt;&lt;th&gt;모델&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;API Gateway / ALB&lt;/td&gt;&lt;td&gt;sync&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SQS&lt;/td&gt;&lt;td&gt;async poll&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Kinesis / DynamoDB Streams&lt;/td&gt;&lt;td&gt;poll + ordered&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;S3 / SNS / EventBridge&lt;/td&gt;&lt;td&gt;event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cron&lt;/td&gt;&lt;td&gt;EventBridge Scheduler&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;함수-작성&quot;&gt;함수 작성&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// Node.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  console.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;event&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, event);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    statusCode: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    body: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ message: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;hello&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Python&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lambda_handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(event, context):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &apos;statusCode&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &apos;body&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: json.dumps({&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;message&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;hello&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;실행-모델&quot;&gt;실행 모델&lt;/h2&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;모드&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Request-Response (sync)&lt;/td&gt;&lt;td&gt;호출자가 응답 대기&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Async&lt;/td&gt;&lt;td&gt;invoke 후 즉시 반환, 재시도 자동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stream (Kinesis)&lt;/td&gt;&lt;td&gt;batch 처리&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;concurrency&quot;&gt;Concurrency&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Req[&quot;1000 동시 요청&quot;] --&gt; L[Lambda]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L --&gt; I1[&quot;Instance 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L --&gt; I2[&quot;Instance 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L --&gt; IN[&quot;Instance N&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note[&quot;account quota: 1000 기본&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;종류&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Unreserved&lt;/strong&gt; (기본)&lt;/td&gt;&lt;td&gt;account 공통 풀&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Reserved concurrency&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;함수에 한도 / 보장 분리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Provisioned concurrency&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;미리 워밍업&lt;/em&gt; + 콜드 스타트 0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;cold-start&quot;&gt;Cold Start&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Trigger&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Trigger-&gt;&gt;Lambda: invoke&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over Lambda: container 없음&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lambda-&gt;&gt;Lambda: init 50-1000ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lambda-&gt;&gt;Lambda: handler 실행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lambda--&gt;&gt;Trigger: 응답&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over Lambda: 5분 idle 후 종료&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Runtime&lt;/th&gt;&lt;th&gt;평균 cold start&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Node 22&lt;/td&gt;&lt;td&gt;~150ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Python 3.13&lt;/td&gt;&lt;td&gt;~200ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Go&lt;/td&gt;&lt;td&gt;~50ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rust&lt;/td&gt;&lt;td&gt;~30ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Java&lt;/td&gt;&lt;td&gt;&lt;em&gt;500ms-2s&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Java + SnapStart&lt;/td&gt;&lt;td&gt;~150ms&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;cold-start-완화&quot;&gt;Cold Start 완화&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Provisioned Concurrency&lt;/strong&gt;: 항상 N개 워밍업.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda SnapStart&lt;/strong&gt; (Java): &lt;em&gt;snapshot 으로 빠르게&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;smaller package&lt;/strong&gt; (코드 / dependency).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;avoid VPC&lt;/strong&gt; (옛 cold start 5초+, 현재는 빠름).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함수 분리&lt;/strong&gt; (큰 모놀리스 함수 회피).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;memory--cpu&quot;&gt;Memory &amp;#x26; CPU&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Memory 늘리면 &lt;em&gt;CPU 도 비례 증가&lt;/em&gt;. &lt;em&gt;성능 결정의 단일 dial&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Memory&lt;/th&gt;&lt;th&gt;vCPU&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;128 MB&lt;/td&gt;&lt;td&gt;0.083&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1024 MB&lt;/td&gt;&lt;td&gt;0.6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1769 MB&lt;/td&gt;&lt;td&gt;&lt;em&gt;1.0 (full vCPU)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10240 MB&lt;/td&gt;&lt;td&gt;5.78&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;가격&quot;&gt;가격&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;요금 = (실행 시간 ms) x (Memory GB) x $0.0000166667&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     + (실행 횟수) x $0.20/M&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;짧고 자주&lt;/em&gt; 호출되면 &lt;em&gt;호출 비용&lt;/em&gt;, &lt;em&gt;긴 실행&lt;/em&gt; 이면 &lt;em&gt;시간 비용&lt;/em&gt;. 모니터링 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;layers-공유-코드&quot;&gt;Layers (공유 코드)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Layers&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:lambda:us-east-1:123456789012:layer:common-deps:5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;여러 함수가 &lt;em&gt;공유&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;의존성 분리 → 함수 코드 작아짐.&lt;/li&gt;
&lt;li&gt;5 layer per function 한도.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lambda-urls&quot;&gt;Lambda URLs&lt;/h2&gt;
&lt;p&gt;API Gateway 없이 &lt;em&gt;Lambda 에 직접 HTTPS endpoint&lt;/em&gt; 부여.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Lambda URL 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lambda&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-function-url-config&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --function-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-function&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --auth-type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; NONE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 반환: https://&amp;#x3C;id&gt;.lambda-url.&amp;#x3C;region&gt;.on.aws/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;내용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Auth&lt;/td&gt;&lt;td&gt;NONE (공개) 또는 AWS_IAM&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;비용&lt;/td&gt;&lt;td&gt;API Gateway 보다 저렴&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;기능&lt;/td&gt;&lt;td&gt;단순 HTTP 만 지원&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;적합&lt;/td&gt;&lt;td&gt;웹훅, 간단한 API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;부적합&lt;/td&gt;&lt;td&gt;복잡한 라우팅, 인증 미들웨어&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;lambda--edge--cloudfront-functions&quot;&gt;Lambda @ Edge / CloudFront Functions&lt;/h2&gt;
&lt;p&gt;CloudFront &lt;em&gt;엣지 로케이션에서 실행&lt;/em&gt; 하는 Lambda.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Lambda @ Edge&lt;/th&gt;&lt;th&gt;CloudFront Functions&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;실행 위치&lt;/td&gt;&lt;td&gt;Regional edge&lt;/td&gt;&lt;td&gt;450+ POP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;런타임&lt;/td&gt;&lt;td&gt;Node.js, Python&lt;/td&gt;&lt;td&gt;JS (제한)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;실행 시간&lt;/td&gt;&lt;td&gt;최대 30초&lt;/td&gt;&lt;td&gt;1ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;메모리&lt;/td&gt;&lt;td&gt;최대 10GB&lt;/td&gt;&lt;td&gt;2MB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;용도&lt;/td&gt;&lt;td&gt;인증, 변환&lt;/td&gt;&lt;td&gt;단순 리다이렉트&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// Lambda @ Edge: 요청 헤더에 인증 토큰 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;handler&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; request&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event.Records[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].cf.request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; token&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request.headers[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;authorization&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]?.[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]?.value;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;token &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;isValid&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(token)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { status: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;401&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, body: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Unauthorized&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;lambda-extensions&quot;&gt;Lambda Extensions&lt;/h2&gt;
&lt;p&gt;Lambda &lt;em&gt;lifecycle 에 훅&lt;/em&gt; 해서 실행되는 사이드카.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Extension Layer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Init Phase: extension 초기화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Invoke Phase: 함수와 병렬 실행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── Shutdown Phase: 종료 전 처리 (flush logs 등)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;용도&lt;/th&gt;&lt;th&gt;예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;로그 수집&lt;/td&gt;&lt;td&gt;Datadog, New Relic agent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;시크릿 캐시&lt;/td&gt;&lt;td&gt;Secrets Manager 사전 fetch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;코드 검사&lt;/td&gt;&lt;td&gt;RASP (보안 에이전트)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;lambda-powertools&quot;&gt;Lambda Powertools&lt;/h2&gt;
&lt;p&gt;AWS 공식 &lt;em&gt;생산성 라이브러리&lt;/em&gt; (Node.js / Python / Java).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; logger&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Logger&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ serviceName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;order-api&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tracer&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Tracer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ serviceName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;order-api&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; metrics&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Metrics&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ namespace: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;MyApp&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; APIGatewayEvent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  logger.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Processing order&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, { orderId: event.pathParameters?.id });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  metrics.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addMetric&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;OrderProcessed&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, MetricUnit.Count, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;기능&lt;/th&gt;&lt;th&gt;역할&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Logger&lt;/td&gt;&lt;td&gt;구조화 JSON 로깅, correlation ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tracer&lt;/td&gt;&lt;td&gt;X-Ray 자동 계측&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Metrics&lt;/td&gt;&lt;td&gt;EMF 기반 커스텀 메트릭&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Idempotency&lt;/td&gt;&lt;td&gt;중복 실행 방지&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parameters&lt;/td&gt;&lt;td&gt;SSM / Secrets Manager 캐시&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;lambda-의-적합--부적합&quot;&gt;Lambda 의 적합 / 부적합&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;적합&lt;/th&gt;&lt;th&gt;부적합&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;짧은 처리 (&amp;#x3C; 15분)&lt;/td&gt;&lt;td&gt;&lt;em&gt;장시간 처리&lt;/em&gt; (&gt; 15분)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;비동기 이벤트 처리&lt;/td&gt;&lt;td&gt;&lt;em&gt;지속 연결&lt;/em&gt; (WebSocket idle)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;API endpoint&lt;/td&gt;&lt;td&gt;극저지연 (cold start 부담)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ETL batch&lt;/td&gt;&lt;td&gt;큰 메모리 (10GB 초과)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;스케일 spike 흡수&lt;/td&gt;&lt;td&gt;GPU 워크로드&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VPC 안 Lambda 의 cold start&lt;/strong&gt; = ENI 생성 지연. 현재는 빠르지만 옛 경험 주의.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;handler 안에 &lt;em&gt;DB 연결&lt;/em&gt;&lt;/strong&gt; = cold start 마다 새 연결. &lt;em&gt;handler 밖 전역&lt;/em&gt; 으로 warm reuse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;timeout 너무 짧음&lt;/strong&gt; = 무거운 처리 fail. 모니터링 + 늘림.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동시성 한도&lt;/strong&gt; = account 한도 1000 기본. 갑작스런 spike 시 throttling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda URL + NONE auth&lt;/strong&gt; = 공개 endpoint. WAF 연결 또는 IAM 인증 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;임시 파일 &lt;code&gt;/tmp&lt;/code&gt; 한도&lt;/strong&gt; = 512MB 기본 (최대 10GB). 큰 파일 처리 시 S3 사용.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-lambda-cold-start]]&lt;/li&gt;
&lt;li&gt;[[aws-ec2]]&lt;/li&gt;
&lt;li&gt;[[aws-sqs]]&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge]]&lt;/li&gt;
&lt;li&gt;[[aws-api-gateway]]&lt;/li&gt;
&lt;li&gt;[[aws-step-functions]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>lambda</category><category>serverless</category><category>cloud</category><category>compute</category><author>koa (김신건)</author></item><item><title>[AWS] Step Functions: 워크플로 오케스트레이션</title><link>https://shinkeonkim.com/wiki/cloud/aws-step-functions/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-step-functions/</guid><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Step Functions&lt;/strong&gt; = &lt;em&gt;서버리스 워크플로 오케스트레이션&lt;/em&gt;. &lt;em&gt;Amazon States Language (ASL, JSON)&lt;/em&gt; 으로 &lt;em&gt;상태 기계&lt;/em&gt; 정의.&lt;br&gt;
각 단계의 재시도, 에러 처리, 분기, 병렬 실행을 코드 없이 선언적으로 구성.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;Step Functions 활용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;주문 처리 (결제 → 재고 → 배송)&lt;/td&gt;&lt;td&gt;Task 체인 + Catch/Retry&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;인간 승인 후 진행&lt;/td&gt;&lt;td&gt;Wait for Callback&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CSV 파일 행 병렬 처리&lt;/td&gt;&lt;td&gt;Distributed Map&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;마이크로서비스 Saga 패턴&lt;/td&gt;&lt;td&gt;Catch + 보상 Task&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ML 파이프라인 (전처리 → 학습 → 배포)&lt;/td&gt;&lt;td&gt;Parallel + Task&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;주기적 배치&lt;/td&gt;&lt;td&gt;EventBridge Scheduler + SFN&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;asl-예시&quot;&gt;ASL 예시&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;StartAt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ValidateOrder&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;States&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;ValidateOrder&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:lambda:...:validate&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ChargePayment&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Retry&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;ErrorEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Lambda.ServiceException&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;MaxAttempts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;BackoffRate&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Catch&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;ErrorEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ValidationError&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;OrderFailed&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;ChargePayment&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:lambda:...:charge&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ReserveInventory&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Catch&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;ErrorEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;States.ALL&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;RefundPayment&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;ReserveInventory&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:lambda:...:reserve&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ShipOrder&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;ShipOrder&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:lambda:...:ship&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;End&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;OrderFailed&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Fail&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Cause&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Validation&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;RefundPayment&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:lambda:...:refund&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;OrderFailed&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;시각화&quot;&gt;시각화&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Start --&gt; Validate[ValidateOrder]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Validate --&gt;|성공| Charge[ChargePayment]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Validate --&gt;|ValidationError| Fail[OrderFailed]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Charge --&gt;|성공| Reserve[ReserveInventory]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Charge --&gt;|에러| Refund[RefundPayment]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Reserve --&gt; Ship[ShipOrder]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Refund --&gt; Fail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Ship --&gt; End[(End)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;자세한 saga 흐름은 [[saga-pattern]].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;state-종류&quot;&gt;State 종류&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lambda, ECS, Glue, SNS, SQS 등&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Choice&lt;/code&gt;&lt;/td&gt;&lt;td&gt;if-else 분기&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Wait&lt;/code&gt;&lt;/td&gt;&lt;td&gt;대기 (sec, timestamp)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Parallel&lt;/code&gt;&lt;/td&gt;&lt;td&gt;동시 실행&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/td&gt;&lt;td&gt;배열 iterate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Pass&lt;/code&gt;&lt;/td&gt;&lt;td&gt;데이터 변환만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Succeed&lt;/code&gt; / &lt;code&gt;Fail&lt;/code&gt;&lt;/td&gt;&lt;td&gt;종료&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;parallel-state&quot;&gt;Parallel State&lt;/h2&gt;
&lt;p&gt;여러 브랜치를 &lt;em&gt;동시에&lt;/em&gt; 실행, 모두 완료되면 다음 단계 진행.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Parallel&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Branches&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;StartAt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;SendEmailNotification&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;States&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;SendEmailNotification&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:lambda:...:email&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;End&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;StartAt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;UpdateAnalytics&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;States&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;UpdateAnalytics&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:lambda:...:analytics&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;End&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Done&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;브랜치 중 하나라도 실패하면 전체 Parallel 실패. 각 브랜치에 Catch 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;choice-state&quot;&gt;Choice State&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Choice&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Choices&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Variable&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;$.orderAmount&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;NumericGreaterThan&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;PremiumProcessing&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Variable&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;$.paymentMethod&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;StringEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CRYPTO&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Next&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CryptoGateway&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Default&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;StandardProcessing&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Choice 는 &lt;code&gt;End: true&lt;/code&gt; 나 &lt;code&gt;Retry&lt;/code&gt; 없음. 반드시 &lt;code&gt;Default&lt;/code&gt; 설정 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;standard-vs-express&quot;&gt;Standard vs Express&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Standard&lt;/th&gt;&lt;th&gt;Express&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;실행 시간&lt;/td&gt;&lt;td&gt;최대 1년&lt;/td&gt;&lt;td&gt;5분&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;가격 모델&lt;/td&gt;&lt;td&gt;per-transition&lt;/td&gt;&lt;td&gt;duration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;적합&lt;/td&gt;&lt;td&gt;long-running, 인간 승인&lt;/td&gt;&lt;td&gt;짧은 API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;실행 이력&lt;/td&gt;&lt;td&gt;90일&lt;/td&gt;&lt;td&gt;짧음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Throughput&lt;/td&gt;&lt;td&gt;2000/s&lt;/td&gt;&lt;td&gt;&lt;em&gt;100,000+/s&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;map-배열-처리&quot;&gt;Map (배열 처리)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Map&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;ItemsPath&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;$.orders&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;MaxConcurrency&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Iterator&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;StartAt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ProcessOne&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;States&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;ProcessOne&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:lambda:...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;End&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;수만 ~ 수십만 항목&lt;/em&gt; 병렬 처리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;distributed-map-2022&quot;&gt;Distributed Map (2022+)&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;수백만 항목&lt;/em&gt;까지. S3 prefix 의 모든 객체 처리 같은 &lt;em&gt;큰 batch&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Map&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;ItemReader&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:states:::s3:getObject&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Parameters&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Bucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;my-bucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Key&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;data/records.csv&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;MaxConcurrency&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;ToleratedFailurePercentage&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wait-for-callback&quot;&gt;Wait for Callback&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Task&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:states:::lambda:invoke.waitForTaskToken&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Parameters&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;FunctionName&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;manual-approval-notifier&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Payload&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;taskToken.$&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;$$.Task.Token&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;인간 승인 / 외부 API 응답 대기&lt;/em&gt;. 토큰을 외부에 넘기고 &lt;em&gt;완료 알림 대기&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;saga-패턴-아키텍처&quot;&gt;Saga 패턴 아키텍처&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Start --&gt; Order[&quot;주문 생성&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Order --&gt;|성공| Payment[&quot;결제 처리&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Order --&gt;|실패| End1[&quot;종료: 실패&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Payment --&gt;|성공| Inventory[&quot;재고 예약&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Payment --&gt;|실패| CancelOrder[&quot;주문 취소&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Inventory --&gt;|성공| Ship[&quot;배송 처리&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Inventory --&gt;|실패| RefundPay[&quot;결제 환불&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RefundPay --&gt; CancelOrder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Ship --&gt; Done[&quot;완료&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;각 단계 실패 시 &lt;em&gt;보상 트랜잭션&lt;/em&gt; 역순 실행. Step Functions 의 Catch 로 구현.&lt;br&gt;
자세히는 [[saga-pattern]], [[outbox-pattern]].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;모니터링&quot;&gt;모니터링&lt;/h2&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;도구&lt;/th&gt;&lt;th&gt;용도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CloudWatch Logs&lt;/td&gt;&lt;td&gt;실행 이력, 상태 전환 로그&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;X-Ray&lt;/td&gt;&lt;td&gt;각 Task 의 latency / 오류 추적&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CloudWatch Metrics&lt;/td&gt;&lt;td&gt;ExecutionsStarted, ExecutionsFailed 등&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SAM/CloudFormation 에서 로깅 활성화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;StateMachine&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS::Serverless::StateMachine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Properties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Logging&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Level&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ALL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      IncludeExecutionData&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Destinations&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;CloudWatchLogsLogGroup&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;            LogGroupArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!GetAtt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; SFNLogGroup.Arn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-functions-vs-temporal&quot;&gt;Step Functions vs Temporal&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Step Functions&lt;/th&gt;&lt;th&gt;Temporal&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;운영&lt;/td&gt;&lt;td&gt;managed (AWS)&lt;/td&gt;&lt;td&gt;self-host 또는 Temporal Cloud&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;코드&lt;/td&gt;&lt;td&gt;JSON ASL&lt;/td&gt;&lt;td&gt;&lt;em&gt;언어 코드 (TS, Go, Java, …)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;학습 곡선&lt;/td&gt;&lt;td&gt;중간&lt;/td&gt;&lt;td&gt;높음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;가격&lt;/td&gt;&lt;td&gt;per-transition&lt;/td&gt;&lt;td&gt;hosted 또는 자체&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;적합&lt;/td&gt;&lt;td&gt;AWS-native&lt;/td&gt;&lt;td&gt;멀티 클라우드 / 복잡 코드&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Retry / Catch 미정의&lt;/strong&gt; = 한 단계 실패 = 전체 fail. &lt;em&gt;명시 정책&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Express 의 &lt;em&gt;5분 한도&lt;/em&gt;&lt;/strong&gt; = 모르고 사용하면 truncation. Standard 권장 (모르면).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;상태 사이 데이터 전달 &lt;em&gt;너무 큼&lt;/em&gt;&lt;/strong&gt; = 256KB 한도. S3 reference 패턴 사용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시각화만 의존&lt;/strong&gt; = 복잡 workflow 의 &lt;em&gt;디버깅 어려움&lt;/em&gt;. CloudWatch Logs + X-Ray.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Choice 의 Default 없음&lt;/strong&gt; = 매칭 실패 시 runtime error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallel 브랜치에서 외부 상태 변경&lt;/strong&gt; = 보상 트랜잭션 없으면 partial 업데이트 위험.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-lambda]]&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge]]&lt;/li&gt;
&lt;li&gt;[[saga-pattern]]&lt;/li&gt;
&lt;li&gt;[[outbox-pattern]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>step-functions</category><category>workflow</category><category>orchestration</category><category>serverless</category><author>koa (김신건)</author></item><item><title>[AWS] ALB vs NLB: L7 vs L4 로드 밸런서</title><link>https://shinkeonkim.com/wiki/cloud/aws-alb-nlb/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-alb-nlb/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;ALB&lt;/th&gt;&lt;th&gt;NLB&lt;/th&gt;&lt;th&gt;(Classic ELB)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Layer&lt;/td&gt;&lt;td&gt;&lt;em&gt;L7 (HTTP)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;L4 (TCP/UDP)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;L4 + L7 (legacy)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;라우팅&lt;/td&gt;&lt;td&gt;path / host / header&lt;/td&gt;&lt;td&gt;port&lt;/td&gt;&lt;td&gt;단순&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TLS termination&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;O (TLS listener)&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebSocket&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;부분&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;gRPC&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;X&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;처리량&lt;/td&gt;&lt;td&gt;큼&lt;/td&gt;&lt;td&gt;&lt;em&gt;매우 큼&lt;/em&gt;&lt;/td&gt;&lt;td&gt;보통&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Static IP&lt;/td&gt;&lt;td&gt;NO&lt;/td&gt;&lt;td&gt;&lt;em&gt;예 (EIP)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;NO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Latency&lt;/td&gt;&lt;td&gt;중간 (ms)&lt;/td&gt;&lt;td&gt;&lt;em&gt;극저지연&lt;/em&gt; (us)&lt;/td&gt;&lt;td&gt;중간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;가격&lt;/td&gt;&lt;td&gt;LCU (요청 + 데이터)&lt;/td&gt;&lt;td&gt;LCU&lt;/td&gt;&lt;td&gt;시간 + GB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;선택&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;HTTP/HTTPS 마이크로서비스 라우팅&lt;/td&gt;&lt;td&gt;ALB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;path/host 기반 분기 (microservices)&lt;/td&gt;&lt;td&gt;ALB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WAF, Cognito OIDC 인증 앞단&lt;/td&gt;&lt;td&gt;ALB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lambda 직접 호출&lt;/td&gt;&lt;td&gt;ALB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;극저지연 TCP 트래픽 (게임, 금융)&lt;/td&gt;&lt;td&gt;NLB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;static IP 필요 (방화벽 화이트리스트)&lt;/td&gt;&lt;td&gt;NLB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AWS PrivateLink 엔드포인트&lt;/td&gt;&lt;td&gt;NLB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;수백만 동시 연결&lt;/td&gt;&lt;td&gt;NLB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;alb-application-load-balancer&quot;&gt;ALB (Application Load Balancer)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client --&gt;|HTTP| ALB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB --&gt;|&quot;/api/*&quot;| Tg1[&quot;Target Group 1&amp;#x3C;br/&gt;(api pods)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB --&gt;|&quot;/web/*&quot;| Tg2[&quot;Target Group 2&amp;#x3C;br/&gt;(web pods)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB --&gt;|&quot;host: admin.x.com&quot;| Tg3[&quot;Target Group 3&amp;#x3C;br/&gt;(admin)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기능:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Path-based / Host-based / Header / Query routing&lt;/li&gt;
&lt;li&gt;WebSocket / HTTP/2 (gRPC)&lt;/li&gt;
&lt;li&gt;WAF 통합&lt;/li&gt;
&lt;li&gt;Cognito / OIDC 인증 (앞단)&lt;/li&gt;
&lt;li&gt;Lambda 직접 target&lt;/li&gt;
&lt;li&gt;IP 또는 instance target&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;nlb-network-load-balancer&quot;&gt;NLB (Network Load Balancer)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client --&gt;|TCP/UDP| NLB[&quot;NLB&amp;#x3C;br/&gt;(static IP, AZ 별)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NLB --&gt; Tg[Target Group]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Tg --&gt; EC2[(EC2 / IP)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기능:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;극저지연&lt;/em&gt;: 마이크로초.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;static IP&lt;/em&gt;: AZ 별 EIP 고정 (방화벽 허용 친화).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;millions of conn&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;TLS termination 옵션.&lt;/li&gt;
&lt;li&gt;TCP / UDP / TLS listener.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;em&gt;gRPC, WebSocket idle 대응&lt;/em&gt; 은 &lt;em&gt;NLB 가 ALB 보다 안정&lt;/em&gt;. 정 idle timeout 길게.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;선택-트리&quot;&gt;선택 트리&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1{프로토콜}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt;|HTTP / HTTPS / gRPC| Q2{L7 라우팅 필요?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt;|TCP / UDP| NLB[NLB]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|예| ALB[ALB]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|아니오 + 극저지연| NLB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|아니오 + 일반| ALB&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;target-group&quot;&gt;Target Group&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;TargetType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;instance | ip | lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;HealthCheck&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Path&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/health&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Interval&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;30s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  HealthyThreshold&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  UnhealthyThreshold&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target group을 서비스별로 분리하면 ALB 하나로 멀티 서비스 라우팅 가능.&lt;/p&gt;
&lt;h2 id=&quot;alb-listener-규칙-우선순위&quot;&gt;ALB Listener 규칙 우선순위&lt;/h2&gt;
&lt;p&gt;규칙은 1~50000 우선순위로 평가. 낮을수록 먼저.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 규칙 추가 예시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; elbv2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-rule&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --listener-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:elasticloadbalancing:...:listener/...&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --priority&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --conditions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;[{&quot;Field&quot;:&quot;path-pattern&quot;,&quot;Values&quot;:[&quot;/api/*&quot;]}]&apos;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --actions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;[{&quot;Type&quot;:&quot;forward&quot;,&quot;TargetGroupArn&quot;:&quot;arn:...&quot;}]&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;조건 (Field)&lt;/th&gt;&lt;th&gt;예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;path-pattern&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/api/*&lt;/code&gt;, &lt;code&gt;/static/*&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;host-header&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;api.example.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;http-header&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;X-Custom-Header: value&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;source-ip&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;10.0.0.0/8&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;query-string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;env=canary&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;https--tls-설정&quot;&gt;HTTPS / TLS 설정&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HTTPS Listener 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; elbv2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-listener&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --load-balancer-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:...&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --protocol&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; HTTPS&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --port&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 443&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --certificates&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CertificateArn=arn:aws:acm:...:certificate/...&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --ssl-policy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ELBSecurityPolicy-TLS13-1-2-2021-06&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --default-actions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Type=forward,TargetGroupArn=arn:...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HTTP → HTTPS redirect&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; elbv2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-listener&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --load-balancer-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:...&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --protocol&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; HTTP&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --port&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 80&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --default-actions&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    Type=redirect,RedirectConfig=&apos;{Protocol=HTTPS,StatusCode=HTTP_301}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
SSL Policy 는 최소 &lt;code&gt;ELBSecurityPolicy-TLS13-1-2-2021-06&lt;/code&gt; 권장. TLS 1.0/1.1 비활성.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;sticky-session&quot;&gt;Sticky Session&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Stickiness&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;lb_cookie&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;     # ALB 가 쿠키 박음&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는 application-controlled (app 이 cookie 박음).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;세션 sticky는 stateful 앱에서만. 가능하면 stateless 설계 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;waf-통합-alb-만&quot;&gt;WAF 통합 (ALB 만)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client --&gt; WAF[AWS WAF]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    WAF --&gt; ALB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB --&gt; Target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note[ALB 앞단 WAF: SQLi, XSS, rate limit, bot]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;alb--lambda&quot;&gt;ALB → Lambda&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;TargetType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Targets&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:lambda:us-east-1:123:function:myFunc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;API Gateway 대신 ALB + Lambda&lt;/em&gt; 도 가능. 더 cheap, REST API 만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;nlb--privatelink&quot;&gt;NLB + PrivateLink&lt;/h2&gt;
&lt;p&gt;NLB를 VPC Endpoint Service 로 노출. 다른 VPC/계정에서 프라이빗 접근.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ConsumerVPC[&quot;Consumer VPC&quot;] --&gt;|&quot;VPC Endpoint&quot;| PrivateLink[&quot;AWS PrivateLink&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PrivateLink --&gt; NLB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NLB --&gt; ServiceVPC[&quot;Service VPC (Provider)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Endpoint Service 생성 (NLB 기반)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-vpc-endpoint-service-configuration&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --network-load-balancer-arns&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:elasticloadbalancing:...:loadbalancer/net/...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;SaaS 서비스가 고객 VPC에 안전하게 서비스 제공 시 표준 패턴.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;cross-zone-load-balancing&quot;&gt;Cross-Zone Load Balancing&lt;/h2&gt;
&lt;p&gt;기본값:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ALB: 활성화&lt;/li&gt;
&lt;li&gt;NLB: 비활성화 (AZ 내 균등 분산)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# NLB cross-zone 활성화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; elbv2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modify-load-balancer-attributes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --load-balancer-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:...&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attributes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Key=load_balancing.cross_zone.enabled,Value=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;NLB cross-zone 활성화 시 AZ 간 데이터 전송 비용 발생.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;connection-draining-deregistration-delay&quot;&gt;Connection Draining (Deregistration Delay)&lt;/h2&gt;
&lt;p&gt;Target 제거 전 기존 연결을 안전하게 종료.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; elbv2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modify-target-group-attributes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --target-group-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:...&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attributes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Key=deregistration_delay.timeout_seconds,Value=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기본 300초. 빠른 배포 환경에서는 30-60초로 줄이기.&lt;/p&gt;
&lt;h2 id=&quot;access-log&quot;&gt;Access Log&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Access Log 활성화 (S3)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; elbv2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modify-load-balancer-attributes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --load-balancer-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:...&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attributes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    Key=access_logs.s3.enabled,Value=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    Key=access_logs.s3.bucket,Value=my-alb-logs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    Key=access_logs.s3.prefix,Value=alb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;로그 필드: &lt;code&gt;time&lt;/code&gt;, &lt;code&gt;elb&lt;/code&gt;, &lt;code&gt;client:port&lt;/code&gt;, &lt;code&gt;target:port&lt;/code&gt;, &lt;code&gt;request&lt;/code&gt;, &lt;code&gt;target_status_code&lt;/code&gt;, &lt;code&gt;user_agent&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Athena로 분석:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; client_ip, request_url, target_status_code, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;COUNT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cnt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; alb_logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WHERE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; time&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;2026-07-16&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;GROUP BY&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ORDER BY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LIMIT&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cloudwatch-핵심-메트릭&quot;&gt;CloudWatch 핵심 메트릭&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;메트릭&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;RequestCount&lt;/code&gt;&lt;/td&gt;&lt;td&gt;총 요청 수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TargetResponseTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;백엔드 응답 시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;HTTPCode_Target_5XX_Count&lt;/code&gt;&lt;/td&gt;&lt;td&gt;백엔드 5xx 에러&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;HTTPCode_ELB_5XX_Count&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ALB 자체 5xx&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;HealthyHostCount&lt;/code&gt;&lt;/td&gt;&lt;td&gt;헬시 타겟 수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;UnHealthyHostCount&lt;/code&gt;&lt;/td&gt;&lt;td&gt;비헬시 타겟 수&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;UnHealthyHostCount &gt; 0&lt;/code&gt; 알림 필수. 배포 중 타겟이 줄어들면 즉각 탐지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ALB Idle Timeout 60s&lt;/strong&gt; = WebSocket / SSE 가 silent close. ping/pong 또는 timeout 늘림.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NLB + auto-scaling&lt;/strong&gt; = NLB 의 &lt;em&gt;target deregistration delay&lt;/em&gt;. 트래픽 차단 후 &lt;em&gt;수십 초&lt;/em&gt; 까지 일부 요청.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/2 → 백엔드는 HTTP/1.1&lt;/strong&gt; = ALB 가 down-grade. gRPC backend 는 &lt;em&gt;NLB&lt;/em&gt; 또는 HTTP/2 enable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NLB cross-zone disabled&lt;/strong&gt; = AZ 간 불균등 분포. enable 권장 (가격 약간 더).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ALB 규칙 한도&lt;/strong&gt; = Listener당 규칙 100개 제한. path 패턴 조합 주의.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Health Check 경로 인증&lt;/strong&gt; = &lt;code&gt;/health&lt;/code&gt; 에 인증 걸면 ALB가 401 받아 unhealthy 판정. 인증 제외.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NLB 의 Source IP 보존&lt;/strong&gt; = NLB는 기본적으로 클라이언트 IP 보존. ALB는 X-Forwarded-For 헤더.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[load-balancer]]&lt;/li&gt;
&lt;li&gt;[[aws-vpc]]&lt;/li&gt;
&lt;li&gt;[[aws-route53]]&lt;/li&gt;
&lt;li&gt;[[k8s-ingress]]&lt;/li&gt;
&lt;li&gt;[[aws-waf]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudfront-cdn]]&lt;/li&gt;
&lt;li&gt;[[k8s-service]]&lt;/li&gt;
&lt;li&gt;[[aws-ecs]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>alb</category><category>nlb</category><category>load-balancer</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] CloudFront: CDN, origin, behavior, signed URL</title><link>https://shinkeonkim.com/wiki/cloud/aws-cloudfront-cdn/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-cloudfront-cdn/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CloudFront&lt;/strong&gt; = AWS 의 &lt;em&gt;글로벌 CDN&lt;/em&gt;. 전세계 ~600 PoP (Points of Presence) 에서 사용자에게 가까운 edge 로 콘텐츠 제공. 지연 감소 + origin 부하 감소.&lt;/p&gt;
&lt;h2 id=&quot;동작-흐름&quot;&gt;동작 흐름&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Client as 사용자 (서울)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Edge as &quot;CloudFront Edge\n(서울 PoP)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Regional as &quot;Regional Edge Cache\n(도쿄)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Origin as &quot;Origin (S3 / ALB)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client-&gt;&gt;Edge: GET /image.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    alt cache HIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Edge--&gt;&gt;Client: 즉시 응답 (&amp;#x3C; 10ms)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    else cache MISS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Edge-&gt;&gt;Regional: 상위 캐시 조회&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        alt regional HIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            Regional--&gt;&gt;Edge: 캐시 응답&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            Edge--&gt;&gt;Client: 응답 + 캐싱&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        else regional MISS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            Regional-&gt;&gt;Origin: origin fetch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            Origin--&gt;&gt;Regional: 응답&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            Regional--&gt;&gt;Edge: 전달 + 캐싱&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            Edge--&gt;&gt;Client: 응답&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;origin-종류&quot;&gt;Origin 종류&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Origin&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;사용 사례&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;S3&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;정적 파일, 이미지, SPA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;ALB / NLB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;동적 API, 웹 앱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Custom HTTP (any)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;외부 자체 서버&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Lambda Function URL&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;서버리스 API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;MediaPackage&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;라이브/VOD 스트리밍&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;API Gateway&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;REST / WebSocket API&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;cache-behavior&quot;&gt;Cache Behavior&lt;/h2&gt;
&lt;p&gt;요청 경로 패턴별로 다른 origin + 캐시 정책 적용.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Req[&quot;요청 URL&quot;] --&gt; Behavior[&quot;Cache Behavior\n(패턴 매칭)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Behavior --&gt;|&quot;/static/*&quot;| BehA[&quot;S3 origin\nCache-Control: 1일&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Behavior --&gt;|&quot;/api/*&quot;| BehB[&quot;ALB origin\nno-cache, no-store&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Behavior --&gt;|&quot;* (default)&quot;| BehC[&quot;S3 origin\nCache-Control: 1시간&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;매칭 우선순위&lt;/strong&gt;: 더 구체적인 패턴이 먼저. &lt;code&gt;/api/v2/*&lt;/code&gt; 가 &lt;code&gt;/api/*&lt;/code&gt; 보다 먼저 평가.&lt;/p&gt;
&lt;h2 id=&quot;cache-key-설계&quot;&gt;Cache Key 설계&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;CachePolicy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  HeadersConfig&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    HeaderBehavior&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;whitelist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Headers&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Accept-Encoding&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Accept-Language&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  CookiesConfig&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CookieBehavior&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;whitelist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Cookies&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;session-id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  QueryStringsConfig&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    QueryStringBehavior&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;whitelist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    QueryStrings&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;locale&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;cache key 에 포함되는 항목이 많을수록 cache hit rate 떨어짐. &lt;em&gt;최소한&lt;/em&gt;의 key 로 유지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Origin Request Policy&lt;/strong&gt; 와 분리: cache key 에는 없지만 origin 에 전달할 header/cookie/query 를 별도 정의 가능.&lt;/p&gt;
&lt;h2 id=&quot;oac-origin-access-control&quot;&gt;OAC (Origin Access Control)&lt;/h2&gt;
&lt;p&gt;S3 origin 의 직접 접근 차단 + CloudFront 만 허용.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# S3 Bucket Policy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Statement&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Effect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Allow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Principal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Service&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;cloudfront.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;s3:GetObject&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Resource&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:s3:::my-bucket/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Condition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      StringEquals&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        AWS:SourceArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:cloudfront::123456789:distribution/EXXX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;옛 OAI (Origin Access Identity) 의 후계 (2022+)&lt;/li&gt;
&lt;li&gt;OAC 는 SSE-KMS 암호화 S3 도 지원&lt;/li&gt;
&lt;li&gt;S3 퍼블릭 차단 설정 유지 상태에서 CloudFront 만 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;signed-url--signed-cookie&quot;&gt;Signed URL / Signed Cookie&lt;/h2&gt;
&lt;p&gt;보호된 콘텐츠에 임시 접근 URL 생성.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CLI 로 signed URL 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudfront&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sign&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --url&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://d111.cloudfront.net/private/video.mp4&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --key-pair-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; K1234567890&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --private-key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; file://cloudfront-private-key.pem&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --date-less-than&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 2026-12-31T23:59:59Z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Boto3 Python&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; botocore.signers &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; CloudFrontSigner&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; rsa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rsa_signer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(message):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    with&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;private_key.pem&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;rb&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        private_key &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; rsa.PrivateKey.load_pkcs1(f.read())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; rsa.sign(message, private_key, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;SHA-1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;signer &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; CloudFrontSigner(key_id, rsa_signer)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;url &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; signer.generate_presigned_url(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;https://d111.cloudfront.net/private/doc.pdf&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    date_less_than&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;datetime(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2026&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;31&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Signed URL vs Signed Cookie&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Signed URL&lt;/em&gt;: 파일 단건. 다운로드 링크, 동영상 단건&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Signed Cookie&lt;/em&gt;: 여러 파일. 구독 콘텐츠, 멤버십 전체 섹션&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;edge-compute&quot;&gt;Edge Compute&lt;/h2&gt;
&lt;p&gt;CloudFront 에서 코드 실행. 두 가지 옵션.&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;CloudFront Functions&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Lambda@Edge&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Runtime&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;JS (ES 2019)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Node.js, Python&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;실행 위치&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;edge PoP (가장 빠름)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Regional edge cache&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Cold start&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;있음 (드물게)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;실행 시간 한도&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1ms&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;viewer: 5s / origin: 30s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;메모리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2MB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;128MB-10GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;가격&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.1/100만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lambda 가격&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;네트워크 접근&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;불가&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;사용 사례&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;header 조작, redirect, A/B&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;인증, 이미지 변환, 복잡 로직&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// CloudFront Functions: URL 정규화 예시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; request&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event.request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // /blog/post/ -&gt; /blog/post/index.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (request.uri.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;endsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;/&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        request.uri &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;index.html&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Lambda@Edge: JWT 인증 (origin request)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; jwt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(event, context):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    request &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Records&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;cf&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;request&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    headers &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request.get(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;headers&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    auth &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; headers.get(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;authorization&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, [{}])[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].get(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;value&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    try&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        token &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; auth.replace(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Bearer &apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        jwt.decode(token, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;SECRET_KEY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;algorithms&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;HS256&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 통과&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    except&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Exception&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;status&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;401&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;body&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Unauthorized&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tls--인증서&quot;&gt;TLS / 인증서&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;AWS Certificate Manager (ACM)&lt;/em&gt; 무료 인증서 사용&lt;/li&gt;
&lt;li&gt;반드시 &lt;strong&gt;us-east-1&lt;/strong&gt; (N. Virginia) 에서 발급 (CloudFront 가 글로벌 서비스이므로)&lt;/li&gt;
&lt;li&gt;SNI (Server Name Indication) 기본 활성. 전용 IP 옵션 ($600/월) 은 레거시 클라이언트 지원 시만&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 서울에서 발급한 인증서는 CloudFront 에 사용 불가&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# us-east-1 에서 발급 필수&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; acm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; request-certificate&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --domain-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --subject-alternative-names&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.example.com&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --validation-method&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DNS&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --region&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; us-east-1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;캐시-무효화-invalidation&quot;&gt;캐시 무효화 (Invalidation)&lt;/h2&gt;
&lt;p&gt;배포 후 캐시 즉시 갱신.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 특정 경로 무효화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudfront&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-invalidation&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --distribution-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; EXXX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --paths&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /index.html&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /app.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 전체 무효화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudfront&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-invalidation&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --distribution-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; EXXX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --paths&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;/*&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;비용&lt;/strong&gt;: 첫 1000 path/월 무료, 이후 $0.005/path. 와일드카드 &lt;code&gt;/*&lt;/code&gt; 는 1 path 로 계산.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CI/CD 배포마다 &lt;code&gt;/*&lt;/code&gt; 무효화는 비효율적. 파일명에 hash 포함 (&lt;code&gt;app.abc123.js&lt;/code&gt;) 후 영구 캐시 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;비용-구조&quot;&gt;비용 구조&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;요금 (서울 리전)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;데이터 전송 (아웃바운드)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.114/GB (첫 10TB)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;HTTP 요청&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.0075/10만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;HTTPS 요청&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.01/10만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;무효화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1000 path/월 무료 후 $0.005/path&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Lambda@Edge&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lambda 요금 + 리전 추가 비용&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;비용 최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3 origin 은 CloudFront 통해 내보낼 때 무료 (S3 → CloudFront 데이터 전송 무료)&lt;/li&gt;
&lt;li&gt;cache hit rate 높이면 origin 트래픽 + 비용 감소&lt;/li&gt;
&lt;li&gt;Price Class 로 서비스 지역 제한 (US/EU 만 = 저렴)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cloudfront--waf-조합&quot;&gt;CloudFront + WAF 조합&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Internet[&quot;인터넷 트래픽&quot;] --&gt; WAF[&quot;AWS WAF\n(규칙 필터)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    WAF --&gt;|&quot;허용&quot;| CF[&quot;CloudFront&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    WAF --&gt;|&quot;차단&quot;| Block[&quot;403 / 200 with error&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CF --&gt; Origin[&quot;Origin&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WAF 규칙: IP 차단, geo 제한, rate limiting, OWASP 관리형 규칙, bot 탐지.&lt;/p&gt;
&lt;p&gt;CloudFront distribution 단위로 WAF WebACL 연결 (us-east-1 에서 생성한 WebACL).&lt;/p&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Origin 의 Cache-Control 헤더 누락&lt;/strong&gt;: CloudFront 가 캐싱 안 함. Origin 에서 &lt;code&gt;Cache-Control: max-age=...&lt;/code&gt; 명시 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 origin 퍼블릭 오픈&lt;/strong&gt;: CloudFront 우회 가능. OAC 필수, S3 버킷 퍼블릭 차단 유지.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS cert wrong region&lt;/strong&gt;: us-east-1 이 아닌 리전의 ACM cert 는 CloudFront 에서 사용 불가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;무효화 남용&lt;/strong&gt;: &lt;code&gt;/*&lt;/code&gt; 매 배포마다 실행 = 비용 + hit rate 0. hash 파일명으로 대체.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda@Edge 디버깅 어려움&lt;/strong&gt;: 전 세계 리전에서 실행. CloudWatch Logs 가 실행 리전에 분산.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
Lambda@Edge 는 CDK/CloudFormation 배포 후 edge 전파까지 수 분 소요. 배포 직후 즉시 반영 아님.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
CloudFront distribution 삭제 전 비활성화 필수. 비활성화 후 삭제까지 15분 이상 소요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-s3]] - 정적 파일 origin&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb]] - 동적 origin&lt;/li&gt;
&lt;li&gt;[[aws-route53]] - Custom domain DNS&lt;/li&gt;
&lt;li&gt;[[aws-lambda]] - Lambda@Edge / Function URL origin&lt;/li&gt;
&lt;li&gt;[[aws-waf]] - 트래픽 필터링&lt;/li&gt;
&lt;li&gt;[[aws-shield]] - DDoS 방어&lt;/li&gt;
&lt;li&gt;[[network-http-caching]] - HTTP 캐시 원리&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloudfront</category><category>cdn</category><category>edge</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] EC2: 인스턴스 타입, AMI, EBS</title><link>https://shinkeonkim.com/wiki/cloud/aws-ec2/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-ec2/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;EC2 (Elastic Compute Cloud)&lt;/strong&gt; = AWS 의 &lt;em&gt;VM 서비스&lt;/em&gt;. &lt;em&gt;instance type&lt;/em&gt; (CPU / RAM / NW) 결정 + &lt;em&gt;AMI&lt;/em&gt; (OS 이미지) + &lt;em&gt;EBS&lt;/em&gt; (스토리지).&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;선택&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;웹 서버, 앱 서버&lt;/td&gt;&lt;td&gt;m/c family On-Demand&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;비용 절감 (예측 가능 트래픽)&lt;/td&gt;&lt;td&gt;Reserved / Savings Plans&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;배치, 비동기 처리, CI&lt;/td&gt;&lt;td&gt;Spot Instance&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU 딥러닝 학습&lt;/td&gt;&lt;td&gt;p/g family&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;고메모리 DB 인스턴스&lt;/td&gt;&lt;td&gt;r/x family&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;로컬 NVMe 캐시 필요&lt;/td&gt;&lt;td&gt;i family&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;컨테이너 worker node&lt;/td&gt;&lt;td&gt;m/c Graviton + Spot&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;인스턴스-타입-명명&quot;&gt;인스턴스 타입 명명&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;m6i.large&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ │ └── size (nano, micro, small, medium, large, xlarge, 2xlarge, ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ └──── generation modifier (i=Intel, a=AMD, g=Graviton ARM, n=network, ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────── family (m=general, c=compute, r=memory, x=extreme memory, p=GPU, ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        세대 (6 = 6세대)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Family&lt;/th&gt;&lt;th&gt;용도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;burstable (가벼운 워크로드)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;m&lt;/code&gt;&lt;/td&gt;&lt;td&gt;general purpose&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;compute optimized&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;r&lt;/code&gt;&lt;/td&gt;&lt;td&gt;memory optimized&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;x&lt;/code&gt;/&lt;code&gt;u&lt;/code&gt;&lt;/td&gt;&lt;td&gt;high memory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;i&lt;/code&gt;&lt;/td&gt;&lt;td&gt;storage optimized (NVMe)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;&lt;td&gt;dense HDD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;p&lt;/code&gt;/&lt;code&gt;g&lt;/code&gt;/&lt;code&gt;inf&lt;/code&gt;/&lt;code&gt;trn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GPU / AI accelerator&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;graviton-arm-vs-intelamd&quot;&gt;Graviton (ARM) vs Intel/AMD&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Intel (&lt;code&gt;m7i&lt;/code&gt;)&lt;/th&gt;&lt;th&gt;AMD (&lt;code&gt;m7a&lt;/code&gt;)&lt;/th&gt;&lt;th&gt;Graviton (&lt;code&gt;m7g&lt;/code&gt;)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;아키텍처&lt;/td&gt;&lt;td&gt;x86-64&lt;/td&gt;&lt;td&gt;x86-64&lt;/td&gt;&lt;td&gt;ARM64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;가격 (vs Intel)&lt;/td&gt;&lt;td&gt;1.0x&lt;/td&gt;&lt;td&gt;~0.9x&lt;/td&gt;&lt;td&gt;&lt;em&gt;~0.8x&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;성능 (workload)&lt;/td&gt;&lt;td&gt;기준&lt;/td&gt;&lt;td&gt;비슷&lt;/td&gt;&lt;td&gt;&lt;em&gt;비슷 또는 우수&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;호환성&lt;/td&gt;&lt;td&gt;모든 OS&lt;/td&gt;&lt;td&gt;모든 OS&lt;/td&gt;&lt;td&gt;ARM 빌드 필요&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;em&gt;2026 시점 Graviton (ARM) 이 비용 효율 최강&lt;/em&gt;. 모든 새 워크로드는 &lt;em&gt;ARM 호환 빌드부터&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;purchase-options&quot;&gt;Purchase Options&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q{사용 패턴}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; OD[&quot;On-Demand (기본 가격)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Spot[&quot;Spot (최대 90% 할인, 중단 위험)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Reserved[&quot;Reserved (1/3년 약정, 최대 72% 할인)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; SP[&quot;Savings Plans (약정 시간당 $, 유연)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;옵션&lt;/th&gt;&lt;th&gt;할인&lt;/th&gt;&lt;th&gt;적합&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;On-Demand&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;td&gt;임시 / 테스트&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Spot&lt;/td&gt;&lt;td&gt;60-90%&lt;/td&gt;&lt;td&gt;&lt;em&gt;batch, stateless, K8s worker&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reserved Instances&lt;/td&gt;&lt;td&gt;40-72%&lt;/td&gt;&lt;td&gt;안정 워크로드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Savings Plans&lt;/td&gt;&lt;td&gt;25-72%&lt;/td&gt;&lt;td&gt;가장 유연&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dedicated Host&lt;/td&gt;&lt;td&gt;비쌈&lt;/td&gt;&lt;td&gt;컴플라이언스&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;spot-instance&quot;&gt;Spot Instance&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant User&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant AWS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;AWS: Spot request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AWS--&gt;&gt;User: &quot;Spot instance (90% 할인)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over AWS: capacity 부족&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AWS-&gt;&gt;User: 2분 중단 알림&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over User: graceful shutdown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AWS-&gt;&gt;User: instance reclaim&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
Karpenter / EKS managed node group 의 &lt;em&gt;spot&lt;/em&gt; + &lt;em&gt;on-demand&lt;/em&gt; 혼합이 &lt;em&gt;2026 표준&lt;/em&gt;. 비용 60%+ 절감.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;ami-amazon-machine-image&quot;&gt;AMI (Amazon Machine Image)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; describe-images&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --owners&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; amazon&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --filters&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;Name=name,Values=al2023-ami-*-x86_64&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;Name=state,Values=available&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;옵션&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Amazon Linux 2023&lt;/td&gt;&lt;td&gt;AWS 최신&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ubuntu LTS&lt;/td&gt;&lt;td&gt;가장 흔함&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bottlerocket&lt;/td&gt;&lt;td&gt;container 전용 (EKS)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Custom AMI&lt;/td&gt;&lt;td&gt;Packer 로 빌드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Marketplace&lt;/td&gt;&lt;td&gt;RHEL, Windows, 3rd-party&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;user-data-부팅-스크립트&quot;&gt;User Data (부팅 스크립트)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;yum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;yum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; enable&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --now&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;EC2 부팅 시 &lt;em&gt;1회 실행&lt;/em&gt;. &lt;em&gt;cloud-init&lt;/em&gt; 기반.&lt;/p&gt;
&lt;h2 id=&quot;instance-metadata-service-imds&quot;&gt;Instance Metadata Service (IMDS)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;TOKEN&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -X&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; PUT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;http://169.254.169.254/latest/api/token&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -H&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -H&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;X-aws-ec2-metadata-token: &lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$TOKEN&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  http://169.254.169.254/latest/meta-data/instance-id&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;em&gt;IMDSv2 (token 필수)&lt;/em&gt; 가 SSRF 공격 방어. &lt;em&gt;IMDSv1 비활성&lt;/em&gt; 강력 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;ebs-volume-타입&quot;&gt;EBS Volume 타입&lt;/h2&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;타입&lt;/th&gt;&lt;th&gt;용도&lt;/th&gt;&lt;th&gt;최대 IOPS&lt;/th&gt;&lt;th&gt;최대 처리량&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;gp3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;범용 SSD (기본 권장)&lt;/td&gt;&lt;td&gt;16,000&lt;/td&gt;&lt;td&gt;1,000 MB/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;gp2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;범용 SSD (구형)&lt;/td&gt;&lt;td&gt;16,000&lt;/td&gt;&lt;td&gt;250 MB/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;io2 Block Express&lt;/code&gt;&lt;/td&gt;&lt;td&gt;고성능 DB&lt;/td&gt;&lt;td&gt;256,000&lt;/td&gt;&lt;td&gt;4,000 MB/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;io1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;고성능 (구형)&lt;/td&gt;&lt;td&gt;64,000&lt;/td&gt;&lt;td&gt;1,000 MB/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;st1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;순차 처리량 HDD&lt;/td&gt;&lt;td&gt;500&lt;/td&gt;&lt;td&gt;500 MB/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sc1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;저비용 콜드 HDD&lt;/td&gt;&lt;td&gt;250&lt;/td&gt;&lt;td&gt;250 MB/s&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# gp2 -&gt; gp3 마이그레이션 (비용 20% 절감)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; modify-volume&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --volume-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vol-xxxx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --volume-type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; gp3&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --iops&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3000&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --throughput&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 125&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;gp3&lt;/code&gt; 는 IOPS/처리량을 독립적으로 설정. gp2 의 IOPS 연동 방식보다 유연하고 저렴.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;security-group&quot;&gt;Security Group&lt;/h2&gt;
&lt;p&gt;EC2 인바운드/아웃바운드 트래픽 제어. Stateful (응답 자동 허용).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Security Group 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-security-group&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --group-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web-sg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --description&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Web Server SG&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --vpc-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vpc-xxxx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 규칙 추가&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; authorize-security-group-ingress&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --group-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sg-xxxx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --protocol&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tcp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --port&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 443&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --cidr&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0.0.0.0/0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SG 간 참조 (내부 통신)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; authorize-security-group-ingress&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --group-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sg-db&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --protocol&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tcp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --port&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 5432&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --source-group&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sg-app&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # IP 아닌 SG 참조&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;SG 간 참조는 IP 변경에 강건. 앱 SG → DB SG 패턴 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;systems-manager-session-manager&quot;&gt;Systems Manager Session Manager&lt;/h2&gt;
&lt;p&gt;SSH 포트 없이 인스턴스 접속. IAM 기반 접근 제어.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SSM으로 접속 (22 포트 불필요)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start-session&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --target&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; i-xxxx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 포트 포워딩 (로컬 DB 접근)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start-session&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --target&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; i-xxxx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --document-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AWS-StartPortForwardingSession&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --parameters&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&quot;portNumber&quot;:[&quot;5432&quot;],&quot;localPortNumber&quot;:[&quot;15432&quot;]}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;필요 IAM 권한:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;ssm:StartSession&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;ssm:TerminateSession&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;ec2:DescribeInstances&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:ec2:*:*:instance/*&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
배스천 호스트 제거 가능. CloudTrail + Session Manager 로그로 모든 접속 감사.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;placement-groups&quot;&gt;Placement Groups&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;타입&lt;/th&gt;&lt;th&gt;특성&lt;/th&gt;&lt;th&gt;사용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cluster&lt;/td&gt;&lt;td&gt;같은 AZ, 낮은 latency&lt;/td&gt;&lt;td&gt;HPC, 분산 캐시&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Spread&lt;/td&gt;&lt;td&gt;다른 하드웨어, HA&lt;/td&gt;&lt;td&gt;소수의 중요 인스턴스&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Partition&lt;/td&gt;&lt;td&gt;파티션별 격리&lt;/td&gt;&lt;td&gt;Hadoop, Kafka, Cassandra&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-placement-group&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --group-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; hpc-cluster&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --strategy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cluster&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run-instances&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --placement&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&quot;GroupName&quot;:&quot;hpc-cluster&quot;}&apos;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cloudwatch-모니터링&quot;&gt;CloudWatch 모니터링&lt;/h2&gt;
&lt;p&gt;기본 메트릭 (5분 간격, 무료):&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;메트릭&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;CPUUtilization&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CPU 사용률&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;NetworkIn&lt;/code&gt;/&lt;code&gt;Out&lt;/code&gt;&lt;/td&gt;&lt;td&gt;네트워크 트래픽&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;DiskReadOps&lt;/code&gt;/&lt;code&gt;WriteOps&lt;/code&gt;&lt;/td&gt;&lt;td&gt;디스크 I/O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;StatusCheckFailed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;인스턴스/시스템 장애&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;상세 메트릭 (1분 간격, 유료):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; monitor-instances&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --instance-ids&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; i-xxxx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;메모리/디스크 사용률은 CloudWatch Agent 설치 필요:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Agent 설치 (Amazon Linux)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; yum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; amazon-cloudwatch-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;auto-recovery&quot;&gt;Auto Recovery&lt;/h2&gt;
&lt;p&gt;하드웨어 장애 시 자동 재시작 (같은 EIP, 동일 인스턴스 ID).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudwatch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-metric-alarm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --alarm-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2-auto-recover&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --namespace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AWS/EC2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --metric-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; StatusCheckFailed_System&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --statistic&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Maximum&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --period&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 60&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --evaluation-periods&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --comparison-operator&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GreaterThanOrEqualToThreshold&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --threshold&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --alarm-actions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:automate:us-east-1:ec2:recover&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;t&lt;/code&gt; family 의 CPU credit&lt;/strong&gt; = burst 후 &lt;em&gt;credit 소진&lt;/em&gt; 시 &lt;em&gt;baseline&lt;/em&gt; 으로 떨어짐 → 느려짐. unlimited 모드 또는 다른 family.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spot 의 갑작스런 중단&lt;/strong&gt; = stateful 워크로드 금지. checkpoint + retry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMI 가 오래됨&lt;/strong&gt; = 보안 패치 없음. 정기 &lt;em&gt;AMI rebake&lt;/em&gt; + AMI ID 자동화.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EBS 만 보고 &lt;em&gt;instance store&lt;/em&gt; 무시&lt;/strong&gt; = NVMe 의 &lt;em&gt;극도로 빠른 임시 스토리지&lt;/em&gt;. 캐시 / shuffle 용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gp2 를 아직 사용&lt;/strong&gt; = gp3 가 20% 저렴하고 더 유연. 모든 gp2 를 gp3 로 마이그레이션 권장.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSH 22 포트 열어둠&lt;/strong&gt; = SSM Session Manager 로 대체. SG 에서 22 포트 닫기.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IMDSv1 비활성 안 함&lt;/strong&gt; = SSRF 취약점 시 IAM credentials 탈취. 모든 인스턴스 IMDSv2 강제.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spot 인스턴스 2분 알림 미처리&lt;/strong&gt; = IMDS에서 중단 알림 폴링하거나 EventBridge로 graceful shutdown 구현.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-vpc]]&lt;/li&gt;
&lt;li&gt;[[aws-ebs-vs-instance-store]]&lt;/li&gt;
&lt;li&gt;[[aws-iam]]&lt;/li&gt;
&lt;li&gt;[[aws-auto-scaling]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]]&lt;/li&gt;
&lt;li&gt;[[aws-eks]]&lt;/li&gt;
&lt;li&gt;[[aws-sg-vs-nacl]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>ec2</category><category>compute</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] EKS: managed Kubernetes</title><link>https://shinkeonkim.com/wiki/cloud/aws-eks/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-eks/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;EKS (Elastic Kubernetes Service)&lt;/strong&gt; = AWS 의 &lt;em&gt;managed K8s control plane&lt;/em&gt;. &lt;em&gt;worker node 는 사용자 (또는 Fargate)&lt;/em&gt;. AWS IAM / VPC / ALB 등 &lt;em&gt;AWS 통합&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;control plane (etcd, API server, scheduler, controller manager) 을 AWS 가 완전 관리. 업그레이드, HA, 패치 포함. 사용자는 worker node 와 workload 만 책임.&lt;/p&gt;
&lt;h2 id=&quot;아키텍처&quot;&gt;아키텍처&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User[&quot;kubectl / CI-CD&quot;] --&gt; CP[&quot;EKS Control Plane\n(AWS managed, Multi-AZ)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CP --&gt; NG[&quot;Managed Node Group\n(EC2 Auto Scaling)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CP --&gt; SN[&quot;Self-managed Nodes\n(EC2 직접)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CP --&gt; FG[&quot;Fargate Profile\n(serverless)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NG --&gt; Pods1[Pods]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SN --&gt; Pods2[Pods]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    FG --&gt; Pods3[Pods]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CP --&gt; Addons[&quot;EKS Add-ons\n(CNI, CoreDNS, CSI)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;worker-3가지&quot;&gt;Worker 3가지&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;종류&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;의미&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;관리 주체&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Managed Node Group&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2, AWS 가 자동 관리 + Auto Scaling&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Self-managed Nodes&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2, 사용자 직접 ami/lifecycle 관리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;사용자&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Fargate&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;노드 없음, 서버리스, pod 단위 과금&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Karpenter&lt;/em&gt; = managed node group 의 진화. 더 빠른 scaling (초 단위) + spot 자동 활용 + 노드 통합(consolidation).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;iam-roles-for-service-accounts-irsa&quot;&gt;IAM Roles for Service Accounts (IRSA)&lt;/h2&gt;
&lt;p&gt;Pod 별 IAM 권한 부여의 표준. node IAM role 을 공유하지 않고 SA 단위로 분리.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ServiceAccount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;s3-uploader&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  annotations&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    eks.amazonaws.com/role-arn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:iam::123456789:role/s3-uploader&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant OIDC as &quot;EKS OIDC Provider&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant STS as &quot;AWS STS&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant S3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pod-&gt;&gt;OIDC: JWT token (ServiceAccount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OIDC--&gt;&gt;Pod: signed token&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pod-&gt;&gt;STS: AssumeRoleWithWebIdentity(token)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    STS--&gt;&gt;Pod: temporary credentials&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pod-&gt;&gt;S3: API call (credentals)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;OIDC provider 를 EKS cluster 에 연결 (cluster 당 1회)&lt;/li&gt;
&lt;li&gt;SA 에 annotate 된 role 을 STS 로 assume&lt;/li&gt;
&lt;li&gt;pod 내 SDK 가 자동으로 credentials 갱신&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
IRSA 가 2026 현재 표준. 옛 &lt;em&gt;node IAM role 공유&lt;/em&gt; 방식은 node 위 모든 pod 가 동일 권한 = 최소 권한 원칙 위반.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;eks-pod-identity-2023&quot;&gt;EKS Pod Identity (2023+)&lt;/h2&gt;
&lt;p&gt;IRSA 의 &lt;em&gt;간소화&lt;/em&gt; 버전. OIDC provider 설정 없이도 동작. EKS Pod Identity Agent add-on 필요.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; eks&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-pod-identity-association&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --cluster-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; prod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --namespace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service-account&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; s3-uploader&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:iam::123456789:role/s3-uploader&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;IRSA&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Pod Identity&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;OIDC provider 필요&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;예&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;아니오&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;설정 복잡도&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;교차 계정&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;add-on 필요&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;아니오&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;예 (agent)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;eks-add-ons&quot;&gt;EKS Add-ons&lt;/h2&gt;
&lt;p&gt;AWS 가 관리하는 &lt;em&gt;권장 add-on&lt;/em&gt;. EKS 콘솔 / API 로 버전 관리.&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Add-on&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;역할&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;VPC CNI&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Pod IP 할당 (AWS VPC native)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;CoreDNS&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;클러스터 내부 DNS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;kube-proxy&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;서비스 네트워크 규칙&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;EBS CSI driver&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Persistent Volume (EBS)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;EFS CSI driver&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;공유 스토리지 (EFS)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;AWS Load Balancer Controller&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ALB/NLB 자동 프로비저닝&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;ADOT&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OpenTelemetry 수집&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;GuardDuty Agent&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;컨테이너 위협 탐지&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Karpenter&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;노드 자동 프로비저닝&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;vpc-cni-와-ip-관리&quot;&gt;VPC CNI 와 IP 관리&lt;/h2&gt;
&lt;p&gt;EKS 기본 CNI = &lt;em&gt;AWS VPC CNI&lt;/em&gt;. Pod 가 VPC IP 를 직접 할당.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;: VPC 내 native. SG, NetworkPolicy, VPC flow logs 그대로 적용. AWS LB 통합 자연스러움.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;: IP 소모가 큼. EC2 instance type 별 ENI / IP 한도 존재.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;c5.large = 최대 3 ENI × 10 IP = 30 Pod 한도&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;m5.4xlarge = 8 ENI × 30 IP = 240 Pod 한도&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해결책:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;secondary CIDR&lt;/em&gt; 추가 (&lt;code&gt;100.64.0.0/16&lt;/code&gt; 등)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;prefix delegation&lt;/em&gt; 활성 (ENI 당 /28 블록 할당, Pod 한도 대폭 확대)&lt;/li&gt;
&lt;li&gt;대안 CNI: &lt;em&gt;Cilium&lt;/em&gt; (eBPF, overlay), &lt;em&gt;Calico&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;비용&quot;&gt;비용&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;요금&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Control Plane&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.10/시간/cluster (~$73/월)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Managed Node Group&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2 온디맨드 / 스팟 가격&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Fargate&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;vCPU $0.04048/시간 + 메모리 $0.004445/GB/시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;EKS Anywhere&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;별도 라이선스&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;비용 최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Karpenter + Spot instance 조합으로 node 비용 60-80% 절감 가능&lt;/li&gt;
&lt;li&gt;Fargate 는 소규모 intermittent workload 에 적합, 상시 고밀도 워크로드는 EC2 가 저렴&lt;/li&gt;
&lt;li&gt;미사용 cluster 는 node group 을 0으로 (control plane 비용은 유지)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;eks-anywhere&quot;&gt;EKS Anywhere&lt;/h2&gt;
&lt;p&gt;온프레미스에서 동일 EKS API 로 K8s 운영. AWS Outposts 와는 별개.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMware vSphere, bare metal, Nutanix 등 지원&lt;/li&gt;
&lt;li&gt;EKS Anywhere 라이선스 + 지원 비용&lt;/li&gt;
&lt;li&gt;GitOps 기반 클러스터 관리 (Flux)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;eks-vs-ecs-선택&quot;&gt;EKS vs ECS 선택&lt;/h2&gt;
&lt;p&gt;자세한 내용은 [[aws-ecs-fargate]] 참조.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q{&quot;워크로드 성격&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt;|&quot;AWS 전용, 빠른 시작, 단순 컨테이너&quot;| ECS[&quot;ECS\n(운영 오버헤드 낮음)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt;|&quot;K8s 생태계, 이식성, 복잡한 마이크로서비스&quot;| EKS[&quot;EKS\n(표준 K8s API)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    EKS --&gt; Fargate[&quot;Fargate 모드\n(노드 관리 불필요)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    EKS --&gt; EC2[&quot;EC2 노드\n(제어권 최대)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;업그레이드-전략&quot;&gt;업그레이드 전략&lt;/h2&gt;
&lt;p&gt;EKS 버전은 3개 마이너 버전 지원. 평균 4개월마다 신버전 출시.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Control plane 먼저 업그레이드 (마이너 버전 1씩, n+1 만 허용)&lt;/li&gt;
&lt;li&gt;Add-on 업그레이드 (버전 호환성 확인)&lt;/li&gt;
&lt;li&gt;Node group 순차 업그레이드 (롤링)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CP[&quot;Control Plane\n1.29 → 1.30&quot;] --&gt; Addons[&quot;Add-ons 업그레이드\n(CNI, CoreDNS, kube-proxy)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Addons --&gt; NG[&quot;Node Group\n1.29 → 1.30\n(롤링 교체)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NG --&gt; Done[&quot;완료&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
control plane 과 node 버전 차이 최대 2 minor. node 가 너무 뒤처지면 업그레이드 불가.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;모니터링--관찰성&quot;&gt;모니터링 / 관찰성&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;CloudWatch Container Insights = EKS 메트릭 + 로그 통합&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - pod CPU/메모리 사용률&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - node 수준 지표&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - 네임스페이스 집계&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Prometheus + Grafana = 커스텀 메트릭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - kube-state-metrics (deployment replicas, pod phase)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - node-exporter (node 시스템 지표)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;AWS Distro for OpenTelemetry (ADOT)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - traces → X-Ray / Jaeger&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - metrics → CloudWatch / Prometheus&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;로그 수집 전략&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fargate: AWS for FluentBit 사이드카 자동 (CloudWatch Logs)&lt;/li&gt;
&lt;li&gt;EC2 node: DaemonSet (FluentBit, Fluentd) 또는 ADOT&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;karpenter-핵심-개념&quot;&gt;Karpenter 핵심 개념&lt;/h2&gt;
&lt;p&gt;Karpenter = node 자동 프로비저닝. managed node group 보다 훨씬 빠른 스케일링.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# NodePool 예시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;karpenter.sh/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;NodePool&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  template&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    spec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      requirements&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;karpenter.sh/capacity-type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          operator&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;In&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;spot&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;on-demand&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kubernetes.io/arch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          operator&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;In&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;amd64&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      nodeClassRef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  disruption&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    consolidationPolicy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;WhenEmptyOrUnderutilized&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    consolidateAfter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1m&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;수초 내 노드 프로비저닝 (managed group 의 3-5분 대비)&lt;/li&gt;
&lt;li&gt;spot 자동 활용 + on-demand fallback&lt;/li&gt;
&lt;li&gt;미사용 노드 자동 통합 (consolidation) 으로 비용 절감&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VPC IP 고갈&lt;/strong&gt;: pod 수 × ENI 한도. secondary CIDR 또는 prefix delegation 사전 적용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EKS 버전 업그레이드 순서&lt;/strong&gt;: control plane → add-on → node 순. minor 한 번씩만.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubeconfig 의 AWS auth&lt;/strong&gt;: &lt;code&gt;aws eks update-kubeconfig&lt;/code&gt;. IAM 변경 시 인증 깨짐 주의.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fargate + DaemonSet 미지원&lt;/strong&gt;: log/metric 수집을 sidecar 컨테이너로 각 pod 에 붙여야 함.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IRSA OIDC provider&lt;/strong&gt;: cluster 당 1회 생성. 누락 시 AssumeRoleWithWebIdentity 실패.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;code&gt;aws-auth&lt;/code&gt; ConfigMap 잘못 수정 시 cluster 접근 완전 차단. IAM Identity Center 또는 EKS access entries 로 대체 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[kubernetes]] - K8s 기초 개념&lt;/li&gt;
&lt;li&gt;[[k8s-pod]], [[k8s-deployment]]&lt;/li&gt;
&lt;li&gt;[[k8s-rbac]] - 클러스터 내 권한&lt;/li&gt;
&lt;li&gt;[[aws-ecs-fargate]] - 대안 컨테이너 서비스&lt;/li&gt;
&lt;li&gt;[[aws-iam]] - IRSA 권한 모델&lt;/li&gt;
&lt;li&gt;[[aws-vpc]] - VPC CNI, 네트워크 설계&lt;/li&gt;
&lt;li&gt;[[aws-ecr]] - 컨테이너 이미지 저장소&lt;/li&gt;
&lt;li&gt;[[helm]] - K8s 패키지 매니저&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>eks</category><category>kubernetes</category><category>cloud</category><category>container</category><author>koa (김신건)</author></item><item><title>[AWS] EventBridge: 이벤트 버스, 스케줄러, partner sources</title><link>https://shinkeonkim.com/wiki/cloud/aws-eventbridge/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-eventbridge/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;EventBridge&lt;/strong&gt; = AWS 의 &lt;em&gt;통합 event bus&lt;/em&gt;. 옛 CloudWatch Events 의 후계. &lt;em&gt;AWS service 이벤트 + custom 이벤트 + SaaS 이벤트&lt;/em&gt; 를 한 곳에서 라우팅하는 서버리스 이벤트 플랫폼.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;EventBridge 선택 이유&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;마이크로서비스 간 느슨한 결합&lt;/td&gt;&lt;td&gt;source 가 target 을 몰라도 됨, 독립 배포&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SaaS 이벤트 수신&lt;/td&gt;&lt;td&gt;Partner Sources (Datadog, MongoDB, Auth0, …)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;배치 스케줄링&lt;/td&gt;&lt;td&gt;Scheduler 로 cron / rate / one-time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cross-account 이벤트 전파&lt;/td&gt;&lt;td&gt;조직 전체 bus 설정 가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AWS 서비스 이벤트 반응&lt;/td&gt;&lt;td&gt;EC2 상태 변경, S3 업로드, CodePipeline 알림&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ETL 파이프라인&lt;/td&gt;&lt;td&gt;Pipes 로 source → filter → enrich → target&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;SNS + SQS 가 메시지 큐 / fan-out 에 특화&lt;/em&gt; 라면, EventBridge 는 &lt;em&gt;이벤트 라우팅 플랫폼&lt;/em&gt;. 복잡한 content-based filtering 과 SaaS 통합이 강점.&lt;/p&gt;
&lt;h2 id=&quot;event-bus-종류&quot;&gt;Event Bus 종류&lt;/h2&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;종류&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;AWS service 이벤트 (EC2, S3, CodePipeline 등)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Custom&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;자체 이벤트 (&lt;code&gt;PutEvents&lt;/code&gt; API 로 전송)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Partner&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;SaaS (Datadog, MongoDB, Auth0, Zendesk, …)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Custom bus 는 계정당 100개 생성 가능. 이름, region, account 로 식별.&lt;/p&gt;
&lt;h2 id=&quot;event-형식&quot;&gt;Event 형식&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;detail-type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Order Created&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;source&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;myapp.orders&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;account&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;123456789&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;time&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2026-06-25T12:00:00Z&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;region&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;us-east-1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;resources&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;detail&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;order_id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;o_42&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;user_id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;u_99&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;total&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;source&lt;/code&gt;: 이벤트 출처 (역 DNS 권장, &lt;code&gt;myapp.orders&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;detail-type&lt;/code&gt;: 이벤트 종류. &lt;code&gt;detail&lt;/code&gt;: 자유 형식 payload.&lt;/li&gt;
&lt;li&gt;최대 &lt;em&gt;256KB&lt;/em&gt;. 초과 시 S3 에 payload 를 올리고 URL 만 이벤트에.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;event-pattern-심화&quot;&gt;Event Pattern 심화&lt;/h2&gt;
&lt;p&gt;Rule 이 어떤 이벤트를 처리할지 결정하는 &lt;em&gt;JSON 필터&lt;/em&gt;. Pattern 이 이벤트의 &lt;em&gt;상위 집합&lt;/em&gt; 이면 매칭.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;source&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;myapp.orders&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;detail-type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Order Created&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;detail&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;total&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{ &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;numeric&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&gt;=&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;status&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{ &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;anything-but&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CANCELLED&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;REFUNDED&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;region&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{ &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;prefix&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;us-&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;tag&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{ &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;exists&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Operator&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;prefix&lt;/code&gt;&lt;/td&gt;&lt;td&gt;특정 문자열로 시작&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;suffix&lt;/code&gt;&lt;/td&gt;&lt;td&gt;특정 문자열로 끝&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;anything-but&lt;/code&gt;&lt;/td&gt;&lt;td&gt;제외 목록&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;numeric&lt;/code&gt;&lt;/td&gt;&lt;td&gt;숫자 비교 (&lt;code&gt;&gt;&lt;/code&gt;, &lt;code&gt;&gt;=&lt;/code&gt;, &lt;code&gt;&amp;#x3C;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;=&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;exists&lt;/code&gt;&lt;/td&gt;&lt;td&gt;필드 존재 여부 (true / false)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;equals-ignore-case&lt;/code&gt;&lt;/td&gt;&lt;td&gt;대소문자 무시&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cidr&lt;/code&gt;&lt;/td&gt;&lt;td&gt;IP 대역 매칭&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;or&lt;/code&gt;&lt;/td&gt;&lt;td&gt;여러 조건 중 하나&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;rule--target&quot;&gt;Rule + Target&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Event[Event] --&gt; Bus[Event Bus]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Bus --&gt; Rule1[&quot;Rule 1&amp;#x3C;br/&gt;(pattern)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Rule1 --&gt; Target1[Lambda]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Rule1 --&gt; Target2[SQS]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Bus --&gt; Rule2[&quot;Rule 2&amp;#x3C;br/&gt;(다른 pattern)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Rule2 --&gt; Target3[Step Functions]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;하나의 Bus 에 여러 Rule.&lt;/li&gt;
&lt;li&gt;하나의 Rule 에 최대 &lt;em&gt;5개&lt;/em&gt; Target.&lt;/li&gt;
&lt;li&gt;Target 마다 &lt;em&gt;Input Transformer&lt;/em&gt; 로 payload 변환 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;input-transformer&quot;&gt;Input Transformer&lt;/h3&gt;
&lt;p&gt;Rule 의 Target 으로 보내기 전에 이벤트 payload 를 변환.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;InputPathsMap&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;order&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;$.detail.order_id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;total&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;$.detail.total&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;InputTemplate&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Order &amp;#x3C;order&gt; 금액 &amp;#x3C;total&gt;원 생성됨&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JMESPath 로 필드 추출 후 template 에 삽입. Lambda 호출 없이 payload 를 단순화.&lt;/p&gt;
&lt;h2 id=&quot;target-종류&quot;&gt;Target 종류&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lambda (동기 / 비동기 선택 가능)&lt;/li&gt;
&lt;li&gt;SQS / SNS&lt;/li&gt;
&lt;li&gt;Step Functions&lt;/li&gt;
&lt;li&gt;ECS Task / EKS / Batch&lt;/li&gt;
&lt;li&gt;Kinesis Data Streams / Firehose&lt;/li&gt;
&lt;li&gt;API Destination (외부 HTTP 엔드포인트)&lt;/li&gt;
&lt;li&gt;다른 EventBridge Bus / 다른 계정의 Bus&lt;/li&gt;
&lt;li&gt;CodePipeline, CodeBuild, SSM Run Command&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;retry--dead-letter-queue&quot;&gt;Retry + Dead Letter Queue&lt;/h2&gt;
&lt;p&gt;Target 호출 실패 시 EventBridge 가 자동 재시도.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;기본값&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;최대 재시도 기간&lt;/td&gt;&lt;td&gt;24시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;최대 재시도 횟수&lt;/td&gt;&lt;td&gt;185회&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;재시도 알고리즘&lt;/td&gt;&lt;td&gt;exponential back-off&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DLQ 지원&lt;/td&gt;&lt;td&gt;SQS Dead Letter Queue&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Target&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Arn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:lambda:us-east-1:123:function:my-func&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  DeadLetterConfig&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Arn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:sqs:us-east-1:123:my-dlq&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RetryPolicy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    MaximumRetryAttempts&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    MaximumEventAgeInSeconds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3600&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;em&gt;DLQ 는 운영 필수&lt;/em&gt;. 실패 이벤트를 DLQ 로 보내고 [[aws-cloudwatch]] Alarm 연동. &lt;code&gt;FailedInvocations&lt;/code&gt; 지표를 모니터링.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;eventbridge-scheduler-2022&quot;&gt;EventBridge Scheduler (2022+)&lt;/h2&gt;
&lt;p&gt;CloudWatch Events Schedule 의 후계. 훨씬 정교하고 &lt;em&gt;수백만 스케줄&lt;/em&gt; 지원.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; scheduler&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-schedule&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; daily-report&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --schedule-expression&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;cron(0 9 * * ? *)&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --schedule-expression-timezone&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Asia/Seoul&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --target&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;Arn&quot;: &quot;arn:aws:lambda:ap-northeast-2:123:function:reporter&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;RoleArn&quot;: &quot;arn:aws:iam::123:role/scheduler-role&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  }&apos;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --flexible-time-window&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{ &quot;Mode&quot;: &quot;OFF&quot; }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;방식&lt;/th&gt;&lt;th&gt;예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;cron&lt;/td&gt;&lt;td&gt;&lt;code&gt;cron(0 9 * * ? *)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;rate&lt;/td&gt;&lt;td&gt;&lt;code&gt;rate(5 minutes)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;one-time&lt;/td&gt;&lt;td&gt;&lt;code&gt;at(2026-12-25T00:00:00)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Flexible Time Window&lt;/em&gt;: &lt;code&gt;FLEXIBLE&lt;/code&gt; 로 지정된 분 범위 안에서 실행 분산 (부하 burst 방지). EventBridge Rule 의 Schedule 과 달리 &lt;em&gt;UTC 외 timezone 지원&lt;/em&gt;, &lt;em&gt;하나의 Target 에 직접 IAM Role 부여&lt;/em&gt; 가 가능.&lt;/p&gt;
&lt;h2 id=&quot;schema-registry&quot;&gt;Schema Registry&lt;/h2&gt;
&lt;p&gt;이벤트 계약을 중앙에서 관리.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이벤트 schema &lt;em&gt;중앙 보관&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;다국어 &lt;em&gt;코드 생성&lt;/em&gt; (Java, Python, TypeScript).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;contract 변경 추적&lt;/em&gt; (자동 versioning).&lt;/li&gt;
&lt;li&gt;AWS service 이벤트 schema 는 &lt;em&gt;자동 등록&lt;/em&gt; (Schema Discovery 활성화 시).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Schemas&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;myapp.orders@OrderCreated&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Version&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;$schema&quot;: &quot;...&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;properties&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          &quot;detail&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &quot;properties&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;              &quot;order_id&quot;: { &quot;type&quot;: &quot;string&quot; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;              &quot;total&quot;: { &quot;type&quot;: &quot;number&quot; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;pipes-2022&quot;&gt;Pipes (2022+)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Source[&quot;Source&amp;#x3C;br/&gt;(SQS, Kinesis, DDB Stream, ...)&quot;] --&gt; Filter[Filter]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Filter --&gt; Enrich[&quot;Enrich&amp;#x3C;br/&gt;(Lambda / Step Functions)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Enrich --&gt; Target[&quot;Target&amp;#x3C;br/&gt;(Lambda, SQS, Step Functions, ...)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Pipe&lt;/em&gt; = source → filter → enrich → target 의 &lt;em&gt;one-stop ETL&lt;/em&gt; 파이프라인. Rule 방식 대비:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rule: bus → N targets 의 fan-out.&lt;/li&gt;
&lt;li&gt;Pipe: 1:1 스트리밍 처리, polling source 에서 직접 읽기 (SQS, Kinesis, DDB Stream).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enrichment 에서 Lambda 를 껴서 payload 변환 + 외부 조회.&lt;/p&gt;
&lt;h2 id=&quot;cross-account-이벤트-라우팅&quot;&gt;Cross-account 이벤트 라우팅&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AppA[&quot;App (Account A)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    BusA[&quot;Custom Bus A&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    BusB[&quot;Event Bus B&amp;#x3C;br/&gt;(Account B)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lambda[&quot;Lambda&amp;#x3C;br/&gt;(Account B)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AppA --&gt;|PutEvents| BusA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    BusA --&gt;|&quot;Rule: forward&quot;| BusB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    BusB --&gt; Lambda&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;소스 계정 Bus&lt;/strong&gt;: resource-based policy 에서 Account B 에게 &lt;code&gt;events:PutEvents&lt;/code&gt; 허용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rule 설정&lt;/strong&gt;: 소스 Bus 에 “대상 Bus 로 forward” Rule 추가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대상 계정 Bus&lt;/strong&gt;: 수신 후 자체 Rule 로 Lambda / SQS 등 트리거.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;조직 전체&lt;/strong&gt;: Default Bus 의 &lt;em&gt;Organization policy&lt;/em&gt; 로 전체 계정 수신 허용.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;이벤트-archive--replay&quot;&gt;이벤트 Archive + Replay&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Archive&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;order-events-archive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  EventSourceArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:events:...:event-bus/my-bus&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  EventPattern&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    { &quot;source&quot;: [&quot;myapp.orders&quot;] }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RetentionDays&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;90&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이벤트를 Archive 에 저장 후 &lt;em&gt;재생 (Replay)&lt;/em&gt; 가능.&lt;/li&gt;
&lt;li&gt;새 Rule 추가 후 과거 이벤트를 replay → consumer 검증.&lt;/li&gt;
&lt;li&gt;장애 복구: 실패 시간대 이벤트만 선택 replay.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;모니터링&quot;&gt;모니터링&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;지표 (namespace: AWS/Events)&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;FailedInvocations&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Target 호출 최종 실패 수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;DeadLetterInvocations&lt;/code&gt;&lt;/td&gt;&lt;td&gt;DLQ 로 전송된 이벤트 수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ThrottledRules&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rule 평가 제한 횟수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;MatchedEvents&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rule 에 매칭된 이벤트 수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TriggeredRules&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rule 트리거 횟수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;InvocationAttempts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Target 호출 시도 총 수&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudwatch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-metric-statistics&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --namespace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AWS/Events&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --metric-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; FailedInvocations&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --dimensions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Name=EventBusName,Value=my-bus&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --start-time&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 2026-07-01T00:00:00Z&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --end-time&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 2026-07-02T00:00:00Z&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --period&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3600&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --statistics&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Sum&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;eventbridge-vs-sns-vs-sqs&quot;&gt;EventBridge vs SNS vs SQS&lt;/h2&gt;
&lt;p&gt;자세한 건 [[aws-sns]], [[aws-sqs]].&lt;/p&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;EventBridge&lt;/th&gt;&lt;th&gt;SNS&lt;/th&gt;&lt;th&gt;SQS&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Filtering&lt;/td&gt;&lt;td&gt;content-based (복잡)&lt;/td&gt;&lt;td&gt;attribute-based (단순)&lt;/td&gt;&lt;td&gt;없음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fan-out&lt;/td&gt;&lt;td&gt;Rule 당 5 Target&lt;/td&gt;&lt;td&gt;12.5M subscriber&lt;/td&gt;&lt;td&gt;1:1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SaaS 통합&lt;/td&gt;&lt;td&gt;✓ Partner Sources&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scheduler&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Event Replay&lt;/td&gt;&lt;td&gt;✓ Archive 설정 시&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Schema Registry&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;td&gt;✗&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;비용 기준&lt;/td&gt;&lt;td&gt;이벤트 수&lt;/td&gt;&lt;td&gt;이벤트 수&lt;/td&gt;&lt;td&gt;메시지 수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;주요 용도&lt;/td&gt;&lt;td&gt;이벤트 라우팅&lt;/td&gt;&lt;td&gt;fan-out / pub-sub&lt;/td&gt;&lt;td&gt;작업 큐 / 버퍼링&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rule pattern 의 잘못된 JSON&lt;/strong&gt; = silently no match. &lt;code&gt;MatchedEvents&lt;/code&gt; 0 이면 pattern 검토.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-account 이벤트&lt;/strong&gt; = source bus 의 &lt;em&gt;resource policy&lt;/em&gt; 와 target bus 의 &lt;em&gt;PutEvents 권한&lt;/em&gt; 둘 다 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema 변경&lt;/strong&gt; = &lt;em&gt;registry 의 versioning&lt;/em&gt; 활용. consumer 영향 평가 후 배포.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target retry 한도&lt;/strong&gt; = 24시간 재시도 후 드롭. DLQ 미설정 시 이벤트 유실.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipes Enrichment 오류&lt;/strong&gt; = 이벤트 드롭. Enrichment Lambda 는 idempotent 보장.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scheduler timezone&lt;/strong&gt; = 기본 UTC. &lt;code&gt;schedule-expression-timezone&lt;/code&gt; 명시 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input Transformer template 오류&lt;/strong&gt; = 이벤트 전달 실패. 미리 콘솔에서 테스트.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;256KB 초과 payload&lt;/strong&gt; = 전송 실패. 대용량은 S3 URL + pointer 패턴.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-sns]], [[aws-sqs]]&lt;/li&gt;
&lt;li&gt;[[aws-step-functions]]&lt;/li&gt;
&lt;li&gt;[[aws-lambda]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]]&lt;/li&gt;
&lt;li&gt;[[outbox-pattern]] (이벤트 발행 패턴)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>eventbridge</category><category>events</category><category>cloud</category><category>serverless</category><author>koa (김신건)</author></item><item><title>[AWS] IAM: User, Role, Policy, STS</title><link>https://shinkeonkim.com/wiki/cloud/aws-iam/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-iam/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;IAM (Identity and Access Management)&lt;/strong&gt; = AWS 의 &lt;em&gt;권한 관리 전부&lt;/em&gt;. User, Group, Role, Policy 로 구성. &lt;em&gt;“누가 어떤 리소스에 어떤 행동을 할 수 있는가”&lt;/em&gt; 를 정의.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;IAM 사용 패턴&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;팀원 AWS 접근 권한&lt;/td&gt;&lt;td&gt;Identity Center + Permission Set (SSO 권장)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EC2/Lambda 가 AWS 서비스 호출&lt;/td&gt;&lt;td&gt;Instance Role / Execution Role&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;다른 계정 리소스 접근&lt;/td&gt;&lt;td&gt;Cross-account Role + AssumeRole&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;외부 ID Provider&lt;/td&gt;&lt;td&gt;Federated Identity (OIDC, SAML)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;최소 권한 강제&lt;/td&gt;&lt;td&gt;Permission Boundary&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;조직 전체 정책&lt;/td&gt;&lt;td&gt;Service Control Policy (SCP)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EKS Pod 의 AWS 접근&lt;/td&gt;&lt;td&gt;IRSA (IAM Roles for Service Accounts)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;객체&quot;&gt;객체&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User[&quot;User&amp;#x3C;br/&gt;(사람)&quot;] --&gt;|attach| Policy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Group[Group] --&gt;|attach| Policy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Role[&quot;Role&amp;#x3C;br/&gt;(임시 권한, EC2/Lambda/외부 등)&quot;] --&gt;|attach| Policy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Policy --&gt; Statement[Effect: Allow/Deny&amp;#x3C;br/&gt;Action: s3:GetObject&amp;#x3C;br/&gt;Resource: arn:...]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;객체&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;사람 (long-term credentials, 가급적 최소화)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Group&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;User 묶음 (Policy 를 그룹에 부착)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;임시 권한 받는 entity&lt;/em&gt; (EC2, Lambda, 외부 계정, EKS Pod 등)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Policy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;권한 표현 (JSON Statement 배열)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;policy-구조&quot;&gt;Policy 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2012-10-17&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Sid&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;AllowListBucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Effect&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Allow&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;s3:ListBucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:s3:::my-bucket&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Sid&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;AllowReadObjects&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Effect&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Allow&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;s3:GetObject&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:s3:::my-bucket/*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Condition&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;IpAddress&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;aws:SourceIp&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;10.0.0.0/8&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Effect&lt;/code&gt;: &lt;code&gt;Allow&lt;/code&gt; 또는 &lt;code&gt;Deny&lt;/code&gt;. Explicit Deny 가 Allow 를 이김.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Action&lt;/code&gt;: &lt;code&gt;s3:GetObject&lt;/code&gt;, &lt;code&gt;ec2:*&lt;/code&gt; 형식. &lt;code&gt;*&lt;/code&gt; 와일드카드 가능.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Resource&lt;/code&gt;: ARN. &lt;code&gt;*&lt;/code&gt; 로 전체 허용 (최소 권한 원칙 위반).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Condition&lt;/code&gt;: 추가 조건 (IP, MFA 여부, 태그 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;policy-종류&quot;&gt;Policy 종류&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;종류&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;AWS Managed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;AWS 가 관리 (&lt;code&gt;AmazonS3ReadOnlyAccess&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Customer Managed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;사용자 정의, 재사용 가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Inline&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;User/Group/Role 에 직접 임베드 (재사용 불가)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Permission Boundary&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;최대 권한 상한 (Role 이 가질 수 있는 최대)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Service Control Policy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Organization 수준 전체 상한&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Resource-based Policy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;자원에 붙음 (S3 Bucket Policy, Lambda Permission 등)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Session Policy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;AssumeRole 시 임시로 줄이는 정책&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;권한-평가-알고리즘&quot;&gt;권한 평가 알고리즘&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1{Explicit Deny?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt;|예| Deny[DENY]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt;|아니오| Q2{Explicit Allow?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|아니오| Deny&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|예| Q3{SCP 차단?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q3 --&gt;|예| Deny&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q3 --&gt;|아니오| Q4{Permission Boundary 안?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q4 --&gt;|아니오| Deny&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q4 --&gt;|예| Allow[ALLOW]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Explicit Deny 가 모든 것을 이김&lt;/em&gt;. Organization SCP → Permission Boundary → Identity Policy 순으로 모두 통과해야 Allow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;role-과-assumerole&quot;&gt;Role 과 AssumeRole&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;STS: AssumeRole(arn:role/admin)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    STS--&gt;&gt;User: temporary credentials (1h-12h)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;S3: API 호출 (임시 credentials)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sts&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; assume-role&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:iam::123:role/admin&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-session-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-session&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;사용&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;EC2 Role&lt;/td&gt;&lt;td&gt;EC2 가 metadata 로 자동 취득&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lambda Role&lt;/td&gt;&lt;td&gt;함수 실행 권한&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cross-account&lt;/td&gt;&lt;td&gt;다른 계정의 Role assume&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;외부 ID + 신뢰 관계&lt;/td&gt;&lt;td&gt;3rd party (SaaS) 가 우리 계정 접근&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Federated (OIDC, SAML)&lt;/td&gt;&lt;td&gt;외부 ID Provider 연동&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;임시 credentials = &lt;code&gt;AccessKeyId&lt;/code&gt; + &lt;code&gt;SecretAccessKey&lt;/code&gt; + &lt;code&gt;SessionToken&lt;/code&gt;. 기본 1시간, 최대 12시간.&lt;/p&gt;
&lt;h2 id=&quot;abac-attribute-based-access-control&quot;&gt;ABAC: Attribute-Based Access Control&lt;/h2&gt;
&lt;p&gt;태그 기반 동적 권한 부여. &lt;em&gt;Role 을 늘리지 않고&lt;/em&gt; 태그로 접근 제어.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Effect&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Allow&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ec2:*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Condition&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;StringEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;aws:ResourceTag/Environment&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;${aws:PrincipalTag/Environment}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aws:PrincipalTag/Environment&lt;/code&gt;: 현재 호출자(Principal)의 태그.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aws:ResourceTag/Environment&lt;/code&gt;: 대상 리소스의 태그.&lt;/li&gt;
&lt;li&gt;태그가 일치하는 리소스만 접근 허용.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;장점&lt;/em&gt;: 새 EC2 인스턴스를 만들 때마다 Policy 수정 불필요. 태그만 맞으면 자동 허용.&lt;/p&gt;
&lt;h2 id=&quot;condition-keys-상세&quot;&gt;Condition Keys 상세&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;aws:SourceIp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;요청 IP 대역&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;aws:RequestedRegion&lt;/code&gt;&lt;/td&gt;&lt;td&gt;요청 리전&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;aws:MultiFactorAuthPresent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;MFA 인증 여부&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;aws:SecureTransport&lt;/code&gt;&lt;/td&gt;&lt;td&gt;HTTPS 여부&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;aws:CurrentTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;요청 시각 (업무 시간 외 차단)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;aws:PrincipalTag/Key&lt;/code&gt;&lt;/td&gt;&lt;td&gt;호출자 태그&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;aws:ResourceTag/Key&lt;/code&gt;&lt;/td&gt;&lt;td&gt;리소스 태그&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;iam:PermissionsBoundary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Permission Boundary ARN&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;s3:prefix&lt;/code&gt;&lt;/td&gt;&lt;td&gt;S3 경로 prefix&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Condition&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Bool&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;aws:MultiFactorAuthPresent&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;StringEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;aws:RequestedRegion&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ap-northeast-2&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;irsa--pod-identity-eks&quot;&gt;IRSA / Pod Identity (EKS)&lt;/h2&gt;
&lt;p&gt;자세한 건 [[aws-eks]].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IRSA (IAM Roles for Service Accounts)&lt;/strong&gt;: EKS Pod 가 AWS IAM Role 을 얻는 방법.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ServiceAccount 에 annotation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ServiceAccount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;s3-reader&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  annotations&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    eks.amazonaws.com/role-arn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:iam::123:role/s3-reader-role&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;EKS 가 OIDC Provider 로 등록.&lt;/li&gt;
&lt;li&gt;Pod 의 ServiceAccount 에 IAM Role ARN annotation.&lt;/li&gt;
&lt;li&gt;Pod 기동 시 OIDC 토큰 주입.&lt;/li&gt;
&lt;li&gt;AWS SDK 가 토큰으로 AssumeRoleWithWebIdentity.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;EKS Pod Identity (2023+)&lt;/strong&gt;: IRSA 보다 단순. OIDC Issuer 설정 없이 Pod 에 Role 직접 연결.&lt;/p&gt;
&lt;h2 id=&quot;identity-center-옛-sso&quot;&gt;Identity Center (옛 SSO)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User --&gt; IC[AWS Identity Center]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IC --&gt; Acct1[Account A]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IC --&gt; Acct2[Account B]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IC --&gt; Acct3[Account C]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IC -.SAML.-&gt; Okta[Okta / Azure AD]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Organization 의 통합 SSO&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;User 가 &lt;em&gt;로그인 1회로 N 계정 접근&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;short-lived credentials&lt;/em&gt; (1시간).&lt;/li&gt;
&lt;li&gt;Permission Set = 각 계정에서의 권한 묶음.&lt;/li&gt;
&lt;li&gt;AD / Okta / Azure AD 연동 지원.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;access-analyzer&quot;&gt;Access Analyzer&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;의도치 않은 외부 접근 자동 탐지&lt;/em&gt;.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;분석 대상&lt;/th&gt;&lt;th&gt;탐지 예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;S3 Bucket Policy&lt;/td&gt;&lt;td&gt;퍼블릭 접근 허용 버킷&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IAM Role&lt;/td&gt;&lt;td&gt;다른 계정 / 서비스가 assume 가능한 Role&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;KMS Key&lt;/td&gt;&lt;td&gt;외부 공유 Key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SQS Queue&lt;/td&gt;&lt;td&gt;외부 계정에서 메시지 전송 가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lambda Permission&lt;/td&gt;&lt;td&gt;외부 호출 허용 함수&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; accessanalyzer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list-findings&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --analyzer-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:access-analyzer:...:analyzer/my-analyzer&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --filter&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&quot;status&quot;: {&quot;eq&quot;: [&quot;ACTIVE&quot;]}}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
Access Analyzer 는 &lt;em&gt;신규 계정 생성 시 자동 활성화 권장&lt;/em&gt;. 설정 후 주기적 findings 리뷰.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;credential-report--access-advisor&quot;&gt;Credential Report + Access Advisor&lt;/h2&gt;
&lt;h3 id=&quot;credential-report-계정-전체&quot;&gt;Credential Report (계정 전체)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; generate-credential-report&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-credential-report&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; text&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --query&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Content&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; base64&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --decode&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CSV 형식. 각 User 의 password 최근 사용, access key 최근 사용, MFA 활성화 여부 확인.&lt;/p&gt;
&lt;h3 id=&quot;iam-access-advisor-사용자별&quot;&gt;IAM Access Advisor (사용자별)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; generate-service-last-accessed-details&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:iam::123:user/alice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-service-last-accessed-details&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --job-id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;최근 사용 서비스&lt;/em&gt; 확인 → &lt;em&gt;미사용 권한 식별&lt;/em&gt; → 최소 권한으로 축소.&lt;/p&gt;
&lt;h2 id=&quot;best-practice&quot;&gt;Best Practice&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Root user 의 MFA + 일상 사용 금지 (Access Key 삭제)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ User 대신 SSO (Identity Center)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Role 우선 (long-term credentials 회피)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Least privilege (필요한 권한만, Access Advisor 로 미사용 제거)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Permission Boundary 로 최대 권한 제한&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ SCP 로 조직 전체 guardrail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Access Analyzer 로 외부 접근 탐지&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ MFA 강제 (Condition 으로 정책 적용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ Credentials rotation 정기 (90일 이내)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ CloudTrail 로 모든 IAM 이벤트 감사&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Root user 의 access key&lt;/strong&gt; = 누출 = 모든 권한 탈취. 즉시 삭제 + SSO 전환.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&quot;Action&quot;: &quot;*&quot;&lt;/code&gt; 남발&lt;/strong&gt; = 권한 과잉. 실제 필요한 Action 목록으로.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-term access key 를 git 에&lt;/strong&gt; = 자동 스캔으로 즉시 탐지됨. Role + STS 사용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource-based policy 의 Principal 오타&lt;/strong&gt; = 의도치 않은 외부 공개.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy 변경 후 즉시 반영 안 됨&lt;/strong&gt; = IAM 은 eventually consistent. 수초 대기.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssumeRole 시 duration 기본값&lt;/strong&gt; = 1시간. 장시간 작업은 &lt;code&gt;--duration-seconds&lt;/code&gt; 조정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCP 와 Permission Boundary 혼동&lt;/strong&gt; = SCP 는 계정 전체 상한, PB 는 특정 Role 상한.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[OAuth2]] (비교)&lt;/li&gt;
&lt;li&gt;[[k8s-rbac]] (대조)&lt;/li&gt;
&lt;li&gt;[[aws-secrets-manager]]&lt;/li&gt;
&lt;li&gt;[[aws-sts-assume-role]]&lt;/li&gt;
&lt;li&gt;[[aws-eks]] (IRSA)&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail]] (감사 로그)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>iam</category><category>security</category><category>auth</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] Lambda Cold Start: 원인과 완화</title><link>https://shinkeonkim.com/wiki/cloud/aws-lambda-cold-start/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-lambda-cold-start/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Cold Start&lt;/strong&gt; = Lambda 가 &lt;em&gt;처음 호출&lt;/em&gt; 또는 &lt;em&gt;idle 후 다시 호출&lt;/em&gt; 시 &lt;em&gt;컨테이너 + 런타임 + 사용자 코드 init&lt;/em&gt; 에 소요되는 지연 시간.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황-cold-start-가-문제인-경우&quot;&gt;사용 상황 (cold start 가 문제인 경우)&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;영향&lt;/th&gt;&lt;th&gt;권장 완화&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;동기 API Gateway 요청&lt;/td&gt;&lt;td&gt;첫 요청 latency spike&lt;/td&gt;&lt;td&gt;Provisioned Concurrency&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;사용자 직접 호출 (실시간)&lt;/td&gt;&lt;td&gt;체감 느림&lt;/td&gt;&lt;td&gt;Provisioned Concurrency / SnapStart&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;배치 비동기 처리&lt;/td&gt;&lt;td&gt;일반적으로 무시 가능&lt;/td&gt;&lt;td&gt;불필요&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SQS / EventBridge 트리거&lt;/td&gt;&lt;td&gt;큐 쌓임 정도만 영향&lt;/td&gt;&lt;td&gt;Bundle 최적화로 충분&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Java 기반 함수&lt;/td&gt;&lt;td&gt;cold start 1000ms+&lt;/td&gt;&lt;td&gt;SnapStart 필수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VPC 내 Lambda&lt;/td&gt;&lt;td&gt;예전엔 +5-15초 (현재 거의 없음)&lt;/td&gt;&lt;td&gt;최신 Hyperplane 사용&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Cold start 가 &lt;em&gt;p99 수준에서&lt;/em&gt; 실제 사용자 경험에 미치는지 먼저 측정. 과도한 최적화 전에 데이터를 봐야 함.&lt;/p&gt;
&lt;h2 id=&quot;단계&quot;&gt;단계&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Inv[Invocation] --&gt; Box{Warm container?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Box --&gt;|Yes| Handle[handler 실행&amp;#x3C;br/&gt;~ms]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Box --&gt;|No| Cold[Cold Start]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cold --&gt; S1[1. Firecracker microVM 생성]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cold --&gt; S2[2. Runtime 부팅]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cold --&gt; S3[3. 사용자 코드 download/extract]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cold --&gt; S4[4. Init handler 실행]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S4 --&gt; Handle&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;단계&lt;/th&gt;&lt;th&gt;시간 (Node)&lt;/th&gt;&lt;th&gt;소유자&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MicroVM 생성&lt;/td&gt;&lt;td&gt;~50ms&lt;/td&gt;&lt;td&gt;AWS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Runtime 부팅&lt;/td&gt;&lt;td&gt;~50ms&lt;/td&gt;&lt;td&gt;AWS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;코드 load&lt;/td&gt;&lt;td&gt;~50ms (의존성 크기 비례)&lt;/td&gt;&lt;td&gt;AWS + 사용자&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Init code 실행&lt;/td&gt;&lt;td&gt;&lt;em&gt;사용자 책임&lt;/em&gt;&lt;/td&gt;&lt;td&gt;사용자&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;execution-environment-lifecycle&quot;&gt;Execution Environment Lifecycle&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Init[&quot;INIT phase&amp;#x3C;br/&gt;(cold start 비용)&quot;] --&gt; Invoke1[&quot;INVOKE 1&amp;#x3C;br/&gt;(handler 실행)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Invoke1 --&gt; Invoke2[&quot;INVOKE 2-N&amp;#x3C;br/&gt;(warm 재사용)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Invoke2 --&gt; Shutdown[&quot;SHUTDOWN&amp;#x3C;br/&gt;(idle timeout)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INIT&lt;/strong&gt;: MicroVM 생성 + 런타임 부팅 + 사용자 init code 실행. &lt;em&gt;1회만&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INVOKE&lt;/strong&gt;: 매 호출마다 handler 함수 실행. INIT 없음.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SHUTDOWN&lt;/strong&gt;: idle 후 (보통 5-15분) 환경 회수. 다음 호출 = 새 INIT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재사용&lt;/strong&gt;: &lt;code&gt;/tmp&lt;/code&gt; (512MB-10GB), 전역 변수, DB 연결 등 재사용 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;runtime-별-cold-start-직관&quot;&gt;Runtime 별 cold start (직관)&lt;/h2&gt;
&lt;!-- mdx-component: ChartJs --&gt;
&lt;h2 id=&quot;완화-전략&quot;&gt;완화 전략&lt;/h2&gt;
&lt;h3 id=&quot;1-provisioned-concurrency&quot;&gt;1. Provisioned Concurrency&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;N 개 인스턴스를 항상 warm 상태로 유지&lt;/em&gt;. cold start 0.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lambda&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-provisioned-concurrency-config&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --function-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-func&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --qualifier&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; prod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --provisioned-concurrent-executions&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;10 인스턴스 항상 warm.&lt;/li&gt;
&lt;li&gt;Cold start 완전 제거.&lt;/li&gt;
&lt;li&gt;비용: idle 상태에서도 과금. &lt;em&gt;API, 실시간 처리에 적합&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;em&gt;latency 예측 가능성이 필요한 API&lt;/em&gt; 에만. &lt;em&gt;batch / async&lt;/em&gt; 는 불필요. Application Auto Scaling 으로 트래픽 패턴에 맞게 자동 조절 가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Auto Scaling 연동&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; application-autoscaling&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; register-scalable-target&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service-namespace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lambda&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --resource-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; function:my-func:prod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --scalable-dimension&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lambda:function:ProvisionedConcurrency&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --min-capacity&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --max-capacity&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 50&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-lambda-snapstart-java&quot;&gt;2. Lambda SnapStart (Java)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Build[&quot;배포 시&amp;#x3C;br/&gt;handler init 실행 → snapshot&quot;] -.-&gt; Inv[&quot;호출 시&amp;#x3C;br/&gt;snapshot 복원 → handler 즉시 실행&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Java cold start 1500ms → 150ms&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;snapshot 안에 DB 연결 같은 unique value 주의&lt;/strong&gt; (uniqueness 깨짐).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AfterRestore&lt;/code&gt; hook 으로 snapshot 복원 후 초기화 재실행 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;java&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LambdaHook&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;hookType&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; AfterRestore.class)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; static&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; afterRestore&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(Context context) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // snapshot 복원 후 실행: DB 연결 재수립 등&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    dbConnection &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; createNewConnection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-코드-최적화&quot;&gt;3. 코드 최적화&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// ❌ handler 안에서: 매 호출마다 새 연결&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; DBClient&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; result&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; db.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// ✅ handler 밖 (init 시 1회): 연결 재사용&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; DBClient&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; result&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; db.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;DB 연결, HTTP 클라이언트, SDK 초기화 = handler 밖으로.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Lazy initialization&lt;/em&gt;: 실제 필요할 때까지 지연.&lt;/li&gt;
&lt;li&gt;불필요한 &lt;code&gt;import&lt;/code&gt; 제거.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-bundle-크기-줄이기&quot;&gt;4. Bundle 크기 줄이기&lt;/h3&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;도구&lt;/th&gt;&lt;th&gt;효과&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;esbuild&lt;/td&gt;&lt;td&gt;tree-shake + minify, 가장 빠름&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;webpack&lt;/td&gt;&lt;td&gt;동일 효과, 설정 더 복잡&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Layer 분리&lt;/td&gt;&lt;td&gt;큰 의존성 (AWS SDK 등) 을 Layer 로 분리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lambda Container Image&lt;/td&gt;&lt;td&gt;ECR 레이어 캐싱 활용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;.zip&lt;/code&gt; 압축 최적화&lt;/td&gt;&lt;td&gt;&lt;code&gt;node_modules&lt;/code&gt; 필요 파일만 포함&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;목표: &lt;em&gt;zip 10MB 이하&lt;/em&gt;, 가능하면 &lt;em&gt;5MB 이하&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&quot;5-arm64-graviton2&quot;&gt;5. ARM64 (Graviton2)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lambda&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update-function-configuration&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --function-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-func&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --architectures&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arm64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;x86_64 대비 &lt;em&gt;cold start 10-20% 개선&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;비용 &lt;em&gt;약 20% 절감&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;대부분의 런타임 지원 (Node, Python, Java, Go, Ruby).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ARM 네이티브 바이너리 확인 필수&lt;/em&gt; (native addon 있을 경우).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;warm-유지-anti-pattern&quot;&gt;Warm 유지 anti-pattern&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CloudWatch Events 로 5분마다 ping&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;schedule:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rate&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; minutes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;target:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lambda&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; function&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;em&gt;옛 워크어라운드&lt;/em&gt;. 현재는 &lt;em&gt;Provisioned Concurrency 가 정통&lt;/em&gt;. ping 방식의 문제:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;동시 N 인스턴스 warm 보장 안 됨 (1개만 warm).&lt;/li&gt;
&lt;li&gt;트래픽 급증 시 여전히 cold start 발생.&lt;/li&gt;
&lt;li&gt;불필요한 비용 + 복잡도.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;측정--모니터링&quot;&gt;측정 + 모니터링&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; os&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;INIT_TIME&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; time.time()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;INIT t=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{INIT_TIME}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;, container=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;os.environ.get(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;AWS_LAMBDA_LOG_STREAM_NAME&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(event, context):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    invoke_time &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; time.time()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;HANDLER t=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;invoke_time&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;, delta=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;invoke_time &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; INIT_TIME&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:.3f&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;s&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CloudWatch Logs 에서 &lt;em&gt;INIT vs HANDLER&lt;/em&gt; 시간 차 = cold start 실측.&lt;/p&gt;
&lt;h3 id=&quot;aws-cloudwatch-지표&quot;&gt;[[aws-cloudwatch]] 지표&lt;/h3&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;지표&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;InitDuration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;cold start 소요 시간 (REPORT 로그)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Duration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;handler 실행 시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ConcurrentExecutions&lt;/code&gt;&lt;/td&gt;&lt;td&gt;동시 실행 수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ProvisionedConcurrencyUtilization&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Provisioned 사용률&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Throttles&lt;/code&gt;&lt;/td&gt;&lt;td&gt;제한된 요청 수&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# X-Ray 활성화: init / handler 구간별 tracing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lambda&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update-function-configuration&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --function-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-func&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --tracing-config&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Mode=Active&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;lambda-power-tuning&quot;&gt;Lambda Power Tuning&lt;/h2&gt;
&lt;p&gt;AWS Lambda Power Tuning (오픈소스 Step Functions 워크플로우) 으로 &lt;em&gt;메모리 vs 비용 vs 속도 최적화점&lt;/em&gt; 탐색.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Step Functions 로 실행, 각 메모리 설정에서 N 회 테스트&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;lambdaARN&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;arn:aws:lambda:...:my-func&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;powerValues&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [128, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;256,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 512,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 1024,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 2048,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 3008],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;num&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 10,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;payload&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;parallelInvocation&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;strategy&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;cost&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;메모리 증가 = vCPU 비율 증가 = 실행 시간 감소.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;비용 최적 메모리 != 가장 저렴한 메모리&lt;/em&gt;. 빠른 실행이 총 비용 낮출 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vpc-lambda-의-cold-start-옛-vs-현재&quot;&gt;VPC Lambda 의 cold start (옛 vs 현재)&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;시점&lt;/th&gt;&lt;th&gt;Cold Start (VPC)&lt;/th&gt;&lt;th&gt;원인&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;~2019&lt;/td&gt;&lt;td&gt;5-15초&lt;/td&gt;&lt;td&gt;ENI 직접 생성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019+ (Hyperplane)&lt;/td&gt;&lt;td&gt;~1초 추가&lt;/td&gt;&lt;td&gt;ENI 사전 생성 + 재사용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2024+ (Firecracker warm pool)&lt;/td&gt;&lt;td&gt;일반과 거의 동일&lt;/td&gt;&lt;td&gt;warm ENI pool&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
현재는 VPC Lambda cold start 가 거의 문제 없음. 단, &lt;em&gt;서브넷 IP 고갈&lt;/em&gt; 은 여전히 주의.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;container-image-vs-zip&quot;&gt;Container Image vs ZIP&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;ZIP&lt;/th&gt;&lt;th&gt;Container Image&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;최대 크기&lt;/td&gt;&lt;td&gt;50MB (압축) / 250MB (비압축)&lt;/td&gt;&lt;td&gt;10GB (ECR)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;빌드 속도&lt;/td&gt;&lt;td&gt;빠름&lt;/td&gt;&lt;td&gt;느림 (Docker build)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cold start&lt;/td&gt;&lt;td&gt;빠름&lt;/td&gt;&lt;td&gt;느릴 수 있음 (초기 pull)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Layer 재사용&lt;/td&gt;&lt;td&gt;Lambda Layer&lt;/td&gt;&lt;td&gt;Docker layer 캐싱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;로컬 테스트&lt;/td&gt;&lt;td&gt;SAM / AWS CLI&lt;/td&gt;&lt;td&gt;Docker 로 완전 동일 환경&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;의존성 관리&lt;/td&gt;&lt;td&gt;번들러 필요&lt;/td&gt;&lt;td&gt;Dockerfile 로 단순&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;대규모 ML 모델이나 복잡한 네이티브 의존성&lt;/em&gt;: Container Image. &lt;em&gt;일반 서버리스 API&lt;/em&gt;: ZIP + esbuild.&lt;/p&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cold start 측정 안 하고 최적화&lt;/strong&gt; = 실제 병목이 아닐 수 있음. 먼저 &lt;code&gt;InitDuration&lt;/code&gt; 측정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provisioned Concurrency 과다 설정&lt;/strong&gt; = 불필요한 비용. 실제 동시 요청 수 기반으로 설정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SnapStart 의 snapshot 내 UUID/시간&lt;/strong&gt; = 복원 후 중복. &lt;code&gt;AfterRestore&lt;/code&gt; 훅에서 재생성.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handler 밖 초기화 실패&lt;/strong&gt; = 함수 전체 장애. init code 는 방어적으로 작성.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ARM64 로 전환 후 native addon 오류&lt;/strong&gt; = &lt;code&gt;sharp&lt;/code&gt;, &lt;code&gt;bcrypt&lt;/code&gt; 등 아키텍처별 바이너리 재빌드 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bundle 크기 과다&lt;/strong&gt; = 코드 load 시간 증가. &lt;code&gt;@aws-sdk/client-s3&lt;/code&gt; 만 import (전체 SDK 금지).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPC Lambda 서브넷 IP 고갈&lt;/strong&gt; = ENI 생성 실패. &lt;code&gt;/24&lt;/code&gt; 이상 서브넷 권장.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-lambda]]&lt;/li&gt;
&lt;li&gt;[[aws-vpc]]&lt;/li&gt;
&lt;li&gt;[[aws-api-gateway]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>lambda</category><category>cold-start</category><category>performance</category><category>serverless</category><author>koa (김신건)</author></item><item><title>[AWS] RDS Multi-AZ + Read Replica</title><link>https://shinkeonkim.com/wiki/cloud/aws-rds-multi-az/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-rds-multi-az/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;RDS (Relational Database Service)&lt;/strong&gt; = AWS 의 &lt;em&gt;managed RDB&lt;/em&gt;. MySQL, PostgreSQL, MariaDB, Oracle, SQL Server, &lt;em&gt;Aurora&lt;/em&gt; (AWS 자체).&lt;/p&gt;
&lt;h2 id=&quot;multi-az-deployment&quot;&gt;Multi-AZ Deployment&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary[&quot;Primary (AZ a)&amp;#x3C;br/&gt;Master&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary --&gt;|sync 복제| Standby[&quot;Standby (AZ b)&amp;#x3C;br/&gt;passive&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary --&gt; Client&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note[&quot;Standby = 읽기 불가&amp;#x3C;br/&gt;(HA 용)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;동기 복제&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;AZ 장애 시 &lt;em&gt;자동 failover&lt;/em&gt; (1-2분).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Read 분산 불가&lt;/em&gt; (Standby = passive).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;read-replica&quot;&gt;Read Replica&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary[&quot;Primary&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary -.async 복제.-&gt; R1[&quot;Read Replica 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary -.async.-&gt; R2[&quot;Read Replica 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary -.async cross-region.-&gt; R3[&quot;Read Replica 3&amp;#x3C;br/&gt;(다른 region)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client --&gt;|writes| Primary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client --&gt;|reads| R1 &amp;#x26; R2 &amp;#x26; R3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;비동기 복제&lt;/em&gt; (lag 가능).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;읽기 부하 분산&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Cross-region&lt;/em&gt; 가능 (DR).&lt;/li&gt;
&lt;li&gt;Standalone DB 로 &lt;em&gt;승격&lt;/em&gt; 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;aurora-vs-rds-mysqlpostgresql&quot;&gt;Aurora vs RDS MySQL/PostgreSQL&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;RDS MySQL/PG&lt;/th&gt;&lt;th&gt;Aurora MySQL/PG&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;스토리지&lt;/td&gt;&lt;td&gt;EBS&lt;/td&gt;&lt;td&gt;&lt;em&gt;AWS 자체 분산 (3 AZ x 2 복제)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;처리량&lt;/td&gt;&lt;td&gt;표준&lt;/td&gt;&lt;td&gt;&lt;em&gt;3-5배 빠름&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;백업&lt;/td&gt;&lt;td&gt;snapshot&lt;/td&gt;&lt;td&gt;&lt;em&gt;continuous 백업 (PITR)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Read Replica&lt;/td&gt;&lt;td&gt;5개 한도&lt;/td&gt;&lt;td&gt;15개 + reader endpoint&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Failover&lt;/td&gt;&lt;td&gt;1-2분&lt;/td&gt;&lt;td&gt;&lt;em&gt;&amp;#x3C; 30초&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;가격&lt;/td&gt;&lt;td&gt;약간 cheap&lt;/td&gt;&lt;td&gt;약간 비쌈&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Serverless&lt;/td&gt;&lt;td&gt;옵션&lt;/td&gt;&lt;td&gt;&lt;em&gt;Aurora Serverless v2&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;em&gt;2026 신규 = 거의 항상 Aurora&lt;/em&gt;. RDS MySQL/PG 보다 &lt;em&gt;비싸지만 더 빠른 + 안정&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;aurora-분산-스토리지&quot;&gt;Aurora 분산 스토리지&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Compute[&quot;Compute (DB engine)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Compute --&gt; Storage[&quot;Cluster Volume (자체)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Storage --&gt; AZa1[&quot;AZ a copy 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Storage --&gt; AZa2[&quot;AZ a copy 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Storage --&gt; AZb1[&quot;AZ b copy 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Storage --&gt; AZb2[&quot;AZ b copy 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Storage --&gt; AZc1[&quot;AZ c copy 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Storage --&gt; AZc2[&quot;AZ c copy 2&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;6 copy, 3 AZ&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;quorum (4/6 write, 3/6 read)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;2 copy 손실 OK&lt;/em&gt; (가용성), &lt;em&gt;3 copy 손실 OK&lt;/em&gt; (durability).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rds-proxy&quot;&gt;RDS Proxy&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lambda --&gt; RDSProxy[&quot;RDS Proxy&amp;#x3C;br/&gt;(connection pool)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    EC2 --&gt; RDSProxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RDSProxy --&gt;|pool 재사용| RDS[(RDS)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Connection pool&lt;/em&gt; 을 &lt;em&gt;AWS managed&lt;/em&gt; 로.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Lambda 의 connection 폭증&lt;/em&gt; 해결.&lt;/li&gt;
&lt;li&gt;failover 시간 단축.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;aurora-serverless-v2&quot;&gt;Aurora Serverless v2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;자동 scaling&lt;/em&gt; (0.5 ACU - 128 ACU).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;cold start 없음&lt;/em&gt; (v1 의 결함 해결).&lt;/li&gt;
&lt;li&gt;가변 워크로드 / dev / test.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;aurora-global-database&quot;&gt;Aurora Global Database&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary[&quot;Primary Cluster (us-east-1)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary -.&amp;#x3C; 1s 복제.-&gt; Sec1[&quot;Secondary (eu-west-1)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Primary -.-&gt; Sec2[&quot;Secondary (ap-northeast-1)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note[&quot;DR: &amp;#x3C; 1분 failover&amp;#x3C;br/&gt;Read: 글로벌 분산&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;백업&quot;&gt;백업&lt;/h2&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;종류&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Automated backup&lt;/td&gt;&lt;td&gt;매일 + WAL. PITR (Point-in-Time Recovery)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Manual snapshot&lt;/td&gt;&lt;td&gt;수동, 영구&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Aurora Backtrack&lt;/td&gt;&lt;td&gt;옛 시점으로 &lt;em&gt;DB 자체 회귀&lt;/em&gt; (snapshot 없이)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;vpc-내-배치&quot;&gt;VPC 내 배치&lt;/h2&gt;
&lt;p&gt;RDS 인스턴스는 항상 &lt;em&gt;VPC Private Subnet&lt;/em&gt; 에 배치. &lt;em&gt;퍼블릭 서브넷 배치는 절대 금지&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DB Subnet Group&lt;/strong&gt;: 2개 이상 AZ 의 Private Subnet 지정. Multi-AZ 사용 시 필수 조건.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Group&lt;/strong&gt;: EC2 SG 에서 RDS SG 로만 인바운드 허용. IP 기반 아님.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bastion Host / SSM&lt;/strong&gt;: 직접 접속이 필요할 때 SSH Tunnel 또는 AWS SSM Session Manager 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App[&quot;EC2 / Lambda&amp;#x3C;br/&gt;(Private Subnet)&quot;] --&gt;|&quot;3306 / 5432&quot;| RDSProxy[&quot;RDS Proxy&amp;#x3C;br/&gt;(Private Subnet)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RDSProxy --&gt; RDS[&quot;RDS Primary&amp;#x3C;br/&gt;(Private Subnet, AZ-a)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RDS --&gt;|&quot;sync&quot;| Standby[&quot;Standby&amp;#x3C;br/&gt;(Private Subnet, AZ-b)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Bastion[&quot;Bastion / SSM&amp;#x3C;br/&gt;(Public Subnet)&quot;] -.-&gt;|&quot;SSH Tunnel&quot;| RDS&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;파라미터-그룹&quot;&gt;파라미터 그룹&lt;/h2&gt;
&lt;p&gt;RDS &lt;em&gt;인스턴스 파라미터&lt;/em&gt; 와 &lt;em&gt;클러스터 파라미터&lt;/em&gt; (Aurora) 가 분리됨.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;파라미터&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;영향&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;재시작 필요&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;max_connections&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;동시 접속 수&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;아니오&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;innodb_buffer_pool_size&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;InnoDB 캐시 크기&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;예&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;slow_query_log&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;느린 쿼리 기록&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;아니오&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;log_bin_trust_function_creators&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;함수 생성 권한 완화&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;아니오&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;character_set_server&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;서버 기본 문자셋&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;예&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
Static 파라미터 변경은 인스턴스 &lt;em&gt;재시작&lt;/em&gt; 이 필요. 프로덕션에서 갑작스럽게 적용되지 않도록 Maintenance Window 시간 확인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;모니터링-cloudwatch&quot;&gt;모니터링 (CloudWatch)&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;지표&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;설명&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;권장 임계치&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;CPUUtilization&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CPU 사용률&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&gt; 80% 지속 시 업사이즈 검토&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;FreeStorageSpace&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;남은 스토리지&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&amp;#x3C; 20% 알람 설정&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;DatabaseConnections&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;현재 연결 수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;max_connections 80% 경보&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;ReplicaLag&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Read Replica 복제 지연&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&gt; 1s 시 read-your-writes 위험&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;ReadIOPS&lt;/code&gt; / &lt;code&gt;WriteIOPS&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;IOPS&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;프로비저닝 IOPS 한도 대비 확인&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;FreeableMemory&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;여유 메모리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&amp;#x3C; 200MB 알람&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Enhanced Monitoring&lt;/em&gt;: OS 레벨 (메모리, 프로세스) 지표 추가 (1-60초 간격).
&lt;em&gt;Performance Insights&lt;/em&gt;: 쿼리별 대기 분석, DB 부하 시각화 (7일 무료, 2년 유료).&lt;/p&gt;
&lt;h2 id=&quot;업그레이드-전략&quot;&gt;업그레이드 전략&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;유형&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;방법&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;다운타임&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Minor 버전&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;자동 또는 수동&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수 초 (재시작)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Major 버전&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Blue-Green 권장&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Blue-Green = 수 초&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Aurora Major&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Blue-Green 또는 snapshot 복원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;계획 다운타임 필요&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Blue-Green 업그레이드 절차&lt;/strong&gt; (RDS 네이티브 지원):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Green = 신 버전 복제 클러스터 자동 생성&lt;/li&gt;
&lt;li&gt;복제 완료 후 &lt;em&gt;동기화 확인&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Switchover: 트래픽 전환 (수 초)&lt;/li&gt;
&lt;li&gt;검증 후 Blue 삭제&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
Aurora Major 버전 업그레이드 (예: MySQL 5.7 -&gt; 8.0) 는 호환성 확인 필수. 스토어드 프로시저, 뷰, 트리거의 deprecated 문법 검토 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;비용-최적화&quot;&gt;비용 최적화&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;방법&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;인스턴스 사이즈&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CloudWatch CPU/메모리 모니터링 후 rightsizing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Multi-AZ&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Dev/Test 환경은 Single-AZ 로 50% 절감&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Read Replica&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;리전 내 Reserved Instance 적용 가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Aurora 스토리지&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;사용량 기반 과금 (max 설정 없음), 읽기 IOPS 별도 과금 주의&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Backup 보존&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;자동 백업 보존 기간 최소화 (1-35일, 기본 7일)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Aurora Serverless v2&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;간헐적 워크로드에서 ACU 절감 (0.5 ACU 까지 스케일 다운)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Multi-AZ != Read Replica&lt;/strong&gt;: Multi-AZ 의 Standby 는 &lt;em&gt;읽기 불가&lt;/em&gt;. Read Replica 는 별도.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aurora major version upgrade&lt;/strong&gt;: 다운타임 있음. 충분한 테스트 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read Replica lag&lt;/strong&gt;: async 복제 특성상 &lt;em&gt;read-your-writes&lt;/em&gt; 가 깨질 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aurora storage 비용&lt;/strong&gt;: 사용량만큼 과금 (max 와 무관). &lt;em&gt;읽기 IOPS 비용&lt;/em&gt; 도 별도.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파라미터 그룹 수정 후 재시작 누락&lt;/strong&gt;: Static 파라미터 변경이 반영 안 된 채로 운영 지속.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;인스턴스-클래스-선택-가이드&quot;&gt;인스턴스 클래스 선택 가이드&lt;/h2&gt;
&lt;p&gt;Aurora 와 RDS 모두 &lt;em&gt;인스턴스 클래스&lt;/em&gt; 가 성능을 결정.&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;클래스 계열&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특징&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;적합한 워크로드&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.t4g.*&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;버스트 가능 (Graviton2)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Dev / Test, 낮은 기준 부하&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.m7g.*&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;범용 (Graviton3)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;웹 애플리케이션&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.r7g.*&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;메모리 최적화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;대용량 인메모리 캐시, Analytics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.x2g.*&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;고메모리 (SAP HANA급)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;초대형 인메모리 DB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;code&gt;t&lt;/code&gt; 클래스는 CPU 크레딧 소진 시 &lt;em&gt;성능 저하&lt;/em&gt;. 프로덕션 지속 부하에는 &lt;code&gt;m&lt;/code&gt; 또는 &lt;code&gt;r&lt;/code&gt; 계열 사용.&lt;/p&gt;
&lt;p&gt;Reserved Instance (1년/3년 약정) 사용 시 On-Demand 대비 최대 70% 절감. 안정적인 워크로드라면 RI 를 우선 검토.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;접속-보안-베스트-프랙티스&quot;&gt;접속 보안 베스트 프랙티스&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;권장&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;암호화 (전송)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SSL/TLS 강제 (&lt;code&gt;require_secure_transport = ON&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;암호화 (저장)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;RDS 생성 시 Encryption at rest 활성화 (KMS)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;인증&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;IAM DB 인증 (MySQL/PG 지원, 패스워드 불필요)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Secrets&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS Secrets Manager + 자동 rotation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;네트워크&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPC Private Subnet + Security Group 최소 권한&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- IAM 인증 토큰으로 접속 (MySQL 예시)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 1. IAM 역할에 rds-db:connect 권한 부여&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 2. 토큰 발급&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;MYSQL_PWD&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(aws rds generate&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;db&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;auth&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;token \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  --hostname mydb.xxx.us-east-1.rds.amazonaws.com \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  --port 3306 \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  --username iam_user)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 3. SSL + 토큰으로 접속&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;mysql &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;h &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;mydb&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;xxx&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.us&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;east&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;rds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;amazonaws&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.com \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  --ssl-ca=global-bundle.pem \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;u iam_user \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  --password=&quot;$MYSQL_PWD&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[postgresql]], [[mysql]]&lt;/li&gt;
&lt;li&gt;[[aws-vpc]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]]&lt;/li&gt;
&lt;li&gt;[[aws-ecs-fargate]] - 컨테이너 워크로드 + RDS 조합&lt;/li&gt;
&lt;li&gt;[[aws-kms]] - RDS Encryption at rest&lt;/li&gt;
&lt;li&gt;[[aws-secrets-manager]] - DB 패스워드 자동 rotation&lt;/li&gt;
&lt;li&gt;[[aws-iam]] - IAM DB 인증 설정&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb]] - RDS 앞단 Load Balancer 패턴 (RDS Proxy 와 비교)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>rds</category><category>aurora</category><category>database</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] S3: object storage, storage classes, lifecycle</title><link>https://shinkeonkim.com/wiki/cloud/aws-s3/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-s3/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;S3&lt;/strong&gt; = AWS 의 &lt;em&gt;object storage&lt;/em&gt;. &lt;em&gt;bucket + key + object&lt;/em&gt;. &lt;em&gt;11 9’s durability&lt;/em&gt; (99.999999999%), &lt;em&gt;무한 확장&lt;/em&gt;. 2026 시점 인터넷의 핵심 스토리지 플랫폼.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;S3 선택 이유&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;정적 자산 (이미지, JS, CSS)&lt;/td&gt;&lt;td&gt;[[aws-cloudfront-cdn]] 와 조합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;로그 장기 보관&lt;/td&gt;&lt;td&gt;Lifecycle 로 Glacier 자동 이동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ML 학습 데이터 / 모델&lt;/td&gt;&lt;td&gt;S3 → SageMaker 직접 연동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;백업 / DR&lt;/td&gt;&lt;td&gt;Cross-Region Replication&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;데이터 레이크&lt;/td&gt;&lt;td&gt;S3 + Athena + Glue&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;사용자 파일 업로드&lt;/td&gt;&lt;td&gt;Presigned URL 로 서버 우회&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;컴플라이언스 아카이빙&lt;/td&gt;&lt;td&gt;Object Lock WORM&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;storage-class&quot;&gt;Storage Class&lt;/h2&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Class&lt;/th&gt;&lt;th&gt;용도&lt;/th&gt;&lt;th&gt;비용&lt;/th&gt;&lt;th&gt;검색 latency&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;자주 접근&lt;/td&gt;&lt;td&gt;$0.023/GB&lt;/td&gt;&lt;td&gt;ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Intelligent-Tiering&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;자동 자주/덜 자주 분류&lt;/td&gt;&lt;td&gt;varies&lt;/td&gt;&lt;td&gt;ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Standard-IA&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;가끔 접근&lt;/td&gt;&lt;td&gt;더 cheap, retrieval fee&lt;/td&gt;&lt;td&gt;ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;One Zone-IA&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;단일 AZ + 가끔 접근&lt;/td&gt;&lt;td&gt;더 cheap&lt;/td&gt;&lt;td&gt;ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Glacier Instant Retrieval&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;archive + 즉시 접근&lt;/td&gt;&lt;td&gt;매우 cheap&lt;/td&gt;&lt;td&gt;ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Glacier Flexible Retrieval&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;archive&lt;/td&gt;&lt;td&gt;매우 cheap&lt;/td&gt;&lt;td&gt;분~시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Glacier Deep Archive&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;장기 archive&lt;/td&gt;&lt;td&gt;가장 cheap&lt;/td&gt;&lt;td&gt;12+ 시간&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Intelligent-Tiering&lt;/em&gt; 은 접근 패턴 예측 불가 시 최적. 30일 미접근 시 IA 로 자동 이동.&lt;/p&gt;
&lt;h2 id=&quot;lifecycle-policy&quot;&gt;Lifecycle Policy&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Rules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;archive-old-logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Filter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Prefix&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;logs/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Transitions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Days&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        StorageClass&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;STANDARD_IA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Days&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;90&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        StorageClass&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;GLACIER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Expiration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Days&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;365&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    AbortIncompleteMultipartUploads&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      DaysAfterInitiation&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;비용 대폭 절감&lt;/em&gt;. 사용 안 하는 데이터를 &lt;em&gt;자동 cheaper class&lt;/em&gt; 로.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;AbortIncompleteMultipartUploads&lt;/code&gt; 는 반드시 설정. 미완료 multipart 가 비용 누수.&lt;/p&gt;
&lt;h2 id=&quot;replication-crr--srr&quot;&gt;Replication (CRR / SRR)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SrcBucket[&quot;Source Bucket&amp;#x3C;br/&gt;(us-east-1)&quot;] --&gt;|CRR| DstBucket[&quot;Dest Bucket&amp;#x3C;br/&gt;(ap-northeast-2)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SrcBucket2[&quot;Source Bucket A&quot;] --&gt;|SRR| DstBucket2[&quot;Dest Bucket B&amp;#x3C;br/&gt;(같은 region)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;종류&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CRR (Cross-Region Replication)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;다른 리전으로 복제 (DR, 지연 감소)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SRR (Same-Region Replication)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;같은 리전 내 복제 (로그 집계, 테스트)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Source bucket: &lt;em&gt;Versioning 활성화 필수&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;신규 객체만 복제 (기존 객체는 S3 Batch Operations 으로 별도 복제).&lt;/li&gt;
&lt;li&gt;Delete Marker: 기본 복제 안 됨 (설정 가능).&lt;/li&gt;
&lt;li&gt;복제 시간 SLA: 기본 15분 이내. &lt;em&gt;S3 Replication Time Control (RTC)&lt;/em&gt; = 99.99% 를 15분 이내 보장 (추가 비용).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;versioning&quot;&gt;Versioning&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; s3api&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-bucket-versioning&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --bucket&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --versioning-configuration&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Status=Enabled&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;덮어쓰기 / 삭제 = 옛 버전 보존.&lt;/li&gt;
&lt;li&gt;실수 복구 가능.&lt;/li&gt;
&lt;li&gt;삭제 = Delete Marker 생성 (실제 삭제 아님).&lt;/li&gt;
&lt;li&gt;비용: 모든 버전 저장. Lifecycle 로 오래된 버전 정리 필수.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;object-lock-worm&quot;&gt;Object Lock (WORM)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Mode&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;GOVERNANCE | COMPLIANCE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;RetainUntilDate&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2027-06-25T00:00:00Z&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Write Once Read Many&lt;/em&gt;: 보존 기간 중 삭제/수정 불가.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOVERNANCE&lt;/code&gt;: 특정 IAM 권한으로 삭제 가능.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COMPLIANCE&lt;/code&gt;: &lt;em&gt;root user 도 삭제 불가&lt;/em&gt;. 금융/의료 컴플라이언스.&lt;/li&gt;
&lt;li&gt;Legal Hold: 날짜 무관 삭제 차단.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;multipart-upload&quot;&gt;Multipart Upload&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client-&gt;&gt;S3: InitiateMultipartUpload (uploadId)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    par parallel parts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Client-&gt;&gt;S3: UploadPart 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Client-&gt;&gt;S3: UploadPart 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Client-&gt;&gt;S3: UploadPart N&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client-&gt;&gt;S3: CompleteMultipartUpload (part etags)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3--&gt;&gt;Client: 완료&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;큰 파일&lt;/em&gt; (100MB+) 권장, &lt;em&gt;5GB 초과&lt;/em&gt; 시 &lt;em&gt;필수&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;병렬 업로드 + 개별 파트 재시도 가능.&lt;/li&gt;
&lt;li&gt;최소 파트 크기: 5MB (마지막 파트 제외).&lt;/li&gt;
&lt;li&gt;미완료 Multipart: &lt;em&gt;Lifecycle &lt;code&gt;AbortIncompleteMultipartUploads&lt;/code&gt;&lt;/em&gt; 로 자동 정리.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;presigned-url&quot;&gt;Presigned URL&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; boto3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;s3 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; boto3.client(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;s3&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;url &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s3.generate_presigned_url(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;put_object&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Params&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Bucket&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;my-bucket&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Key&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;upload.zip&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    ExpiresIn&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3600&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 1시간&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 &lt;em&gt;S3 에 직접 업로드/다운로드&lt;/em&gt; (서버 경유 없음).&lt;/li&gt;
&lt;li&gt;임시 URL (만료 시간 설정).&lt;/li&gt;
&lt;li&gt;서버 측에서 IAM 권한 위임.&lt;/li&gt;
&lt;li&gt;GET (다운로드), PUT (업로드) 모두 지원.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;transfer-acceleration&quot;&gt;Transfer Acceleration&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 엔드포인트: my-bucket.s3-accelerate.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; configure&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; default.s3.use_accelerate_endpoint&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;CloudFront edge location&lt;/em&gt; 을 경유해 S3 에 전송.&lt;/li&gt;
&lt;li&gt;글로벌 업로드 속도 &lt;em&gt;최대 60% 향상&lt;/em&gt; (지역별 편차 큼).&lt;/li&gt;
&lt;li&gt;비용: 일반 전송 대비 추가 요금.&lt;/li&gt;
&lt;li&gt;실제 개선 여부: &lt;em&gt;S3 Transfer Acceleration Speed Comparison Tool&lt;/em&gt; 로 사전 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;s3-access-points&quot;&gt;S3 Access Points&lt;/h2&gt;
&lt;p&gt;버킷 하나를 &lt;em&gt;여러 팀이 다른 정책으로&lt;/em&gt; 접근할 때.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; s3control&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-access-point&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; data-science-ap&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --account-id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 123456789&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --bucket&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-data-lake&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --vpc-configuration&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; VpcId=vpc-abc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;각 Access Point 는 고유한 ARN + endpoint + Policy.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;VPC-only 접근 강제&lt;/em&gt; 가능.&lt;/li&gt;
&lt;li&gt;버킷 Policy 가 복잡해지는 것을 Access Point Policy 로 분리.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;static-website-hosting&quot;&gt;Static Website Hosting&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Bucket Property: Static Website Hosting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Index document: index.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Error document: 404.html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CloudFront + OAC 조합:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFront: 글로벌 CDN, HTTPS, 커스텀 도메인.&lt;/li&gt;
&lt;li&gt;OAC (Origin Access Control): CloudFront 에서만 S3 접근 허용.&lt;/li&gt;
&lt;li&gt;S3 직접 접근 차단 (Block Public Access 유지).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;event-notifications&quot;&gt;Event Notifications&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Upload[Object 업로드] --&gt; S3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3 --&gt;|event| Lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3 --&gt;|event| SQS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3 --&gt;|event| SNS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3 --&gt;|event| EventBridge&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;새 파일 → 처리 자동화.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;이미지 thumbnail 생성&lt;/em&gt;, &lt;em&gt;비디오 transcoding&lt;/em&gt;, &lt;em&gt;데이터 처리&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge]] 연동 시 &lt;em&gt;content-based filtering&lt;/em&gt; 가능 (object key prefix 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;s3-select--s3-object-lambda&quot;&gt;S3 Select / S3 Object Lambda&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S3 Select&lt;/strong&gt;: CSV / JSON / Parquet 의 &lt;em&gt;SQL 일부 query&lt;/em&gt;. 필요한 컬럼만 pull.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 Object Lambda&lt;/strong&gt;: GET 요청 시 &lt;em&gt;Lambda 가 transform&lt;/em&gt; (redact, watermark, format conversion).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;보안&quot;&gt;보안&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q[보안 layer]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Block[&quot;Block Public Access&amp;#x3C;br/&gt;(계정/bucket)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Bucket[Bucket Policy]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; IAM[IAM Policy]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; ACL[&quot;ACL (legacy)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Enc[&quot;Server-Side Encryption&amp;#x3C;br/&gt;(SSE)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; KMS[KMS 키]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Object[Object Lock]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;encryption&quot;&gt;Encryption&lt;/h3&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;종류&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SSE-S3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;S3 관리 key (AES-256)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SSE-KMS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[[aws-kms]] 관리 key, 감사 가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SSE-C&lt;/code&gt;&lt;/td&gt;&lt;td&gt;사용자 제공 key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;DSSE-KMS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;이중 암호화&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;2023년부터 &lt;em&gt;기본 암호화 SSE-S3 자동 적용&lt;/em&gt;. 컴플라이언스 요구 시 SSE-KMS 전환.&lt;/p&gt;
&lt;h3 id=&quot;object-ownership--acl&quot;&gt;Object Ownership + ACL&lt;/h3&gt;
&lt;p&gt;신규 버킷은 &lt;em&gt;ACL 비활성화 + Object Ownership = BucketOwnerEnforced&lt;/em&gt; 권장. Cross-account 업로드 객체도 버킷 소유자가 자동 소유.&lt;/p&gt;
&lt;h2 id=&quot;inventory--storage-lens--analytics&quot;&gt;Inventory / Storage Lens / Analytics&lt;/h2&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;도구&lt;/th&gt;&lt;th&gt;용도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;S3 Inventory&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;객체 목록을 CSV/Parquet 으로 주기 출력 (대규모 버킷 감사)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;S3 Storage Lens&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;조직 전체 스토리지 사용량 대시보드 (비용 최적화 insight)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;S3 Analytics&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;접근 패턴 분석 → Standard-IA 전환 권고&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Storage Lens 기본 대시보드 (무료)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; s3control&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-storage-lens-dashboard&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --config-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; default-account-dashboard&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --account-id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 123456789&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bucket 공개 사고&lt;/strong&gt; = “Block Public Access” 항상 켜기. CloudFront + OAC 권장.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versioning 후 비용&lt;/strong&gt; = 옛 버전 누적. Lifecycle &lt;code&gt;NoncurrentVersionExpiration&lt;/code&gt; 으로 정리.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Glacier 의 retrieval fee&lt;/strong&gt; = Glacier 에서 빨리 꺼내면 비용 큼. 접근 빈도 고려.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multipart upload 정리 안 함&lt;/strong&gt; = 미완료 multipart 가 비용 발생. Lifecycle &lt;code&gt;AbortIncompleteMultipartUploads&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CRR 에서 기존 객체 미복제&lt;/strong&gt; = Replication 설정 이전 객체는 S3 Batch Operations 로 별도 복제.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 Event + Lambda 무한 루프&lt;/strong&gt; = Lambda 가 같은 버킷에 쓰면 이벤트 재발생. prefix/suffix 필터 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presigned URL 의 만료 후 클라이언트 캐싱&lt;/strong&gt; = 클라이언트가 URL 를 저장해 재사용 시 403. 짧은 만료 + 재발급 로직.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-cloudfront-cdn]]&lt;/li&gt;
&lt;li&gt;[[aws-kms]]&lt;/li&gt;
&lt;li&gt;[[aws-lambda]] (S3 trigger)&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge]]&lt;/li&gt;
&lt;li&gt;[[aws-iam]] (Bucket Policy)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>s3</category><category>storage</category><category>object-store</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] SQS: managed queue, FIFO, DLQ</title><link>https://shinkeonkim.com/wiki/cloud/aws-sqs/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-sqs/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SQS (Simple Queue Service)&lt;/strong&gt; = AWS 의 &lt;em&gt;완전 관리형 메시지 큐&lt;/em&gt;. &lt;em&gt;infinite scale&lt;/em&gt;, &lt;em&gt;no provisioning&lt;/em&gt;, &lt;em&gt;pay-per-request&lt;/em&gt;. 프로듀서와 컨슈머를 비동기로 분리.&lt;/p&gt;
&lt;h2 id=&quot;standard-vs-fifo&quot;&gt;Standard vs FIFO&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Standard&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;FIFO&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;처리량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;거의 무한&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;300 msg/s (배치 시 3000/s)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;순서&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;best-effort&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;엄격 (group 안)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;중복&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;at-least-once (드물게 중복)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;exactly-once (5분 dedup 윈도우)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;URL suffix&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;.amazonaws.com/...&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;.fifo&lt;/code&gt; 필수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;가격&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;저렴&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;약간 비쌈&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;선택 기준&lt;/strong&gt;: 순서/중복 허용 가능 = Standard. 결제/주문 등 순서 중요 = FIFO.&lt;/p&gt;
&lt;h2 id=&quot;흐름&quot;&gt;흐름&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant P as Producer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant SQS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant C as Consumer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    P-&gt;&gt;SQS: SendMessage(body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SQS--&gt;&gt;P: messageId&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    C-&gt;&gt;SQS: ReceiveMessage(WaitTimeSeconds=20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SQS--&gt;&gt;C: message + receiptHandle&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over SQS,C: visibility timeout 시작 (기본 30초)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    C-&gt;&gt;C: 메시지 처리&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    C-&gt;&gt;SQS: DeleteMessage(receiptHandle)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;visibility-timeout&quot;&gt;Visibility Timeout&lt;/h2&gt;
&lt;p&gt;컨슈머가 메시지를 가져간 후 &lt;em&gt;다른 컨슈머에게 숨겨지는 시간&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Recv[&quot;ReceiveMessage&quot;] --&gt;|&quot;invisible (기본 30s)&quot;| Hidden[&quot;처리 중\n다른 consumer 안 보임&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Hidden --&gt;|&quot;DeleteMessage 성공&quot;| Done[&quot;제거됨&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Hidden --&gt;|&quot;timeout 만료&quot;| Visible[&quot;다시 visible\n= retry&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Visible --&gt;|&quot;maxReceiveCount 초과&quot;| DLQ[&quot;DLQ 로 이동&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;설정 원칙&lt;/strong&gt;: &lt;code&gt;처리 예상 시간 × 2 + 여유&lt;/code&gt; 로 설정. Lambda timeout 과 함께 고려.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 처리 중 timeout 연장 (최대 12시간)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sqs.change_message_visibility(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    QueueUrl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;queue_url,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    ReceiptHandle&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;receipt_handle,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    VisibilityTimeout&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;600&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 10분으로 연장&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dlq-dead-letter-queue&quot;&gt;DLQ (Dead Letter Queue)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CloudFormation / CDK 설정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;RedrivePolicy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  deadLetterTargetArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:sqs:ap-northeast-2:123:my-dlq&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  maxReceiveCount&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;maxReceiveCount&lt;/code&gt; 초과 후 자동으로 DLQ 로 이동&lt;/li&gt;
&lt;li&gt;원인 분석 후 &lt;code&gt;StartMessageMoveTask&lt;/code&gt; 로 원본 큐에 재처리&lt;/li&gt;
&lt;li&gt;DLQ 자체에도 DLQ 설정 가능 (중첩 방지)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;DLQ 에 메시지 쌓이면 CloudWatch alarm 필수. 무한 재처리 방지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;long-polling&quot;&gt;Long Polling&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sqs.receive_message(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    QueueUrl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;queue_url,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    WaitTimeSeconds&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,        &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# long poll (최대 20초)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    MaxNumberOfMessages&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,    &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 배치 (최대 10개)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;메시지 없으면 최대 20초 대기 후 반환&lt;/li&gt;
&lt;li&gt;&lt;em&gt;short polling&lt;/em&gt; (기본 0초) 대비 API 호출 횟수 대폭 감소, 비용 절감&lt;/li&gt;
&lt;li&gt;거의 항상 &lt;code&gt;WaitTimeSeconds=20&lt;/code&gt; 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sqs--lambda-이벤트-소스&quot;&gt;SQS + Lambda 이벤트 소스&lt;/h2&gt;
&lt;p&gt;AWS 가 자동으로 poll + batch + invoke + delete 처리.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SAM / CloudFormation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;EventSourceMapping&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  EventSourceArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:sqs:...:my-queue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  FunctionName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;my-func&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  BatchSize&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  MaximumBatchingWindowInSeconds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  FunctionResponseTypes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ReportBatchItemFailures&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 부분 실패 처리&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;ReportBatchItemFailures&lt;/code&gt;&lt;/strong&gt;: batch 중 일부만 실패 시 해당 메시지만 DLQ 로 이동. 나머지는 정상 처리.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(event, context):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    failures &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; record &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Records&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        try&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            process(record[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;body&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        except&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; Exception&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            failures.append({&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;itemIdentifier&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: record[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;messageId&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;batchItemFailures&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: failures}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;fifo--messagegroupid&quot;&gt;FIFO + MessageGroupId&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sqs.send_message(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    QueueUrl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;fifo_queue_url,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    MessageBody&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;json.dumps(payload),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    MessageGroupId&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;user-42&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,           &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 같은 group = 순서 보장&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    MessageDeduplicationId&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;unique-id&apos;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 5분 dedup 윈도우&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;같은 &lt;code&gt;MessageGroupId&lt;/code&gt; = 한 컨슈머가 순서대로 처리&lt;/li&gt;
&lt;li&gt;다른 &lt;code&gt;MessageGroupId&lt;/code&gt; = 병렬 처리 가능&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ContentBasedDeduplication&lt;/code&gt; 활성 시 body hash 로 자동 dedup&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;배치-처리&quot;&gt;배치 처리&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 최대 10개 한번에 전송 (비용 절감)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;entries &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Id&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;MessageBody&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: json.dumps(msg)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i, msg &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; enumerate&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(messages)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sqs.send_message_batch(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;QueueUrl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;queue_url, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Entries&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;entries)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SendMessageBatch&lt;/code&gt;: 최대 10개, 최대 256KB&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DeleteMessageBatch&lt;/code&gt;: 소비 후 일괄 삭제&lt;/li&gt;
&lt;li&gt;배치 API = 단건 대비 API 호출 최대 10배 절감&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;재시도-전략-설계&quot;&gt;재시도 전략 설계&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Recv[&quot;메시지 수신&quot;] --&gt; Process[&quot;처리&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Process --&gt;|&quot;성공&quot;| Delete[&quot;DeleteMessage&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Process --&gt;|&quot;실패&quot;| Retry{&quot;재시도 횟수\n&amp;#x3C; maxReceiveCount?&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Retry --&gt;|&quot;예&quot;| Timeout[&quot;visibility timeout 만료\n다시 visible&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Timeout --&gt; Recv&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Retry --&gt;|&quot;아니오&quot;| DLQ[&quot;DLQ 이동&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DLQ --&gt; Alert[&quot;CloudWatch Alarm\n운영자 알림&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Alert --&gt; Inspect[&quot;원인 분석&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Inspect --&gt; Redrive[&quot;StartMessageMoveTask\n(재처리)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;exponential backoff&lt;/strong&gt;: Lambda + SQS 조합에서 재시도 간격을 늘리려면 visibility timeout 을 처리에서 수동으로 늘림.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(event, context):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; record &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Records&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        receive_count &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(record[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;attributes&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ApproximateReceiveCount&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        try&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            process(record[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;body&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        except&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; RetryableError:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            # 재시도 횟수에 따라 timeout 연장 (backoff)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            backoff &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; **&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; receive_count &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;900&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 최대 15분&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            sqs.change_message_visibility(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;                QueueUrl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;QUEUE_URL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;                ReceiptHandle&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;record[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;receiptHandle&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;                VisibilityTimeout&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;backoff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            raise&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;모니터링--운영&quot;&gt;모니터링 / 운영&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;필수 CloudWatch 메트릭&lt;/strong&gt;:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;메트릭&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;의미&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;alarm 기준&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;ApproximateNumberOfMessages&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;큐 적체량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;임계값 초과 시&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;ApproximateAgeOfOldestMessage&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가장 오래된 메시지 age&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;처리 지연 탐지&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;NumberOfMessagesSent&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;발행량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;급감 시 producer 이상&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;NumberOfMessagesDeleted&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;처리 완료량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;급감 시 consumer 이상&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# DLQ alarm 예시 (CDK)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudwatch.Alarm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;this,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;DlqAlarm&apos;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  metric:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dlq.metricApproximateNumberOfMessagesVisible&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  threshold:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 1,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  evaluationPeriods:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 1,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  alarmDescription:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;DLQ 에 메시지 발생&apos;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sqs-vs-kafka-비교&quot;&gt;SQS vs Kafka 비교&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;SQS&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Kafka&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;운영 부담&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;0 (managed)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;클러스터 관리 필요&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;처리량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무한 (auto)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;노드 수 비례&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Retention&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;최대 14일&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무제한 (디스크)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Replay&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DLQ redrive 만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;consumer offset 자유 조정&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Fan-out&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;[[aws-sns]] 와 결합&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;consumer group&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;순서&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;FIFO group 안에서&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;partition 안에서&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;비용 구조&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;사용량 비례&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;인프라 비례&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;선택 기준&lt;/strong&gt;: AWS only + 단순 큐 + 운영 최소화 = SQS. 영속 + 재처리 + 대규모 throughput + 이벤트 스트리밍 = [[kafka]].&lt;/p&gt;
&lt;h2 id=&quot;비용&quot;&gt;비용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$0.40 / 백만 요청 (Standard)&lt;/li&gt;
&lt;li&gt;$0.50 / 백만 요청 (FIFO)&lt;/li&gt;
&lt;li&gt;첫 100만 요청/월 무료&lt;/li&gt;
&lt;li&gt;256KB 이상 메시지: 256KB 단위로 청구&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;비용 최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long polling (WaitTimeSeconds=20) 으로 빈 poll API 호출 최소화&lt;/li&gt;
&lt;li&gt;배치 전송/수신으로 API 호출 횟수 절감&lt;/li&gt;
&lt;li&gt;Lambda 이벤트 소스로 폴링 완전 위임&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;at-least-once 중복 처리&lt;/strong&gt;: Standard 큐에서 드물게 중복 발생. consumer 는 반드시 &lt;em&gt;idempotent&lt;/em&gt; 하게. [[idempotency-keys]] 패턴 활용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visibility timeout 너무 짧음&lt;/strong&gt;: 처리 도중 메시지가 다시 visible 되어 다른 컨슈머가 중복 처리.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DLQ 미설정&lt;/strong&gt;: 실패 메시지가 무한 재시도, 큐 처리 지연 전파.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FIFO 에서 MessageGroupId 없이 전송&lt;/strong&gt;: 모든 메시지가 단일 group = 단일 컨슈머 = 300 msg/s 한계.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;배치 Lambda 에서 전체 예외&lt;/strong&gt;: 일부 실패 시 batch 전체 재시도. &lt;code&gt;ReportBatchItemFailures&lt;/code&gt; 설정 필수.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
FIFO 큐 이름은 반드시 &lt;code&gt;.fifo&lt;/code&gt; suffix. 생성 후 변경 불가. 설계 단계에서 결정 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-sns]] - fan-out 조합 (SNS + SQS)&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge]] - 이벤트 기반 라우팅&lt;/li&gt;
&lt;li&gt;[[aws-lambda]] - 이벤트 소스로 자동 처리&lt;/li&gt;
&lt;li&gt;[[kafka]] - 대안 스트리밍 플랫폼&lt;/li&gt;
&lt;li&gt;[[message-broker-comparison]] - 브로커 비교&lt;/li&gt;
&lt;li&gt;[[idempotency-keys]] - 중복 처리 패턴&lt;/li&gt;
&lt;li&gt;[[outbox-pattern]] - DB + 큐 원자적 발행&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>sqs</category><category>queue</category><category>cloud</category><category>messaging</category><author>koa (김신건)</author></item><item><title>[AWS] STS / AssumeRole: 임시 자격, cross-account</title><link>https://shinkeonkim.com/wiki/cloud/aws-sts-assume-role/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-sts-assume-role/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;STS (Security Token Service)&lt;/strong&gt; = &lt;em&gt;임시 자격 증명 발급&lt;/em&gt;. short-lived (15분-12시간) credentials. 장기 access key 없이 안전하게 AWS 서비스에 접근.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;방법&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CI/CD에서 deploy&lt;/td&gt;&lt;td&gt;GitHub OIDC + AssumeRoleWithWebIdentity&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;멀티 계정 AWS 조직&lt;/td&gt;&lt;td&gt;Cross-account AssumeRole&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SaaS → 고객 계정 접근&lt;/td&gt;&lt;td&gt;AssumeRole + External ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EC2/Lambda에서 API 호출&lt;/td&gt;&lt;td&gt;Instance Profile (자동 갱신)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EKS Pod에서 S3, DynamoDB&lt;/td&gt;&lt;td&gt;IRSA (AssumeRoleWithWebIdentity)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MFA 필요 작업&lt;/td&gt;&lt;td&gt;GetSessionToken&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;회사 SSO 로그인&lt;/td&gt;&lt;td&gt;AssumeRoleWithSAML&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;5가지-api&quot;&gt;5가지 API&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;API&lt;/th&gt;&lt;th&gt;사용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;AssumeRole&lt;/code&gt;&lt;/td&gt;&lt;td&gt;IAM role assume&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;AssumeRoleWithWebIdentity&lt;/code&gt;&lt;/td&gt;&lt;td&gt;OIDC (EKS IRSA, GitHub OIDC)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;AssumeRoleWithSAML&lt;/code&gt;&lt;/td&gt;&lt;td&gt;SAML SSO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;GetSessionToken&lt;/code&gt;&lt;/td&gt;&lt;td&gt;MFA token&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;GetCallerIdentity&lt;/code&gt;&lt;/td&gt;&lt;td&gt;누구인지&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;세션-유효-시간&quot;&gt;세션 유효 시간&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;API&lt;/th&gt;&lt;th&gt;최소&lt;/th&gt;&lt;th&gt;최대&lt;/th&gt;&lt;th&gt;비고&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;AssumeRole&lt;/code&gt;&lt;/td&gt;&lt;td&gt;15분&lt;/td&gt;&lt;td&gt;12시간&lt;/td&gt;&lt;td&gt;role &lt;code&gt;MaxSessionDuration&lt;/code&gt; 설정 필요&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;AssumeRoleWithWebIdentity&lt;/code&gt;&lt;/td&gt;&lt;td&gt;15분&lt;/td&gt;&lt;td&gt;12시간&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;AssumeRoleWithSAML&lt;/code&gt;&lt;/td&gt;&lt;td&gt;15분&lt;/td&gt;&lt;td&gt;12시간&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;GetSessionToken&lt;/code&gt;&lt;/td&gt;&lt;td&gt;15분&lt;/td&gt;&lt;td&gt;36시간&lt;/td&gt;&lt;td&gt;MFA 필수 작업&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Role Chaining&lt;/td&gt;&lt;td&gt;15분&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1시간 고정&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;연장 불가&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;assumerole-흐름&quot;&gt;AssumeRole 흐름&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    autonumber&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant User&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant STS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant TargetRole&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant S3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;STS: AssumeRole(arn:role/admin)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over STS: 신뢰 관계 + 권한 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    STS--&gt;&gt;User: AccessKeyId, SecretAccessKey, SessionToken, Expiration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;S3: GET object (임시 credentials)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3--&gt;&gt;User: object&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over User: 1시간 후 만료&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;STS: AssumeRole 다시&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cross-account-assumerole&quot;&gt;Cross-Account AssumeRole&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Acct1[&quot;Account 1&amp;#x3C;br/&gt;(User alice)&quot;] --&gt;|AssumeRole| Acct2Role[&quot;Account 2&amp;#x3C;br/&gt;Role: data-reader&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Acct2Role --&gt;|trust policy| Trust[&quot;Principal: arn:aws:iam::1:user/alice&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Acct2Role --&gt;|permission| S3[&quot;S3 in Account 2&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;trust-policy-account-2-role&quot;&gt;Trust Policy (Account 2 role)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2012-10-17&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Effect&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Allow&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Principal&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;AWS&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:iam::ACCOUNT-1:root&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sts:AssumeRole&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Condition&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;StringEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;sts:ExternalId&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;shared-secret-string&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;em&gt;External ID&lt;/em&gt; 가 &lt;em&gt;confused deputy 공격&lt;/em&gt; 방어. SaaS 가 우리 계정 접근 시 &lt;em&gt;반드시&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;web-identity-oidc---github-actions&quot;&gt;Web Identity (OIDC) - GitHub Actions&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;permissions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  id-token&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;write&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;steps&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;aws-actions/configure-aws-credentials@v4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      role-to-assume&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:iam::123:role/github-actions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      aws-region&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;us-east-1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GitHub 의 OIDC token → AWS role assume. &lt;em&gt;long-term access key 없이&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant GH as &quot;GitHub Actions&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant OIDC as &quot;GitHub OIDC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant STS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant AWSOIDC as &quot;AWS OIDC Provider&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GH-&gt;&gt;OIDC: JWT token 요청&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OIDC--&gt;&gt;GH: OIDC token&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GH-&gt;&gt;STS: AssumeRoleWithWebIdentity&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    STS-&gt;&gt;AWSOIDC: token 검증&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AWSOIDC--&gt;&gt;STS: OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    STS--&gt;&gt;GH: 임시 credentials&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GH-&gt;&gt;STS: API 호출&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;eks-irsa-위와-동일&quot;&gt;EKS IRSA (위와 동일)&lt;/h2&gt;
&lt;p&gt;자세한 건 [[aws-eks]] 의 IRSA 절.&lt;/p&gt;
&lt;h2 id=&quot;saml-federation&quot;&gt;SAML Federation&lt;/h2&gt;
&lt;p&gt;기업 IdP (Okta, Active Directory, Azure AD) 로 로그인 후 AWS 콘솔, API 접근.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant User&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant IdP as &quot;Identity Provider&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant STS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Console as &quot;AWS Console&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;IdP: SSO 로그인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IdP--&gt;&gt;User: SAML assertion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;STS: AssumeRoleWithSAML&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    STS--&gt;&gt;User: 임시 credentials&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User-&gt;&gt;Console: 콘솔 접속&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trust policy 핵심 필드:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Principal&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;Federated&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:iam::123:saml-provider/MyIdP&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sts:AssumeRoleWithSAML&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Condition&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;StringEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;SAML:aud&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://signin.aws.amazon.com/saml&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;IdP에서 role ARN을 attribute로 매핑. 사용자가 IAM user 없이 AWS 접근 가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;instance-profile-ec2-lambda-ecs&quot;&gt;Instance Profile (EC2, Lambda, ECS)&lt;/h2&gt;
&lt;p&gt;인스턴스에 붙이는 IAM role. IMDS를 통해 credentials 자동 갱신 (만료 5분 전).&lt;/p&gt;
&lt;p&gt;Trust policy:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Principal&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Service&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ec2.amazonaws.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sts:AssumeRole&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;EC2 내부에서 현재 credentials 확인:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;TOKEN&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -sX&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; PUT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;http://169.254.169.254/latest/api/token&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -H&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -sH&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;X-aws-ec2-metadata-token: &lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$TOKEN&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  http://169.254.169.254/latest/meta-data/iam/security-credentials/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SDK 사용 시 credentials 명시 불필요. 자동 갱신.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;서비스&lt;/th&gt;&lt;th&gt;Principal&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;EC2&lt;/td&gt;&lt;td&gt;&lt;code&gt;ec2.amazonaws.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lambda&lt;/td&gt;&lt;td&gt;&lt;code&gt;lambda.amazonaws.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ECS Task&lt;/td&gt;&lt;td&gt;&lt;code&gt;ecs-tasks.amazonaws.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CodeBuild&lt;/td&gt;&lt;td&gt;&lt;code&gt;codebuild.amazonaws.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;role-chaining&quot;&gt;Role Chaining&lt;/h2&gt;
&lt;p&gt;A role이 B role을 assume. 세션 최대 1시간 고정 (MaxSessionDuration 무관).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User[&quot;개발자&quot;] --&gt;|&quot;AssumeRole&quot;| RoleA[&quot;Role A (개발 계정)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RoleA --&gt;|&quot;AssumeRole&quot;| RoleB[&quot;Role B (운영 계정)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RoleB --&gt; Limit[&quot;세션: 최대 1시간&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Role A credentials 로 Role B assume&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sts&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; assume-role&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:iam::PROD:role/deploy&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-session-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chain-session&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --duration-seconds&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3600&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
Role chaining 시 1시간 제한은 &lt;code&gt;MaxSessionDuration&lt;/code&gt; 과 무관. 12시간 설정해도 체인이면 1시간.
배포 파이프라인이 1시간 초과할 경우 재assume 로직 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;session-policy&quot;&gt;Session Policy&lt;/h2&gt;
&lt;p&gt;AssumeRole 시 &lt;em&gt;inline permission 추가 제한&lt;/em&gt;. role 권한 AND session policy = 실제 권한. 확대 불가.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sts&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; assume-role&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:role/x&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-session-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; session&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --policy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;Version&quot;: &quot;2012-10-17&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;Statement&quot;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Effect&quot;: &quot;Allow&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Action&quot;: &quot;s3:GetObject&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Resource&quot;: &quot;arn:aws:s3:::my-bucket/*&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CI/CD에서 최소 권한 세션 발급, 임시 작업자에게 제한된 권한 부여 시 유용.&lt;/p&gt;
&lt;h2 id=&quot;session-tags&quot;&gt;Session Tags&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sts&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; assume-role&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:role/x&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-session-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; session&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --tags&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Key=Team,Value=backend&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Condition&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;StringEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;aws:PrincipalTag/Team&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;backend&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;같은 role 의 &lt;em&gt;세션마다 다른 tag&lt;/em&gt; → &lt;em&gt;세분화 권한&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;감사-cloudtrail&quot;&gt;감사 (CloudTrail)&lt;/h2&gt;
&lt;p&gt;AssumeRole 이벤트는 CloudTrail에 자동 기록.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudtrail&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lookup-events&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --lookup-attributes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AttributeKey=EventName,AttributeValue=AssumeRole&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --max-results&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;주요 필드:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;필드&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;userIdentity.arn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;누가 assume 했는지&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;requestParameters.roleArn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;어느 role&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;requestParameters.externalId&lt;/code&gt;&lt;/td&gt;&lt;td&gt;External ID 사용 여부&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;responseElements.assumedRoleUser&lt;/code&gt;&lt;/td&gt;&lt;td&gt;결과 세션 ARN&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// CloudWatch Logs Insights 쿼리 예시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;filter&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;eventName = &apos;AssumeRole&apos;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;stats&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;count(*) by userIdentity.arn&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
비정상 cross-account assume 감지용 EventBridge 룰 설정 권장. 알 수 없는 Account → SNS 알림.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;session-강제-만료&quot;&gt;Session 강제 만료&lt;/h2&gt;
&lt;p&gt;침해된 role 세션을 즉각 무효화:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# DenyAll inline policy 추가 (토큰 발급 시간 이전 세션 차단)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-role-policy&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compromised-role&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --policy-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AWSRevokeOlderSessions&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --policy-document&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;Version&quot;: &quot;2012-10-17&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;Statement&quot;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Effect&quot;: &quot;Deny&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Action&quot;: &quot;*&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Resource&quot;: &quot;*&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Condition&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;DateLessThan&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          &quot;aws:TokenIssueTime&quot;: &quot;2026-07-16T12:00:00Z&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 정리 후 삭제&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iam&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; delete-role-policy&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --role-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compromised-role&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --policy-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AWSRevokeOlderSessions&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;STS session 자체는 만료 전 취소 불가. 이 방식으로 &lt;em&gt;실질적 무효화&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;External ID 누락&lt;/strong&gt; = 3rd party 신뢰 약함.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;장기 access key 와 혼용&lt;/strong&gt; = role 의 의미 깨짐.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;세션 만료 갱신 안 함&lt;/strong&gt; = 1시간 후 API 호출 실패. SDK 의 &lt;em&gt;자동 refresh&lt;/em&gt; 확인.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;trust policy 의 너무 넓은 Principal&lt;/strong&gt; = 모든 user 가 assume.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Role Chaining 1시간 제한 간과&lt;/strong&gt; = 배포 파이프라인이 1시간 넘으면 자동 실패. 재assume 로직 추가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCP가 AssumeRole 차단&lt;/strong&gt; = OU 레벨 SCP 에서 &lt;code&gt;sts:AssumeRole&lt;/code&gt; 거부 정책 확인 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;세션 tag 상속 누락&lt;/strong&gt; = &lt;code&gt;TransitiveTagKeys&lt;/code&gt; 지정 안 하면 chaining 시 tag 사라짐.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-iam]]&lt;/li&gt;
&lt;li&gt;[[oauth2]]&lt;/li&gt;
&lt;li&gt;[[github-actions]]&lt;/li&gt;
&lt;li&gt;[[aws-eks]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail]]&lt;/li&gt;
&lt;li&gt;[[saml]]&lt;/li&gt;
&lt;li&gt;[[openid-connect]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>sts</category><category>assume-role</category><category>iam</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] VPC: subnet, route, NAT, peering</title><link>https://shinkeonkim.com/wiki/cloud/aws-vpc/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-vpc/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;VPC (Virtual Private Cloud)&lt;/strong&gt; = AWS 안의 &lt;em&gt;논리적 격리 네트워크&lt;/em&gt;. CIDR 정의 + subnet 분할 + 라우팅. AWS 리소스를 격리된 네트워크에 배치.&lt;/p&gt;
&lt;h2 id=&quot;구조&quot;&gt;구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VPC[&quot;VPC (10.0.0.0/16)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VPC --&gt; AZa[&quot;AZ ap-northeast-2a&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VPC --&gt; AZb[&quot;AZ ap-northeast-2c&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AZa --&gt; PubA[&quot;Public Subnet\n10.0.1.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AZa --&gt; PrvA[&quot;Private Subnet\n10.0.10.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AZb --&gt; PubB[&quot;Public Subnet\n10.0.2.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AZb --&gt; PrvB[&quot;Private Subnet\n10.0.20.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PubA --&gt; IGW[&quot;Internet Gateway\n(양방향 인터넷)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PubB --&gt; IGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PrvA --&gt; NATA[&quot;NAT Gateway\n(AZ-a)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PrvB --&gt; NATB[&quot;NAT Gateway\n(AZ-c)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NATA --&gt; PubA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NATB --&gt; PubB&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;subnet-종류&quot;&gt;Subnet 종류&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;종류&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;정의&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;용도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Public&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;route table 에 IGW 항목 있음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ALB, Bastion, NAT GW&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Private&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;IGW 없음, NAT GW 경유&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2, EKS node, RDS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Isolated&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;외부 route 전혀 없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DB, 내부 서비스&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;route-table&quot;&gt;Route Table&lt;/h2&gt;
&lt;p&gt;subnet 별로 route table 연결. 규칙은 가장 구체적인 prefix 가 우선.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Public subnet route table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Destination       Target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;10.0.0.0/16       local          # VPC 내부 통신&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0.0.0.0/0         igw-xxx        # 인터넷&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Private subnet route table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Destination       Target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;10.0.0.0/16       local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0.0.0.0/0         nat-xxx        # NAT 경유 아웃바운드&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;192.168.0.0/16    pcx-xxx        # VPC Peering 대상&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;10.1.0.0/16       tgw-xxx        # Transit Gateway&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;nat-gateway-vs-nat-instance&quot;&gt;NAT Gateway vs NAT Instance&lt;/h2&gt;
&lt;p&gt;아웃바운드 전용 인터넷 접근 (private subnet → 인터넷).&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;NAT Gateway&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;NAT Instance&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;관리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;사용자&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;가격&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;비쌈 (시간당 $0.059 + GB당 $0.059)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2 온디맨드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;가용성&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AZ 별 redundant&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2 단일 장애점&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;처리량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;최대 100 Gbps 자동 확장&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2 type 한정&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;SG 적용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;불가&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
NAT Gateway 비용이 VPC 의 가장 큰 함정. GB 당 비용 + 시간당 비용 누적. S3/DynamoDB 는 VPC Endpoint 로 반드시 우회.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;vpc-endpoint&quot;&gt;VPC Endpoint&lt;/h2&gt;
&lt;p&gt;Private subnet 에서 AWS 서비스를 인터넷 없이 접근.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pod[&quot;Private Subnet EC2&quot;] -.-&gt;|&quot;NAT Gateway\n$$ 비용 발생&quot;| NAT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NAT --&gt; S3[&quot;S3&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pod --&gt;|&quot;VPC Endpoint\n무료 + 빠름&quot;| S3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;종류&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;대상&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;비용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Gateway Endpoint&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;S3, DynamoDB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Interface Endpoint&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;대부분의 AWS 서비스&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;시간당 + 처리량 비용&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Gateway Endpoint 추가만으로 S3/DynamoDB 트래픽이 NAT 우회 + 무료. 모든 VPC 에 기본 추가.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;connectivity-옵션&quot;&gt;Connectivity 옵션&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;옵션&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;방향&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;용도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Internet Gateway (IGW)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;양방향&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;public subnet 인터넷&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;NAT Gateway&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;아웃바운드만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;private → 인터넷&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;VPC Peering&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;양방향&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1:1 VPC 연결 (same/cross account)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Transit Gateway&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;양방향&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Hub-spoke, 다수 VPC + on-prem&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Site-to-Site VPN&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;양방향&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;on-prem 연결 (암호화)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Direct Connect&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;양방향&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;전용 회선, 대역폭 보장&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;VPC Endpoint (PrivateLink)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;단방향&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 서비스 / SaaS&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OnPrem[&quot;On-Premises&quot;] --&gt;|&quot;Direct Connect\n(전용 회선)&quot;| DX[&quot;DX Location&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DX --&gt; VGW[&quot;Virtual Private Gateway&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OnPrem --&gt;|&quot;Site-to-Site VPN&quot;| VGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VGW --&gt; VPC1[&quot;VPC 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    TGW[&quot;Transit Gateway&quot;] --&gt; VPC1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    TGW --&gt; VPC2[&quot;VPC 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    TGW --&gt; VPC3[&quot;VPC 3&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VGW --&gt; TGW&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;vpc-peering-vs-transit-gateway&quot;&gt;VPC Peering vs Transit Gateway&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;VPC Peering&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Transit Gateway&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;연결 수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1:1&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;N:N (hub-spoke)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;전이적 라우팅&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;불가&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;비용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;데이터 전송만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;시간당 + 처리량&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;교차 계정&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;교차 리전&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;2-3개 VPC&lt;/strong&gt; = Peering 충분. &lt;strong&gt;4개 이상 또는 온프레미스 연결&lt;/strong&gt; = Transit Gateway.&lt;/p&gt;
&lt;h2 id=&quot;security-group-vs-nacl&quot;&gt;Security Group vs NACL&lt;/h2&gt;
&lt;p&gt;자세한 비교는 [[aws-sg-vs-nacl]].&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Security Group&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;NACL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;계층&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Stateful&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Stateless&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;적용 대상&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ENI / instance&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Subnet&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;규칙 종류&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;allow 만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;allow + deny&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;기본 동작&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;deny all (inbound)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;allow all&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;규칙 평가&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;모든 규칙 OR&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;번호 순서대로&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;ipv4-cidr-설계&quot;&gt;IPv4 CIDR 설계&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;RFC 1918 사설 대역&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;10.0.0.0/8        크고 광범위 (AWS 기업 권장)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;172.16.0.0/12     중간&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;192.168.0.0/16    작음 (홈/소규모)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;권장 VPC CIDR: /16 (65,534 IP)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;권장 Subnet CIDR: /24 (254 IP)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;IPAM (IP Address Manager)&lt;/strong&gt;: AWS Organizations 전체의 CIDR 충돌 방지 중앙 관리.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
VPC 의 CIDR 충돌이 peering / Transit Gateway 의 가장 큰 함정. 한번 생성한 VPC CIDR 는 변경 불가. Organization 차원에서 사전 IPAM 계획 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;비용&quot;&gt;비용&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;요금&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;VPC 생성&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;IGW&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;NAT Gateway&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.059/시간 + $0.059/GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;VPC Peering 데이터&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AZ 간 $0.01/GB, 리전 간 표준 요금&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Transit Gateway&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.05/attachment/시간 + $0.02/GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Interface Endpoint&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.01/시간/AZ + $0.01/GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Gateway Endpoint&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무료&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;NAT Gateway 비용 최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;S3, DynamoDB → Gateway Endpoint 로 대체&lt;/li&gt;
&lt;li&gt;ECR → Interface Endpoint (대용량 이미지 pull 시 효과적)&lt;/li&gt;
&lt;li&gt;단일 AZ 테스트 환경에서는 NAT Instance 고려&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;vpc-flow-logs&quot;&gt;VPC Flow Logs&lt;/h2&gt;
&lt;p&gt;VPC 내 모든 ENI 트래픽 기록. 보안 감사, 트래픽 분석, 침해 탐지.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# VPC 수준 Flow Log 활성화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-flow-logs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --resource-type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; VPC&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --resource-ids&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vpc-xxx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --traffic-type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ALL&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --log-destination-type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloud-watch-logs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --log-group-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /vpc/flow-logs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --deliver-logs-permission-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:iam::123:role/flow-log-role&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;로그 필드&lt;/strong&gt; (기본): version, account-id, interface-id, srcaddr, dstaddr, srcport, dstport, protocol, packets, bytes, start, end, action (ACCEPT/REJECT), log-status.&lt;/p&gt;
&lt;p&gt;Flow Log 를 S3 에 저장 후 Athena 로 쿼리 가능 (대용량 분석).&lt;/p&gt;
&lt;h2 id=&quot;설계-패턴&quot;&gt;설계 패턴&lt;/h2&gt;
&lt;h3 id=&quot;3-tier-아키텍처&quot;&gt;3-tier 아키텍처&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Internet[&quot;인터넷&quot;] --&gt; IGW[&quot;Internet Gateway&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IGW --&gt; PubSubnet[&quot;Public Subnet\nALB / Bastion / NAT GW&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PubSubnet --&gt; AppSubnet[&quot;Private Subnet (App)\nEC2 / ECS / EKS Node&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AppSubnet --&gt; DBSubnet[&quot;Isolated Subnet (DB)\nRDS / ElastiCache&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;원칙&lt;/strong&gt;: 외부 접근이 필요한 것만 Public. 앱 서버는 Private. DB 는 인터넷 접근 완전 차단.&lt;/p&gt;
&lt;h3 id=&quot;multi-account-설계&quot;&gt;Multi-Account 설계&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Organization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── 네트워크 계정 (Transit Gateway 허브)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── TGW ← 모든 VPC 연결&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── 프로덕션 계정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── VPC (10.0.0.0/16) → TGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── 스테이징 계정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── VPC (10.1.0.0/16) → TGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── 개발 계정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── VPC (10.2.0.0/16) → TGW&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;AWS Organizations + RAM (Resource Access Manager)&lt;/strong&gt; 로 TGW 를 여러 계정에 공유.&lt;/p&gt;
&lt;h2 id=&quot;privatelink&quot;&gt;PrivateLink&lt;/h2&gt;
&lt;p&gt;자체 서비스를 VPC 내에서 비공개로 제공. 인터넷 경유 없이 다른 VPC 또는 계정에 서비스 노출.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ConsumerVPC[&quot;소비자 VPC&quot;] --&gt;|&quot;Interface Endpoint&quot;| PL[&quot;AWS PrivateLink&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PL --&gt; NLB[&quot;NLB (공급자 VPC)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NLB --&gt; Service[&quot;내부 서비스&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;SaaS 공급자: 고객 VPC 에 endpoint 서비스 제공&lt;/li&gt;
&lt;li&gt;내부 공유 서비스: 여러 팀 VPC 에서 중앙 API 접근&lt;/li&gt;
&lt;li&gt;AWS 서비스 (ECR, SSM, Secrets Manager 등) 비공개 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;NAT Gateway 비용 폭증&lt;/strong&gt;: GB 당 과금. S3 endpoint 미설정 시 대규모 비용. 예산 alarm 설정 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단일 AZ NAT&lt;/strong&gt;: AZ 장애 시 해당 AZ private subnet 전체 아웃바운드 차단. AZ 별 NAT 권장.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CIDR 너무 작음&lt;/strong&gt;: EKS pod IP 고갈. /16 이상 권장. 서브넷은 secondary CIDR 로 확장 가능.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public subnet 에 DB 배치&lt;/strong&gt;: 보안 모델 오류. DB 는 Private/Isolated 에 배치.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NACL 에서 임시 포트 block&lt;/strong&gt;: stateless 이므로 응답 트래픽 허용 규칙 별도 필요 (1024-65535).&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
VPC 삭제는 내부 리소스 모두 삭제. 기본 VPC 수정 후 복구 어려움. 기본 VPC 를 그대로 사용하지 않고 전용 VPC 설계 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-sg-vs-nacl]] - 보안 그룹 vs NACL 상세 비교&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb]] - 로드밸런서 (public subnet 배치)&lt;/li&gt;
&lt;li&gt;[[network-cidr-subnetting]] - CIDR 서브넷 계산&lt;/li&gt;
&lt;li&gt;[[aws-route53]] - DNS (Route 53 Resolver for VPC)&lt;/li&gt;
&lt;li&gt;[[aws-eks]] - VPC CNI, pod IP 설계&lt;/li&gt;
&lt;li&gt;[[aws-privatelink]] - PrivateLink 서비스&lt;/li&gt;
&lt;li&gt;[[aws-direct-connect]] - 전용 회선 연결&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>vpc</category><category>network</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[Container] OCI Image: spec, manifest, layer 표준</title><link>https://shinkeonkim.com/wiki/cloud/oci-image/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/oci-image/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;OCI (Open Container Initiative)&lt;/strong&gt; = &lt;em&gt;컨테이너 표준&lt;/em&gt; (Linux Foundation, 2015). &lt;em&gt;image format + runtime + distribution&lt;/em&gt; 3가지 spec.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;핵심 개념&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;멀티 아키 이미지 빌드 (AMD64 + ARM64)&lt;/td&gt;&lt;td&gt;Image Index, BuildKit + QEMU&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;이미지 공급망 보안&lt;/td&gt;&lt;td&gt;Cosign 서명, SBOM&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;이미지 경량화&lt;/td&gt;&lt;td&gt;Dockerfile 레이어 최적화&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;취약점 스캔 자동화&lt;/td&gt;&lt;td&gt;Trivy, Grype&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Registry 비용 최적화&lt;/td&gt;&lt;td&gt;Lifecycle Policy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Docker 외 런타임 사용 (K8s, K3s)&lt;/td&gt;&lt;td&gt;containerd, CRI-O&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;3개-oci-spec&quot;&gt;3개 OCI Spec&lt;/h2&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Spec&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Image&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;tarball + JSON metadata 구조&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;runc&lt;/code&gt; 같은 &lt;em&gt;컨테이너 실행 표준&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Distribution&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docker push/pull&lt;/code&gt; 같은 &lt;em&gt;레지스트리 API&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;image-구조&quot;&gt;Image 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;manifest.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - config.json (image config)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - layer0.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - layer1.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - layer2.tar.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Idx[&quot;Image Index (멀티 아키)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Idx --&gt; Mfst_amd64[&quot;Manifest amd64&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Idx --&gt; Mfst_arm64[&quot;Manifest arm64&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mfst_amd64 --&gt; Cfg_a[&quot;Config JSON&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mfst_amd64 --&gt; L1_a[&quot;Layer tarball 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mfst_amd64 --&gt; L2_a[&quot;Layer tarball 2&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;image-index-멀티-아키&quot;&gt;Image Index (멀티 아키)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;schemaVersion&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;manifests&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.manifest.v1+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;digest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sha256:abc...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;platform&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;os&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;linux&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;architecture&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;amd64&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.manifest.v1+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;digest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sha256:def...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;platform&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;os&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;linux&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;architecture&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arm64&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;한 tag (nginx:1.27)&lt;/em&gt; 으로 &lt;em&gt;여러 아키&lt;/em&gt; 자동 선택. pull 시 &lt;em&gt;클라이언트 아키 매칭&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;manifest&quot;&gt;Manifest&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;schemaVersion&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;config&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.config.v1+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;digest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sha256:abc...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;layers&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.layer.v1.tar+gzip&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;digest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sha256:111...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.layer.v1.tar+gzip&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;digest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sha256:222...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;image-vs-oci-artifact&quot;&gt;Image vs OCI Artifact&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OCI[&quot;OCI Distribution&quot;] --&gt; Image[&quot;OCI Image (전통 컨테이너)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OCI --&gt; Artifact[&quot;OCI Artifact (임의 데이터)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Artifact --&gt; Helm[Helm chart]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Artifact --&gt; WASM[WebAssembly]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Artifact --&gt; SBOM[SBOM]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Artifact --&gt; Sig[&quot;Cosign signature&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;OCI registry 가 &lt;em&gt;컨테이너 image 만이 아닌&lt;/em&gt; 일반 artifact store&lt;/em&gt; 로 진화. Helm chart, WASM, SBOM, signature 모두.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;구현체&quot;&gt;구현체&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;runc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;OCI Runtime 의 표준 구현&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;containerd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;container 라이프사이클 (Docker / K8s 가 사용)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;CRI-O&lt;/code&gt;&lt;/td&gt;&lt;td&gt;K8s 전용 OCI runtime&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;podman&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Docker 호환, daemonless&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;buildah&lt;/code&gt;&lt;/td&gt;&lt;td&gt;image build 전용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;skopeo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;image 복사 / 검사&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;content-addressed-storage&quot;&gt;Content-Addressed Storage&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;image digest = sha256(manifest JSON)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;layer digest = sha256(layer tarball)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;tag&lt;/em&gt; 는 &lt;em&gt;변할 수&lt;/em&gt; 있지만 &lt;em&gt;digest&lt;/em&gt; 는 &lt;em&gt;불변&lt;/em&gt;. &lt;em&gt;프로덕션 배포&lt;/em&gt; 는 항상 &lt;em&gt;digest&lt;/em&gt; 로:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;nginx:1.27                            # tag (mutable)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;nginx@sha256:abc123...                # digest (immutable)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dockerfile-레이어-최적화&quot;&gt;Dockerfile 레이어 최적화&lt;/h2&gt;
&lt;p&gt;레이어는 캐시됨. 변경 빈도 낮은 것을 위에.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 잘못된 순서 (매번 deps 재설치)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:20-alpine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 올바른 순서 (package.json 변경 없으면 캐시 재사용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:20-alpine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm ci --only=production&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 멀티스테이지: 빌드 산출물만 최종 이미지에 포함&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:20-alpine &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; builder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm ci&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm run build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:20-alpine &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; runner&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=builder /app/dist ./dist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=builder /app/node_modules ./node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CMD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;dist/index.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;레이어 크기 확인:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; history&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dive&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:latest&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # dive 툴로 레이어별 상세 분석&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;buildkit--qemu-멀티-아키-빌드&quot;&gt;BuildKit + QEMU (멀티 아키 빌드)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# buildx + QEMU 설치&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; buildx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; multi-arch&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --driver&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-container&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --use&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --privileged&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --rm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tonistiigi/binfmt&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; all&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# AMD64 + ARM64 동시 빌드 + push&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; buildx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --platform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; linux/amd64,linux/arm64&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --tag&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myregistry/myapp:1.0.0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --push&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CI/CD (GitHub Actions) 에서:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;docker/setup-qemu-action@v3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;docker/setup-buildx-action@v3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;docker/build-push-action@v6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    platforms&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;linux/amd64,linux/arm64&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    tags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;myregistry/myapp:${{ github.sha }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    cache-from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;type=gha&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    cache-to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;type=gha,mode=max&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;image-취약점-스캔-trivy&quot;&gt;Image 취약점 스캔 (Trivy)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 이미지 스캔&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;trivy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --severity&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; HIGH,CRITICAL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx:1.27&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CI에서 CRITICAL 발견 시 실패&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;trivy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --exit-code&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --severity&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CRITICAL&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --ignore-unfixed&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SBOM 출력&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;trivy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --format&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cyclonedx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom.json&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Build[&quot;docker build&quot;] --&gt; Scan[&quot;trivy scan&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Scan --&gt; Pass{결과}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pass --&gt;|&quot;CRITICAL 없음&quot;| Push[&quot;registry push&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Pass --&gt;|&quot;CRITICAL 발견&quot;| Fail[&quot;빌드 실패&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cosign-이미지-서명&quot;&gt;Cosign 이미지 서명&lt;/h2&gt;
&lt;p&gt;공급망 보안. 이미지 무결성, 출처 검증.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# keyless 서명 (OIDC 기반, Sigstore)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cosign&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sign&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --yes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  myregistry/myapp@sha256:abc123...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 검증&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cosign&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; verify&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --certificate-identity-regexp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;https://github.com/myorg/myrepo/.*&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --certificate-oidc-issuer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://token.actions.githubusercontent.com&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  myregistry/myapp:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GitHub Actions에서 자동 서명:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sigstore/cosign-installer@v3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Sign image&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  env&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    COSIGN_EXPERIMENTAL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  run&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    cosign sign --yes ${{ env.REGISTRY }}/${{ env.IMAGE }}@${{ steps.build.outputs.digest }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;keyless 서명은 private key 관리 불필요. OIDC token으로 Fulcio CA가 단기 인증서 발급.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;sbom-software-bill-of-materials&quot;&gt;SBOM (Software Bill of Materials)&lt;/h2&gt;
&lt;p&gt;이미지에 포함된 소프트웨어 목록. 취약점 추적, 규정 준수.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# syft로 SBOM 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;syft&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:latest&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cyclonedx-json&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;syft&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:latest&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; spdx-json&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom.spdx.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SBOM을 OCI Artifact로 registry에 첨부&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cosign&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; attach&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --sbom&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom.json&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  myregistry/myapp@sha256:abc123...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Grype로 SBOM 기반 취약점 스캔&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;grype&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom:sbom.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;registry-lifecycle-policy-ecr-예시&quot;&gt;Registry Lifecycle Policy (ECR 예시)&lt;/h2&gt;
&lt;p&gt;오래된 이미지 자동 삭제로 스토리지 비용 절감.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;rules&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;rulePriority&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;30일 이상 된 untagged 이미지 삭제&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;selection&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;tagStatus&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;untagged&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;countType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sinceImagePushed&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;countUnit&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;days&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;countNumber&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;expire&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;rulePriority&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;최근 10개 tagged 이미지 유지&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;selection&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;tagStatus&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;tagged&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;tagPrefixList&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;v&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;countType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;imageCountMoreThan&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;countNumber&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;expire&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tag mutability&lt;/strong&gt; = 어제 build 한 image 가 &lt;em&gt;오늘 다른 내용&lt;/em&gt;. digest pinning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image scan 누락&lt;/strong&gt; = 취약점 image. Trivy / Grype / Clair.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-arch test 안 함&lt;/strong&gt; = AMD64 만 build → ARM 노드 실패.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layer 너무 많음&lt;/strong&gt; = layer 한도 (보통 127). 가능하면 묶기.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;root로 실행&lt;/strong&gt; = Dockerfile 에 &lt;code&gt;USER nonroot&lt;/code&gt; 없으면 컨테이너가 root 권한으로 실행. 보안 위험.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;base image 업데이트 안 함&lt;/strong&gt; = OS 취약점 방치. 정기 &lt;code&gt;FROM ubuntu:24.04&lt;/code&gt; 재빌드.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;빌드 시 secrets 레이어에 남음&lt;/strong&gt; = &lt;code&gt;RUN --mount=type=secret&lt;/code&gt; 사용. ENV로 비밀 전달 금지.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SBOM/서명 없는 배포&lt;/strong&gt; = K8s Policy (Kyverno) 로 서명 없는 이미지 배포 차단 권장.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[docker]]&lt;/li&gt;
&lt;li&gt;[[cgroups-namespaces]]&lt;/li&gt;
&lt;li&gt;[[container-image-best-practices]]&lt;/li&gt;
&lt;li&gt;[[k8s-pod]]&lt;/li&gt;
&lt;li&gt;[[k8s-architecture]]&lt;/li&gt;
&lt;li&gt;[[vm-vs-container]]&lt;/li&gt;
&lt;li&gt;[[aws-ecr]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>oci</category><category>container</category><category>docker</category><category>image</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[IaC] AWS CDK: TypeScript 로 CloudFormation 생성</title><link>https://shinkeonkim.com/wiki/cloud/cdk/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/cdk/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS CDK&lt;/strong&gt; = &lt;em&gt;TS/Python/Java/Go 로 AWS 인프라 정의&lt;/em&gt; → &lt;em&gt;CloudFormation&lt;/em&gt; 으로 컴파일 → 배포. AWS 전용 IaC 도구.&lt;/p&gt;
&lt;p&gt;[[aws-cloudformation|CloudFormation]] YAML 을 직접 쓰는 대신 프로그래밍 언어로 인프라를 선언. 타입 안전성, 추상화, 재사용, 테스트 가능.&lt;/p&gt;
&lt;h2 id=&quot;흐름&quot;&gt;흐름&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Code[&quot;TypeScript / Python\n(CDK App)&quot;] --&gt; Synth[&quot;cdk synth\n(CFN template 생성)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Synth --&gt; Diff[&quot;cdk diff\n(변경 미리보기)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Diff --&gt; Deploy[&quot;cdk deploy\n(CloudFormation 호출)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Deploy --&gt; CFN[&quot;CloudFormation Stack&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CFN --&gt; AWS[&quot;AWS Resources&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;construct-level-l1-l2-l3&quot;&gt;Construct Level (L1, L2, L3)&lt;/h2&gt;
&lt;p&gt;CDK 의 핵심 추상화 단위는 &lt;em&gt;Construct&lt;/em&gt;. 3단계 레벨로 분류.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Level&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;이름&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;의미&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;L1&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CloudFormation Resources&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CFN 그대로, 자동 생성&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;CfnBucket&lt;/code&gt;, &lt;code&gt;CfnFunction&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;L2&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Curated Constructs&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;추상화 + 기본값 제공&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;Bucket&lt;/code&gt;, &lt;code&gt;Function&lt;/code&gt;, &lt;code&gt;Table&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;L3&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Patterns&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;합성 (여러 L2 묶음)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;LoadBalancedFargateService&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L3[&quot;L3 Pattern\nLoadBalancedFargateService&quot;] --&gt; L2a[&quot;L2 Construct\nApplicationLoadBalancer&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L3 --&gt; L2b[&quot;L2 Construct\nFargateService&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L2a --&gt; L1a[&quot;L1 CfnLoadBalancer&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L2b --&gt; L1b[&quot;L1 CfnService&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L1a --&gt; CFN[&quot;CloudFormation Resource&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L1b --&gt; CFN&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;예시-s3--lambda&quot;&gt;예시: S3 + Lambda&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MyStack&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Stack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;scope&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Construct&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; StackProps&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    super&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(scope, id, props);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; bucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Data&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      versioned: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      encryption: BucketEncryption.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;KMS_MANAGED&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      removalPolicy: RemovalPolicy.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;RETAIN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Processor&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      runtime: Runtime.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;NODEJS_22_X&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      handler: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;index.handler&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      code: Code.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;fromAsset&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;lambda&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      environment: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        BUCKET_NAME: bucket.bucketName,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // IAM 자동 생성: bucket policy + role + policy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    bucket.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;grantReadWrite&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(fn);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;bucket.grantReadWrite(fn)&lt;/code&gt; 한 줄 = bucket resource policy + Lambda IAM role + policy 연결 자동. 가장 강력한 추상화.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;l3-패턴-예시-alb--fargate&quot;&gt;L3 패턴 예시: ALB + Fargate&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ApplicationLoadBalancedFargateService&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Service&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cluster,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  taskImageOptions: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    image: ContainerImage.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;fromRegistry&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;nginx:latest&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    containerPort: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  desiredCount: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  cpu: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;256&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  memoryLimitMiB: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;512&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  publicLoadBalancer: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ALB + Target Group + Fargate Task Definition + ECS Service + Security Group + IAM Role 을 한 번에 생성.&lt;/p&gt;
&lt;h2 id=&quot;cdk-명령&quot;&gt;CDK 명령&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; app&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --language=typescript&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 프로젝트 초기화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bootstrap&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                         # CDK metadata bucket 생성 (account+region 당 1회)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; synth&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                             # CFN template 생성 (cdk.out/)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; diff&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                              # 현재 배포 vs 변경 예정 diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; deploy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MyStack&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                    # 배포&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; deploy&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --all&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                      # 전체 stack 배포&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; destroy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MyStack&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                   # 삭제&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cdk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ls&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                                # stack 목록&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;aspects-전체-적용-정책&quot;&gt;Aspects: 전체 적용 정책&lt;/h2&gt;
&lt;p&gt;Aspect = CDK tree 를 순회하며 모든 construct 에 적용하는 visitor.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; EnforceEncryption&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; implements&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; IAspect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  visit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; IConstruct&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (node &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;instanceof&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; CfnBucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      node.bucketEncryption &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        serverSideEncryptionConfiguration: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          serverSideEncryptionByDefault: { sseAlgorithm: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;AES256&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 앱 전체에 적용&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Aspects.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(app).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; EnforceEncryption&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;: 전사 보안 정책 강제, 태그 자동 추가, cost center 라벨링.&lt;/p&gt;
&lt;h2 id=&quot;snapshot-테스트&quot;&gt;Snapshot 테스트&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;snapshot&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; App&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MyStack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(app, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;TestStack&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; template&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Template.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;fromStack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(stack);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 특정 리소스 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  template.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;hasResourceProperties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;AWS::S3::Bucket&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VersioningConfiguration: { Status: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Enabled&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 전체 스냅샷 (변경 추적)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  expect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(template.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toJSON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;CI 에 스냅샷 테스트 필수. 의도치 않은 인프라 변경을 PR 단계에서 캐치.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;cdk-vs-terraform-vs-pulumi&quot;&gt;CDK vs Terraform vs Pulumi&lt;/h2&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;CDK&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Terraform&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Pulumi&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;언어&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;TS/Python/Java/Go&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;HCL&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;TS/Python/Go/C#&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Multi-cloud&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 위주&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;예&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;예&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;State&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CFN managed&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;별도 backend&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Pulumi Cloud&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;추상화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;L1/L2/L3&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;provider&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;코드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;타입 안전성&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;완전 (TS)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한적&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;완전&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;테스트&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;jest / pytest&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;terratest&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;언어 내장&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;AWS 새 서비스 대응&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;즉시&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;provider 업데이트 필요&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;provider 업데이트 필요&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;학습 곡선&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 잘 알면 낮음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;HCL 별도 학습&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;코드 자유도 높음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;판단 기준&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS-only + 개발자 친화성 + 타입 안전성 → CDK&lt;/li&gt;
&lt;li&gt;Multi-cloud + 인프라 팀 중심 → Terraform&lt;/li&gt;
&lt;li&gt;Multi-cloud + 완전한 프로그래밍 언어 → Pulumi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;custom-construct-패턴&quot;&gt;Custom Construct 패턴&lt;/h2&gt;
&lt;p&gt;재사용 가능한 인프라 패턴을 Construct 로 추상화.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 재사용 가능한 Lambda + SQS Construct&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; WorkerConstruct&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Construct&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; readonly&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Queue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; readonly&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;scope&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Construct&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;handler&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    super&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(scope, id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.queue &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Queue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Queue&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      visibilityTimeout: cdk.Duration.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;seconds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.fn &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Worker&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      runtime: Runtime.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;NODEJS_22_X&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      handler: props.handler,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      code: Code.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;fromAsset&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;lambda&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.fn.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addEventSource&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; SqsEventSource&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.queue, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      batchSize: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      reportBatchItemFailures: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 사용: 두 줄로 SQS + Lambda 구성 완료&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; worker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; WorkerConstruct&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ImageProcessor&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  handler: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;image.handler&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;pipelines-cicd&quot;&gt;Pipelines (CI/CD)&lt;/h2&gt;
&lt;p&gt;CDK Pipelines = 코드로 선언한 배포 파이프라인.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; pipeline&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; CodePipeline&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Pipeline&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  pipelineName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;MyPipeline&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  synth: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ShellStep&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Synth&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    input: CodePipelineSource.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gitHub&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;org/repo&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;main&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    commands: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;npm ci&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;npx cdk synth&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 스테이지 추가&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pipeline.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;addStage&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MyAppStage&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Prod&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  env: { account: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;123&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, region: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ap-northeast-2&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}));&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;self-mutating&lt;/strong&gt;: pipeline 자체도 코드에서 관리. 파이프라인 정의 변경 시 자동 업데이트.&lt;/p&gt;
&lt;h2 id=&quot;cdk-for-terraform-cdktf&quot;&gt;CDK for Terraform (cdktf)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MyStack&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; TerraformStack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;scope&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; App&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    super&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(scope, id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; S3Bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;data&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, { bucket: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;myapp-data&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CDK 의 언어 (TS/Python) + Terraform 의 multi-cloud backend. HashiCorp 와 협력.&lt;/p&gt;
&lt;h2 id=&quot;비용&quot;&gt;비용&lt;/h2&gt;
&lt;p&gt;CDK 자체는 무료. 생성되는 AWS 리소스 요금 + bootstrap bucket (S3) 비용.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;비용 최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cdk deploy --hotswap&lt;/code&gt;: Lambda / ECS 변경을 CFN 대신 직접 배포 (개발 속도 향상)&lt;/li&gt;
&lt;li&gt;bootstrap bucket 의 오래된 asset 주기적 정리&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cdk diff&lt;/code&gt; 로 불필요한 replacement 사전 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cdk bootstrap&lt;/code&gt; 누락&lt;/strong&gt;: account+region 당 1회 필요. CI/CD 파이프라인에서 첫 실행 시 실패.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CFN limit 500 resource&lt;/strong&gt;: 대형 stack 은 Nested stack 으로 분리.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDK Asset S3 누적&lt;/strong&gt;: bootstrap bucket 에 Lambda zip 등 asset 누적. 정기 정리 또는 lifecycle 설정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L2 기본값 함정&lt;/strong&gt;: &lt;code&gt;Bucket&lt;/code&gt; 은 public access block 기본 활성. 의도한 설정인지 확인.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;snapshot 테스트 미적용&lt;/strong&gt;: stack 변경 시 의도치 않은 resource 재생성 (replacement) 놓침.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;code&gt;RemovalPolicy.DESTROY&lt;/code&gt; 는 stack 삭제 시 S3 버킷, RDS 등 &lt;strong&gt;데이터 포함 삭제&lt;/strong&gt;. 프로덕션 리소스는 반드시 &lt;code&gt;RETAIN&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-cloudformation]] - CDK 의 컴파일 대상&lt;/li&gt;
&lt;li&gt;[[terraform]] - 대안 IaC (Multi-cloud)&lt;/li&gt;
&lt;li&gt;[[pulumi]] - 대안 IaC&lt;/li&gt;
&lt;li&gt;[[aws-lambda]] - 가장 많이 쓰이는 CDK L2 대상&lt;/li&gt;
&lt;li&gt;[[aws-s3]] - asset + 데이터 스토어&lt;/li&gt;
&lt;li&gt;[[aws-iam]] - construct 의 grant* 메서드가 자동 생성&lt;/li&gt;
&lt;li&gt;[[aws-eks]] - EKS cluster CDK 구성&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cdk</category><category>iac</category><category>devops</category><category>cloudformation</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[IaC] Pulumi: 코드로 인프라 (TS/Python/Go)</title><link>https://shinkeonkim.com/wiki/cloud/pulumi/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/pulumi/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pulumi&lt;/strong&gt; = &lt;em&gt;일반 프로그래밍 언어로 IaC&lt;/em&gt;. TypeScript, Python, Go, .NET, Java. Terraform 의 &lt;em&gt;HCL DSL&lt;/em&gt; 대신 &lt;em&gt;코드 자유도&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;이유&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;반복/조건 분기가 많은 인프라&lt;/td&gt;&lt;td&gt;언어 자유도 활용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;내부 플랫폼 도구 (self-service portal)&lt;/td&gt;&lt;td&gt;Automation API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;멀티 스택, 환경 분리&lt;/td&gt;&lt;td&gt;Stack + ESC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;기존 Terraform 마이그레이션&lt;/td&gt;&lt;td&gt;import + 호환 provider&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;인프라에 unit test 적용&lt;/td&gt;&lt;td&gt;Pulumi testing SDK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Policy as Code&lt;/td&gt;&lt;td&gt;CrossGuard&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;ts-예시&quot;&gt;TS 예시&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pulumi.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; env&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pulumi.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getStack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; bucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.s3.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  bucket: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`myapp-data-${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  tags: { Environment: env, ManagedBy: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pulumi&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.s3.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;BucketVersioningV2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;data-version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  bucket: bucket.id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  versioningConfiguration: { status: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Enabled&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; bucketName&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; bucket.id;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;흐름&quot;&gt;흐름&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Code[&quot;index.ts&quot;] --&gt; Preview[&quot;pulumi preview (diff)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Preview --&gt; Up[&quot;pulumi up (실제 변경)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Up --&gt; State[(&quot;stack state&amp;#x3C;br/&gt;backend&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    State --&gt; Drift[&quot;drift detection&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;명령&quot;&gt;명령&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; aws-typescript&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 새 프로젝트&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # 새 stack (Terraform workspace 비슷)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; region&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; us-east-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --secret&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; db-password&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; xxx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; preview&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;               # diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                    # apply&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; destroy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bucketName&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; aws:s3/bucket:Bucket&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-legacy-bucket&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;backend-state&quot;&gt;Backend (state)&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Backend&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Pulumi Cloud&lt;/td&gt;&lt;td&gt;managed (기본, free tier)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AWS S3&lt;/td&gt;&lt;td&gt;self-host&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure Blob / GCS&lt;/td&gt;&lt;td&gt;self-host&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Local file&lt;/td&gt;&lt;td&gt;개발&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; login&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; s3://my-pulumi-state&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; login&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;차이-hcl-vs-코드&quot;&gt;차이: HCL vs 코드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// Pulumi: 조건/반복은 코드 그대로&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; instances&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;alice&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;bob&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;charlie&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.iam.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(name, { name })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 의존성 자동&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.iam.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Role&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, { assumeRolePolicy: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.iam.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;RolePolicyAttachment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;attach&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  role: role.name,    &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// pulumi.Output&amp;#x3C;string&gt;, 의존성 자동&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  policyArn: policy.arn,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;pulumi-vs-terraform&quot;&gt;Pulumi vs Terraform&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;Pulumi&lt;/th&gt;&lt;th&gt;Terraform&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;언어&lt;/td&gt;&lt;td&gt;TS/Python/Go/.NET/Java&lt;/td&gt;&lt;td&gt;HCL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;표현력&lt;/td&gt;&lt;td&gt;&lt;em&gt;높음&lt;/em&gt; (코드 자유)&lt;/td&gt;&lt;td&gt;DSL 한정&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;학습 곡선&lt;/td&gt;&lt;td&gt;일반 코드 알면 쉬움&lt;/td&gt;&lt;td&gt;HCL 학습&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;테스트&lt;/td&gt;&lt;td&gt;&lt;em&gt;unit test 가능&lt;/em&gt;&lt;/td&gt;&lt;td&gt;tflint, terratest 등 별도&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;생태계&lt;/td&gt;&lt;td&gt;작음&lt;/td&gt;&lt;td&gt;&lt;em&gt;가장 큼&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;가격&lt;/td&gt;&lt;td&gt;Cloud paid (free tier)&lt;/td&gt;&lt;td&gt;OSS / OpenTofu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;멀티 클라우드&lt;/td&gt;&lt;td&gt;예&lt;/td&gt;&lt;td&gt;예&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;stack-관리&quot;&gt;Stack 관리&lt;/h2&gt;
&lt;p&gt;Stack = 환경 단위 (dev, staging, prod). 각 stack은 독립적 state.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; staging&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; select&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; old-stack&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --force&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;stack-별-config&quot;&gt;Stack 별 config&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pulumi.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; region&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;region&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);       &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 없으면 에러&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; debug&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getBoolean&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;debug&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# dev 스택&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; region&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ap-northeast-2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# prod 스택&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; region&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; us-east-1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --stack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; prod&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;stack-references-cross-stack-output&quot;&gt;Stack References (cross-stack output)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 네트워크 스택에서 VPC ID 읽기&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; netStack&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pulumi.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;StackReference&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;org/network/prod&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; vpcId&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; netStack.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getOutput&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;vpcId&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; cluster&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.ecs.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Cluster&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  tags: { VpcId: vpcId.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apply&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(id)) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;스택 간 의존성을 명시적으로 표현. Terraform &lt;code&gt;data.terraform_remote_state&lt;/code&gt; 와 동일 패턴.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;component-resources&quot;&gt;Component Resources&lt;/h2&gt;
&lt;p&gt;재사용 가능한 고수준 추상화.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; SecureBucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; pulumi&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ComponentResource&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; readonly&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; bucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; aws&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;s3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; readonly&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; bucketName&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; pulumi&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Output&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;opts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; pulumi&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ComponentResourceOptions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    super&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;myapp:index:SecureBucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, name, {}, opts);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.bucket &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.s3.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(name, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      acl: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;private&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      serverSideEncryptionConfiguration: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        rule: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          applyServerSideEncryptionByDefault: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            sseAlgorithm: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;AES256&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }, { parent: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.bucketName &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.bucket.id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;registerOutputs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ bucketName: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.bucketName });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 사용&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; dataBucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; SecureBucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;crossguard-policy-as-code&quot;&gt;CrossGuard (Policy as Code)&lt;/h2&gt;
&lt;p&gt;인프라 정책을 코드로. 배포 전 자동 검사.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// policy-pack/index.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; PolicyPack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;aws-security&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  policies: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      name: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;s3-no-public-read&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      description: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;S3 버킷 public read 금지&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      enforcementLevel: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;mandatory&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      validateResource: &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;validateResourceOfType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(aws.s3.Bucket, (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;report&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (bucket.acl &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;public-read&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;          report&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;public-read ACL 은 금지입니다.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --policy-pack&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./policy-pack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;단위-테스트&quot;&gt;단위 테스트&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// __tests__/infra.test.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pulumi.runtime.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;setMocks&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  newResource&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;inputs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ({ id: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}-id`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, state: inputs }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  call&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;token&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;provider&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ({ result: args }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;S3 bucket 암호화 활성화&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; bucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; SecureBucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sse&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; bucket.bucket.serverSideEncryptionConfiguration.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  expect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(sse?.rule?.applyServerSideEncryptionByDefault?.sseAlgorithm).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toBe&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;AES256&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vitest&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;     # 또는 jest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;automation-api&quot;&gt;Automation API&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; stack&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; automation.LocalWorkspace.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;createOrSelectStack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  stackName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;prod&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  projectName: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;myapp&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  program&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws.s3.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, { acl: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;private&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stack.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;up&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({ onOutput: console.log });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Terraform 의 CLI 의존성 없이&lt;/em&gt; Pulumi 를 &lt;em&gt;프로그램 안에서 호출&lt;/em&gt;. &lt;em&gt;self-service portal&lt;/em&gt; 같은 &lt;em&gt;내부 도구&lt;/em&gt; 에 강력.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;pulumi-esc-environments-secrets-configuration&quot;&gt;Pulumi ESC (Environments, Secrets, Configuration)&lt;/h2&gt;
&lt;p&gt;환경별 비밀, 설정을 중앙 관리. OIDC로 동적 credentials 발급.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# esc-env.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  aws&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    login&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      fn::open::aws-login&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        oidc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          roleArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:iam::123:role/pulumi-esc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          sessionName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;pulumi-esc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  environmentVariables&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;${aws.login.accessKeyId}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;${aws.login.secretAccessKey}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    AWS_SESSION_TOKEN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;${aws.login.sessionToken}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;esc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; env&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myorg/prod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;esc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myorg/prod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pulumi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;github-actions-cicd&quot;&gt;GitHub Actions CI/CD&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Pulumi Deploy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    branches&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;jobs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  deploy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    runs-on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ubuntu-latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    permissions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      id-token&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # OIDC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      contents&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;read&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    steps&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;actions/checkout@v4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;pulumi/actions@v5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          command&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          stack-name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;prod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          cloud-url&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;s3://my-pulumi-state&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        env&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          PULUMI_ACCESS_TOKEN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;${{ secrets.PULUMI_ACCESS_TOKEN }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;          AWS_REGION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ap-northeast-2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;pulumi.Output&lt;/code&gt; 처리 미숙&lt;/strong&gt; = &lt;code&gt;.apply()&lt;/code&gt;, &lt;code&gt;interpolate&lt;/code&gt; 사용. promise/await 와 다름.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret 코드에 평문&lt;/strong&gt; = &lt;code&gt;pulumi config set --secret&lt;/code&gt; 사용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stack 간 reference&lt;/strong&gt; = &lt;code&gt;StackReference&lt;/code&gt; 로 cross-stack output 읽기.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변수 vs config&lt;/strong&gt; = &lt;code&gt;config&lt;/code&gt; 가 stack 별. 변수는 코드.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ComponentResource 에서 &lt;code&gt;parent: this&lt;/code&gt; 누락&lt;/strong&gt; = state 에 고아 리소스. 항상 &lt;code&gt;{ parent: this }&lt;/code&gt; 전달.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;pulumi destroy&lt;/code&gt; 순서&lt;/strong&gt; = 의존 stack 먼저 destroy. StackReference 있으면 역순.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;drift 탐지&lt;/strong&gt; = &lt;code&gt;pulumi refresh&lt;/code&gt; 로 실제 인프라 상태와 state 동기화.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[terraform]]&lt;/li&gt;
&lt;li&gt;[[cdk]]&lt;/li&gt;
&lt;li&gt;[[github-actions]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudformation]]&lt;/li&gt;
&lt;li&gt;[[argocd]]&lt;/li&gt;
&lt;li&gt;[[gitops-patterns]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>pulumi</category><category>iac</category><category>devops</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[IaC] Terraform State: backend, locking, drift, import</title><link>https://shinkeonkim.com/wiki/cloud/terraform-state/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/terraform-state/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Terraform State&lt;/strong&gt; = &lt;em&gt;코드 (의도) vs 실제 인프라 매핑&lt;/em&gt;. JSON 파일. &lt;em&gt;모든 Terraform 작업의 핵심&lt;/em&gt;. &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt; 모두 state 를 기반으로 diff 계산.&lt;/p&gt;
&lt;h2 id=&quot;사용-상황&quot;&gt;사용 상황&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;Terraform State 주요 고려사항&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;팀 협업&lt;/td&gt;&lt;td&gt;Remote backend 필수 (S3/TFC), local file 금지&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;여러 환경 분리&lt;/td&gt;&lt;td&gt;Workspace 또는 별도 backend key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;기존 인프라 도입&lt;/td&gt;&lt;td&gt;&lt;code&gt;terraform import&lt;/code&gt; 로 state 등록&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;인프라 드리프트 감지&lt;/td&gt;&lt;td&gt;&lt;code&gt;terraform plan -refresh-only&lt;/code&gt; 정기 실행&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;대규모 모노리식 state&lt;/td&gt;&lt;td&gt;레이어별 state 분할 전략&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Secret 관리&lt;/td&gt;&lt;td&gt;output sensitive + [[aws-secrets-manager]] 또는 Vault&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;state-가-하는-일&quot;&gt;State 가 하는 일&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Code[&quot;main.tf&amp;#x3C;br/&gt;(의도)&quot;] --&gt; Plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    State[&quot;terraform.tfstate&amp;#x3C;br/&gt;(알려진 실제)&quot;] --&gt; Plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Real[&quot;AWS 실제&quot;] --&gt; Refresh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Refresh --&gt; State&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Plan --&gt; Diff[Diff]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Diff --&gt; Apply[apply]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Apply --&gt; Real&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Apply --&gt; State&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;역할&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Mapping&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;resource 이름 ↔ AWS ARN/ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;의존성 그래프, 버전 정보&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;refresh 캐시 (매번 AWS API 호출 안 해도 됨)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Sensitive&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;output value 보관 (&lt;em&gt;평문&lt;/em&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;state-파일-내부-구조&quot;&gt;State 파일 내부 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;terraform_version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;1.8.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;serial&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;42&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;lineage&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;550e8400-...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;outputs&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;vpc_id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;value&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;vpc-0abc123&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;sensitive&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;resources&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;mode&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;managed&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;aws_s3_bucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;provider&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;provider[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;registry.terraform.io/hashicorp/aws&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;]&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;instances&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;schema_version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;attributes&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;my-data-bucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;bucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;my-data-bucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;region&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;us-east-1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;serial&lt;/code&gt;: apply 마다 증가. 충돌 감지.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lineage&lt;/code&gt;: state 파일 고유 ID. 다른 state 교체 방지.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sensitive&lt;/code&gt; 출력값도 JSON 에 &lt;em&gt;평문 저장&lt;/em&gt;. Backend 암호화 필수.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;backend-종류&quot;&gt;Backend 종류&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B[Backend]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B --&gt; Local[local file&amp;#x3C;br/&gt;팀 사용 금지]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B --&gt; S3[&quot;S3 + DynamoDB lock&amp;#x3C;br/&gt;(AWS 표준)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B --&gt; TFC[&quot;Terraform Cloud / HCP Terraform&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B --&gt; GCS[GCS]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B --&gt; Azure[Azure Blob]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B --&gt; Consul[Consul]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;s3--dynamodb-aws-표준&quot;&gt;S3 + DynamoDB (AWS 표준)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  backend&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;s3&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    bucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;my-tf-state&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    key&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;prod/web/terraform.tfstate&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    region&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;us-east-1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    encrypt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    kms_key_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;     =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;arn:aws:kms:us-east-1:123:key/...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    dynamodb_table&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;tf-lock&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;컴포넌트&lt;/th&gt;&lt;th&gt;역할&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;S3 bucket&lt;/td&gt;&lt;td&gt;state 저장 + versioning 활성화&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;KMS&lt;/td&gt;&lt;td&gt;server-side 암호화&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DynamoDB&lt;/td&gt;&lt;td&gt;distributed lock (conditional write)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;state-locking&quot;&gt;State Locking&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Dev1-&gt;&gt;Lock: acquire (DynamoDB CAS)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lock--&gt;&gt;Dev1: OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Dev1-&gt;&gt;State: write&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Dev2-&gt;&gt;Lock: acquire&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lock--&gt;&gt;Dev2: 이미 잠겨있음&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Dev1-&gt;&gt;Lock: release&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Dev2-&gt;&gt;Lock: acquire&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lock--&gt;&gt;Dev2: OK&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;동시 apply 충돌 방지&lt;/em&gt;. DynamoDB 의 &lt;em&gt;conditional write&lt;/em&gt; (CAS: Compare-And-Swap).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lock 강제 해제 (비정상 종료 후):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; force-unlock&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LOCK_ID&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;drift-detection&quot;&gt;Drift Detection&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 코드 변경 없이 실제 vs state 차이만 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; plan&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -refresh-only&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;상황&lt;/th&gt;&lt;th&gt;원인&lt;/th&gt;&lt;th&gt;대응&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;state &amp;#x3C; 실제&lt;/td&gt;&lt;td&gt;콘솔 직접 수정&lt;/td&gt;&lt;td&gt;&lt;code&gt;terraform refresh&lt;/code&gt; + 코드 반영&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;state &gt; 실제&lt;/td&gt;&lt;td&gt;수동 삭제&lt;/td&gt;&lt;td&gt;&lt;code&gt;terraform state rm&lt;/code&gt; 후 재적용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;정기 감지&lt;/td&gt;&lt;td&gt;드리프트 자동화&lt;/td&gt;&lt;td&gt;CI 에서 &lt;code&gt;plan -refresh-only&lt;/code&gt; 스케줄링&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Prod 수동 변경 감지&lt;/em&gt;. 정기 drift check 는 CI 파이프라인에 포함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;state-분할-전략&quot;&gt;State 분할 전략&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mono[&quot;모노리식 State&amp;#x3C;br/&gt;(모든 리소스 한 파일)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Split[&quot;레이어별 State 분할&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mono --&gt; Split&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Split --&gt; Net[&quot;network/&amp;#x3C;br/&gt;VPC, Subnet, Route&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Split --&gt; Compute[&quot;compute/&amp;#x3C;br/&gt;EKS, EC2, ASG&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Split --&gt; App[&quot;app/&amp;#x3C;br/&gt;Lambda, RDS, ElastiCache&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Split --&gt; Shared[&quot;shared/&amp;#x3C;br/&gt;IAM, KMS, ECR&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;레이어&lt;/th&gt;&lt;th&gt;예시 리소스&lt;/th&gt;&lt;th&gt;변경 빈도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;network&lt;/td&gt;&lt;td&gt;VPC, Subnet, Route Table&lt;/td&gt;&lt;td&gt;매우 낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;shared&lt;/td&gt;&lt;td&gt;IAM Role, KMS Key, ECR&lt;/td&gt;&lt;td&gt;낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;compute&lt;/td&gt;&lt;td&gt;EKS, EC2, Auto Scaling&lt;/td&gt;&lt;td&gt;중간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;app&lt;/td&gt;&lt;td&gt;Lambda, RDS, ElastiCache&lt;/td&gt;&lt;td&gt;높음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;분할 이점&lt;/em&gt;: plan 시간 단축, 블라스트 반경 감소, 팀별 소유권 분리.
&lt;em&gt;분할 방법&lt;/em&gt;: &lt;code&gt;terraform_remote_state&lt;/code&gt; 로 다른 state 의 output 참조.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;terraform_remote_state&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;network&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  backend&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;s3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  config&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    bucket &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;my-tf-state&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    key    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;prod/network/terraform.tfstate&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    region &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;us-east-1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;resource&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;aws_eks_cluster&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  vpc_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subnet_ids&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;terraform_remote_state&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;network&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;outputs&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;private_subnet_ids&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;state-조작-명령&quot;&gt;State 조작 명령&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                           # 모든 리소스 목록&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; show&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; aws_s3_bucket.data&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # 단일 리소스 상세&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; old.name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; new.name&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;           # rename (리팩토링 시)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; aws_s3_bucket.old&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;           # state 에서만 제거 (AWS 실제 리소스 남음)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; backup.tfstate&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;          # state 다운로드 (백업)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; backup.tfstate&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            # state 업로드 (위험, 수동)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; aws_instance.web&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; i-1234abcd&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 기존 리소스를 state 에 등록&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;code&gt;state push&lt;/code&gt; 는 &lt;code&gt;serial&lt;/code&gt; 번호 역전 방지 없이 덮어씀. 잘못된 state 로 인프라 삭제 위험.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;import-기존-리소스-등록&quot;&gt;Import (기존 리소스 등록)&lt;/h2&gt;
&lt;h3 id=&quot;cli-import-terraform-15&quot;&gt;CLI import (Terraform 1.5+)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  to&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws_s3_bucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;legacy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;my-legacy-bucket&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;resource&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;aws_s3_bucket&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;legacy&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  bucket&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;my-legacy-bucket&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 코드 자동 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; plan&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -generate-config-out=generated.tf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apply&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;구버전-cli-import&quot;&gt;구버전 CLI import&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; aws_s3_bucket.legacy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-legacy-bucket&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드는 직접 작성. import 후 &lt;code&gt;terraform plan&lt;/code&gt; 으로 drift 없는지 확인.&lt;/p&gt;
&lt;h2 id=&quot;workspace-환경-분리&quot;&gt;Workspace (환경 분리)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; workspace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; prod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; workspace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; staging&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; workspace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; select&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; prod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;terraform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; workspace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;locals&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  env&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; terraform&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;workspace   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# &quot;prod&quot; / &quot;staging&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;resource&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;aws_instance&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;web&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  instance_type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; local&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;env &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;prod&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;c5.xlarge&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;t3.small&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;한 backend 에 여러 state&lt;/em&gt; 관리. 단, &lt;em&gt;separate backend (별도 S3 key) 가 더 안전&lt;/em&gt;. Workspace 는 동일 AWS 계정에서 사용 → 실수로 Prod 에 staging 적용 위험.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;terragrunt-연계&quot;&gt;Terragrunt 연계&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Terraform 의 DRY wrapper&lt;/em&gt;. 여러 환경/레이어의 중복 backend 설정 제거.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# terragrunt.hcl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;remote_state&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  backend&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;s3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  config&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    bucket  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;my-tf-state-&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;get_aws_account_id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    key     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;path_relative_to_include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/terraform.tfstate&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    region  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;us-east-1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    encrypt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    dynamodb_table &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;tf-lock&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;environments/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  prod/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    network/   ← terragrunt.hcl 상속&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    compute/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    app/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  staging/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    network/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    compute/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cicd-연계&quot;&gt;CI/CD 연계&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;단계&lt;/th&gt;&lt;th&gt;명령&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;&lt;code&gt;terraform plan&lt;/code&gt;&lt;/td&gt;&lt;td&gt;diff 리뷰, 변경 범위 확인&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Merge&lt;/td&gt;&lt;td&gt;&lt;code&gt;terraform apply -auto-approve&lt;/code&gt;&lt;/td&gt;&lt;td&gt;자동 적용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;정기&lt;/td&gt;&lt;td&gt;&lt;code&gt;terraform plan -refresh-only&lt;/code&gt;&lt;/td&gt;&lt;td&gt;drift 감지&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;공유&lt;/td&gt;&lt;td&gt;plan 결과를 PR comment 로&lt;/td&gt;&lt;td&gt;Atlantis / Spacelift / TFC&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Atlantis&lt;/em&gt; 나 &lt;em&gt;Terraform Cloud&lt;/em&gt; 는 PR 이벤트에 plan 자동 실행 + 승인 후 apply.&lt;/p&gt;
&lt;h2 id=&quot;state-의-위험&quot;&gt;State 의 위험&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;State 의 secret 평문&lt;/strong&gt; = &lt;code&gt;terraform output&lt;/code&gt; 의 password 등 그대로. 접근 제한 + KMS + IAM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수동 state 편집&lt;/strong&gt; = 형식 깨짐 위험. &lt;em&gt;반드시 &lt;code&gt;terraform state&lt;/code&gt; 명령 사용&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State 손실&lt;/strong&gt; = 추적 불가 (코드와 실제 매핑 소실). S3 versioning + 정기 백업.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;여러 사람 동시 apply&lt;/strong&gt; = lock 없으면 state 깨짐. DynamoDB lock 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local backend 를 팀이 공유&lt;/strong&gt; = git 에 state 올리면 secret 노출 + 충돌. Remote backend 전환.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[terraform]]&lt;/li&gt;
&lt;li&gt;[[aws-s3]]&lt;/li&gt;
&lt;li&gt;[[aws-kms]]&lt;/li&gt;
&lt;li&gt;[[aws-iam]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail]] (state 변경 감사)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>terraform</category><category>state</category><category>iac</category><category>devops</category><category>cloud</category><author>koa (김신건)</author></item><item><title>[AWS] API Gateway: REST/HTTP/WebSocket API 관리</title><link>https://shinkeonkim.com/wiki/cloud/aws-api-gateway/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-api-gateway/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS API Gateway&lt;/strong&gt; 는 REST / HTTP / WebSocket API 를 관리하는 완전관리형 서비스. 인증, 스로틀링, 캐싱, 요청/응답 변환, 로깅을 단일 서비스로 제공. Lambda 와 결합해 서버리스 백엔드의 진입점이 된다.&lt;/p&gt;
&lt;h2 id=&quot;api-타입-비교&quot;&gt;API 타입 비교&lt;/h2&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;REST API&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;HTTP API&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;WebSocket API&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;출시&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2015&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2019&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2018&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;비용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$3.50/million&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$1.00/million&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$1.00/million&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;지연시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;높음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;JWT authorizer&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lambda만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;내장&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lambda만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;WAF 통합&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;가능&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능 (v2)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;아니오&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Request validator&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;있음&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Usage Plan/API Key&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;있음&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Response 캐싱&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;있음&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;프라이빗 endpoint&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
신규 프로젝트는 &lt;strong&gt;HTTP API 우선 검토&lt;/strong&gt;. 기능 격차를 확인 후 REST API 선택.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;아키텍처-lambda-프록시-통합&quot;&gt;아키텍처: Lambda 프록시 통합&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client[&quot;클라이언트&quot;] --&gt;|&quot;HTTPS (TLS)&quot;| APIGW[&quot;API Gateway&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    APIGW --&gt;|&quot;JWT / Lambda 인증&quot;| Auth[&quot;Authorizer&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Auth --&gt;|&quot;allow&quot;| APIGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    APIGW --&gt;|&quot;Lambda Proxy 요청&quot;| Lambda[&quot;Lambda&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lambda --&gt;|&quot;응답&quot;| APIGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    APIGW --&gt;|&quot;HTTP 응답&quot;| Client&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    APIGW -.-&gt;|&quot;실패 시&quot;| APIGW&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lambda proxy 통합: API Gateway 가 원본 요청을 그대로 Lambda 에 전달 (path, headers, body, queryStringParameters 포함). Lambda 는 &lt;code&gt;statusCode&lt;/code&gt;, &lt;code&gt;headers&lt;/code&gt;, &lt;code&gt;body&lt;/code&gt; 를 포함한 JSON 을 반환.&lt;/p&gt;
&lt;h2 id=&quot;통합-타입&quot;&gt;통합 타입&lt;/h2&gt;
&lt;h3 id=&quot;lambda-proxy&quot;&gt;Lambda Proxy&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;httpMethod&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;path&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/users&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;headers&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Authorization&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Bearer ...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;queryStringParameters&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;body&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;alice&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lambda 응답:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;statusCode&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;201&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;headers&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;body&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;u123&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;http-proxy&quot;&gt;HTTP Proxy&lt;/h3&gt;
&lt;p&gt;외부 URL 로 요청 그대로 포워딩. 변환 없음.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 통합 설정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;integration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;HTTP_PROXY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  uri&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;http://internal-alb.example.com/{proxy}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  httpMethod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ANY&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;vpc-link&quot;&gt;VPC Link&lt;/h3&gt;
&lt;p&gt;프라이빗 [[aws-vpc|VPC]] 내 [[aws-alb-nlb|ALB/NLB]] 와 연결. 인터넷 노출 없이 내부 서비스 연결.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    APIGW[&quot;API Gateway&quot;] --&gt;|&quot;VPC Link&quot;| VL[&quot;VPC Link&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VL --&gt; NLB[&quot;NLB (private)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NLB --&gt; SVC[&quot;내부 서비스&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;aws-서비스-직접-통합&quot;&gt;AWS 서비스 직접 통합&lt;/h3&gt;
&lt;p&gt;Lambda 없이 DynamoDB, SQS, S3 등 직접 호출.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;integration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  uri&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:apigateway:us-east-1:dynamodb:action/PutItem&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  credentials&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:iam::123:role/apigw-dynamo-role&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;인증인가&quot;&gt;인증/인가&lt;/h2&gt;
&lt;h3 id=&quot;lambda-authorizer-커스텀&quot;&gt;Lambda Authorizer (커스텀)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(event, context):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    token &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;authorizationToken&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # JWT 검증 또는 DB 조회&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    effect &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Allow&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; valid(token) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Deny&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;principalId&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;user123&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;policyDocument&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &quot;Version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2012-10-17&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;execute-api:Invoke&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &quot;Effect&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: effect,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: event[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;methodArn&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;context&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;userId&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;u123&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Lambda 로 전달 가능&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;캐싱&lt;/strong&gt;: Lambda Authorizer 결과를 TTL 동안 캐시. 기본 300초. 비용 절감 + 지연시간 단축.&lt;/p&gt;
&lt;h3 id=&quot;jwt-authorizer-http-api-전용&quot;&gt;JWT Authorizer (HTTP API 전용)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;authorizer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;JWT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  jwtConfiguration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    issuer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxx&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    audience&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;client-id-1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  identitySource&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;$request.header.Authorization&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cognito, Auth0, Okta 등 OIDC 호환 IdP 와 바로 연동. Lambda 불필요.&lt;/p&gt;
&lt;h3 id=&quot;iam--sigv4&quot;&gt;IAM + SigV4&lt;/h3&gt;
&lt;p&gt;AWS SDK / CLI 로 서명된 요청. 내부 서비스 간 통신에 적합.&lt;/p&gt;
&lt;h2 id=&quot;스로틀링-설정&quot;&gt;스로틀링 설정&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Req[&quot;요청&quot;] --&gt; AccLim[&quot;계정 레벨&amp;#x3C;br/&gt;10,000 rps / 5,000 burst&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AccLim --&gt; APILim[&quot;API/Stage 레벨&amp;#x3C;br/&gt;사용자 지정&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    APILim --&gt; MethodLim[&quot;메서드 레벨&amp;#x3C;br/&gt;사용자 지정&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    MethodLim --&gt; UsagePlan[&quot;Usage Plan&amp;#x3C;br/&gt;API Key 별 quota&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;레벨&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;기본값&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;변경&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;계정 전체&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;10,000 rps / burst 5,000&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Support 티켓으로 증가&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Stage/API&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;계정 한도 공유&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;콘솔/API 로 설정&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;메서드&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Stage 한도 공유&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;각 메서드별 오버라이드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Usage Plan&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;일/월 quota, rps&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;API Key 단위&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;429 Too Many Requests 반환 시 &lt;code&gt;Retry-After&lt;/code&gt; 헤더 제공.&lt;/p&gt;
&lt;h2 id=&quot;스테이지-관리&quot;&gt;스테이지 관리&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;prod (v1)   →  stage variables: LOG_LEVEL=WARN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;staging     →  stage variables: LOG_LEVEL=DEBUG&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dev         →  stage variables: LOG_LEVEL=DEBUG&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stage Variable&lt;/strong&gt;: 스테이지별 환경 변수. Lambda alias 로 활용 가능.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Canary deployment&lt;/strong&gt;: 스테이지에서 일부 트래픽만 새 버전으로.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: Stage 에 변경사항 반영 (명시적 배포 필요).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;캐싱-rest-api&quot;&gt;캐싱 (REST API)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 캐시 활성화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apigateway&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update-stage&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --rest-api-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; abc123&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --stage-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; prod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --patch-operations&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    op=replace,path=/cacheClusterEnabled,value=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    op=replace,path=/cacheClusterSize,value=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;캐시 크기&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;비용/시간&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;0.5 GB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.020&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;1.6 GB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.038&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;6.1 GB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.200&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;13.5 GB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.250&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
캐시는 REST API 전용. HTTP API 에는 없음. 비용이 추가되므로 고트래픽 GET 엔드포인트에만 적용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;요청응답-변환-rest-api&quot;&gt;요청/응답 변환 (REST API)&lt;/h2&gt;
&lt;p&gt;Velocity Template Language (VTL) 로 매핑:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#set($inputRoot = $input.path(&apos;$&apos;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;userId&quot;: &quot;$inputRoot.id&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;email&quot;: &quot;$inputRoot.contact.email&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTTP API 는 변환 불가 (Lambda 내부에서 처리).&lt;/p&gt;
&lt;h2 id=&quot;사용-패턴&quot;&gt;사용 패턴&lt;/h2&gt;
&lt;h3 id=&quot;bff-backend-for-frontend&quot;&gt;BFF (Backend for Frontend)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Web[&quot;Web 클라이언트&quot;] --&gt; GWAY[&quot;API Gateway&amp;#x3C;br/&gt;BFF&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mobile[&quot;Mobile 클라이언트&quot;] --&gt; GWAY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWAY --&gt; UserSvc[&quot;User Service&amp;#x3C;br/&gt;Lambda&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWAY --&gt; OrderSvc[&quot;Order Service&amp;#x3C;br/&gt;Lambda&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWAY --&gt; PaySvc[&quot;Payment Service&amp;#x3C;br/&gt;Lambda&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;microservice-gateway&quot;&gt;Microservice Gateway&lt;/h3&gt;
&lt;p&gt;각 마이크로서비스에 별도 API Gateway 대신 단일 진입점 제공.&lt;/p&gt;
&lt;h3 id=&quot;이벤트-수신-snssqs-연결&quot;&gt;이벤트 수신 (SNS/SQS 연결)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Client → API Gateway → SQS → Lambda consumer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;비동기 처리 패턴. 즉시 202 Accepted 반환, 실제 처리는 SQS 로.&lt;/p&gt;
&lt;h2 id=&quot;비용-구조&quot;&gt;비용 구조&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;REST API&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;HTTP API&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;첫 3억 요청/월&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$3.50/million&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$1.00/million&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;3억 초과&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$1.51/million&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.90/million&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;캐싱&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;별도 시간당 요금&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;데이터 전송&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 표준&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 표준&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;비용 절감 팁&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP API 우선 사용 (70% 저렴)&lt;/li&gt;
&lt;li&gt;캐싱으로 Lambda 호출 감소&lt;/li&gt;
&lt;li&gt;REST API 의 Usage Plan 으로 초과 사용 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;대안-비교&quot;&gt;대안 비교&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;옵션&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특성&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;적합한 경우&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;API Gateway HTTP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮은 비용, JWT 내장&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;신규 서버리스 API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;API Gateway REST&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;풍부한 기능, WAF, 캐싱&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;레거시 마이그레이션, API Key 관리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;**[[aws-alb-nlb&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ALB]]**&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;고성능, 저렴, L7 LB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AppSync&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GraphQL 특화, 실시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GraphQL API, 모바일&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CloudFront + Functions&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;초저지연 엣지&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;간단 API 변환&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Lambda 콜드 스타트&lt;/strong&gt;: API Gateway 자체는 콜드 스타트 없음. [[aws-lambda-cold-start|Lambda Cold Start]] 가 응답 지연 원인. Provisioned Concurrency 로 완화.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;payload 크기 제한&lt;/strong&gt;: REST/HTTP API 10 MB, WebSocket 128 KB. 대용량 파일은 S3 Presigned URL 로 직접 업로드.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;프라이빗 API 와 VPC Endpoint&lt;/strong&gt;: VPC 내부에서만 접근 가능한 API 는 Interface VPC Endpoint 필요. 구성 복잡.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;REST API 와 HTTP API 기능 격차&lt;/strong&gt;: REST API 의 Request Validator, Usage Plan, 캐싱, WAF IP Set 참조 등은 HTTP API 에 없음. 마이그레이션 전 기능 확인 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;스테이지 변수와 Lambda alias&lt;/strong&gt;: Stage variable 로 Lambda alias 참조 시 Lambda resource policy 에 API Gateway 권한 별도 추가 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;CORS 설정 누락&lt;/strong&gt;: HTTP API 는 CORS 자동 설정 지원. REST API 는 수동 설정 필요 (&lt;code&gt;OPTIONS&lt;/code&gt; 메서드, &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; 헤더).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-lambda]] - 주 통합 대상&lt;/li&gt;
&lt;li&gt;[[aws-lambda-cold-start]] - 콜드 스타트 문제&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb]] - 대안 L7 로드밸런서&lt;/li&gt;
&lt;li&gt;[[aws-vpc]] - 프라이빗 엔드포인트&lt;/li&gt;
&lt;li&gt;[[aws-iam]] - SigV4 인증&lt;/li&gt;
&lt;li&gt;[[aws-waf]] - 요청 필터링&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]] - API 모니터링&lt;/li&gt;
&lt;li&gt;[[aws-sqs]] - 비동기 패턴 연결&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>cloud</category><category>aws</category><category>api-gateway</category><category>serverless</category><category>rest</category><category>websocket</category><author>koa (김신건)</author></item><item><title>[AWS] ECS + Fargate: 컨테이너 오케스트레이션</title><link>https://shinkeonkim.com/wiki/cloud/aws-ecs-fargate/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-ecs-fargate/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ECS (Elastic Container Service)&lt;/strong&gt; = AWS 의 &lt;em&gt;컨테이너 오케스트레이션&lt;/em&gt;. K8s 보다 단순하고 AWS 네이티브.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fargate&lt;/strong&gt; = ECS (또는 EKS) 의 &lt;em&gt;서버리스 실행 환경&lt;/em&gt;. EC2 인스턴스 관리 없이 Task 단위 vCPU/Memory 예약 + 과금.&lt;/p&gt;
&lt;h2 id=&quot;ecs-계층-구조&quot;&gt;ECS 계층 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cluster[&quot;Cluster (논리 그룹)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cluster --&gt; SvcA[&quot;Service A&amp;#x3C;br/&gt;(Deployment 역할)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cluster --&gt; SvcB[&quot;Service B&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SvcA --&gt; T1[&quot;Task (실행 인스턴스)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SvcA --&gt; T2[&quot;Task&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SvcB --&gt; T3[&quot;Task&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    T1 --&gt; C1[&quot;Container 1&amp;#x3C;br/&gt;(nginx)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    T1 --&gt; C2[&quot;Container 2&amp;#x3C;br/&gt;(sidecar)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;객체&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;역할&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;K8s 비교&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Cluster&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;논리 그룹 (EC2 / Fargate 혼합 가능)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Cluster&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Task Definition&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;컨테이너 스펙 (버전 관리됨)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Pod spec (manifiest)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;실행 중인 Task Definition 인스턴스&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Pod&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Service&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;desired count 유지, LB 통합, 롤링 배포&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Deployment&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;task-definition-상세&quot;&gt;Task Definition 상세&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;family&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;web&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;networkMode&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;awsvpc&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;requiresCompatibilities&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;FARGATE&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;cpu&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;512&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;memory&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;1024&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;executionRoleArn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:iam::123:role/ecsTaskExecutionRole&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;taskRoleArn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:iam::123:role/ecsTaskRole&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;containerDefinitions&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;web&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;image&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;123.dkr.ecr.us-east-1.amazonaws.com/web:latest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;portMappings&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{ &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;containerPort&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;8080&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;tcp&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;environment&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;APP_ENV&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;production&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;secrets&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;valueFrom&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:secretsmanager:us-east-1:123:secret:prod/db&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;logConfiguration&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;logDriver&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;awslogs&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;options&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;awslogs-group&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/ecs/web&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;awslogs-region&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;us-east-1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;awslogs-stream-prefix&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ecs&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;healthCheck&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;command&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CMD-SHELL&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;curl -f http://localhost:8080/health || exit 1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;interval&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;timeout&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;retries&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;IAM Role 두 가지 구분&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;executionRoleArn&lt;/code&gt;: ECS agent 가 ECR 이미지 pull, CloudWatch 로그 쓰기에 사용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;taskRoleArn&lt;/code&gt;: 컨테이너 내 앱이 AWS 서비스 (DynamoDB, S3 등) 접근에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fargate-vs-ec2-launch-type&quot;&gt;Fargate vs EC2 Launch Type&lt;/h2&gt;























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;EC2 Launch Type&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Fargate&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;노드 관리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;사용자 직접 관리&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;AWS 관리&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;운영 부담&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;패치, 스케일링, AMI&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;없음&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;가격 모델&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2 인스턴스 시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Task vCPU + Memory 시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;비용 (대규모)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;저렴 (밀도 최적화)&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;일반적으로 비쌈&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;GPU 지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;가능&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;일부만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;호스트 접근&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SSH 가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;불가&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;시작 속도&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;빠름 (사전 프로비전)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;약간 느림 (콜드 스타트)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Spot 사용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;가능&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Fargate Spot&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;적합&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;비용 최적화, GPU, 밀도&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;운영 단순화, 변동 워크로드&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
소규모 팀 / 운영 부담 최소화 = &lt;strong&gt;Fargate&lt;/strong&gt;. 대규모 / 비용 최적화 = &lt;strong&gt;EC2 Launch Type&lt;/strong&gt; (Bin packing).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;fargate-가격-구조&quot;&gt;Fargate 가격 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vCPU 시간: $0.04048/vCPU/시간&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Memory:    $0.004445/GB/시간&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;예: 0.5 vCPU + 1 GB Memory, 720시간/월&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  = (0.5 * $0.04048 * 720) + (1 * $0.004445 * 720)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  = $14.57 + $3.20 = ~$17.77/월&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Fargate Spot&lt;/strong&gt;: 70% 할인. 2분 사전 통지 후 중단 가능. Stateless/Batch 에 적합.&lt;/p&gt;
&lt;h2 id=&quot;service-설정-deployment&quot;&gt;Service 설정 (Deployment)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  cluster&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;prod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  taskDefinition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;web:42&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  desiredCount&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  launchType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;FARGATE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  networkConfiguration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    awsvpcConfiguration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      subnets&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;subnet-private-a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;subnet-private-b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      securityGroups&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sg-app&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      assignPublicIp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  loadBalancers&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;targetGroupArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:elasticloadbalancing:...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      containerName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      containerPort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  deploymentConfiguration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    minimumHealthyPercent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 롤링 중 최소 가용 비율&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    maximumPercent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;           # 롤링 중 최대 Task 수&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  deploymentController&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ECS&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                     # 기본 (CODE_DEPLOY 로 Blue/Green 가능)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;alb-통합-아키텍처&quot;&gt;ALB 통합 아키텍처&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Internet[&quot;인터넷&quot;] --&gt; ALB[&quot;ALB&amp;#x3C;br/&gt;(443/80)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB --&gt;|&quot;Target Group&quot;| Task1[&quot;Task (AZ-a)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB --&gt;|&quot;Target Group&quot;| Task2[&quot;Task (AZ-b)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB --&gt;|&quot;Target Group&quot;| Task3[&quot;Task (AZ-a)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Task1 --&gt; RDS[&quot;RDS Aurora&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Task2 --&gt; RDS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Task3 --&gt; RDS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Task1 -.-&gt; SM[&quot;Secrets Manager&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Task2 -.-&gt; SM&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ALB 가 Task IP 를 직접 Target 으로 등록 (&lt;code&gt;awsvpc&lt;/code&gt; network mode)&lt;/li&gt;
&lt;li&gt;Service 가 새 Task 등록 / 구 Task 드레이닝 자동 처리&lt;/li&gt;
&lt;li&gt;Draining 기간: 기본 300초 (graceful shutdown)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;service-auto-scaling&quot;&gt;Service Auto Scaling&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Target Tracking (권장)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; application-autoscaling&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; register-scalable-target&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service-namespace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --resource-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;service/prod/web&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --scalable-dimension&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecs:service:DesiredCount&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --min-capacity&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --max-capacity&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; application-autoscaling&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-scaling-policy&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --policy-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;cpu-tracking&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service-namespace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --resource-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;service/prod/web&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --scalable-dimension&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecs:service:DesiredCount&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --policy-type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; TargetTrackingScaling&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --target-tracking-scaling-policy-configuration&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;TargetValue&quot;: 70.0,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;PredefinedMetricSpecification&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;PredefinedMetricType&quot;: &quot;ECSServiceAverageCPUUtilization&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;ScaleInCooldown&quot;: 300,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;ScaleOutCooldown&quot;: 30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;스케일링 타입&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특성&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;사용 케이스&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Target Tracking&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;목표값 유지 자동&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;기본 선택&lt;/em&gt; (CPU 70% 유지)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Step Scaling&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지표 임계값별 단계&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;정밀 제어 필요 시&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Scheduled&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;시간표 기반&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;예측 가능한 트래픽 패턴&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;ecr-연동&quot;&gt;ECR 연동&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ECR 로그인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecr&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-login-password&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --region&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; us-east-1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; login&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --username&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AWS&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --password-stdin&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 123.dkr.ecr.us-east-1.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 이미지 빌드 + 푸시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web:latest&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tag&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web:latest&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 123.dkr.ecr.us-east-1.amazonaws.com/web:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 123.dkr.ecr.us-east-1.amazonaws.com/web:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 새 Task Definition revision 으로 서비스 업데이트&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update-service&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --cluster&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; prod&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --service&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --task-definition&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web:43&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --force-new-deployment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;bluegreen-배포-codedeploy&quot;&gt;Blue/Green 배포 (CodeDeploy)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant CD as CodeDeploy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant ALB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Blue as &quot;Blue (구 버전)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Green as &quot;Green (신 버전)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CD-&gt;&gt;Green: &quot;새 Task 시작&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CD-&gt;&gt;ALB: &quot;Test listener (8080) -&gt; Green&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over CD: &quot;스모크 테스트&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CD-&gt;&gt;ALB: &quot;Production listener (443) -&gt; Green&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CD-&gt;&gt;Blue: &quot;드레이닝 후 종료&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;deploymentController: type: CODE_DEPLOY&lt;/code&gt; 로 ALB 두 Target Group 사용. 롤백 1초.&lt;/p&gt;
&lt;h2 id=&quot;ecs-anywhere&quot;&gt;ECS Anywhere&lt;/h2&gt;
&lt;p&gt;온프레미스 서버나 Edge 머신을 ECS 클러스터에 등록해 관리.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ECS Anywhere 에이전트 설치 스크립트 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ecs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-cluster&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --cluster-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; hybrid-cluster&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-activation&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --default-instance-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;on-prem-node&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --iam-role&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ECSAnywhereInstanceRole&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --registration-limit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ecs-vs-eks-선택-기준&quot;&gt;ECS vs EKS 선택 기준&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;ECS&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;EKS&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;학습 곡선&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;낮음&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;높음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;AWS 종속성&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;높음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;K8s 이식성&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;높음&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;운영 복잡도&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;낮음&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;높음 (Control plane 관리)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Cluster 비용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;무료&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.10/시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Ecosystem&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한적&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;방대 (Helm, Operator 등)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;적합&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 네이티브, 빠른 시작&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;멀티 클라우드, 표준화, 큰 규모&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Fargate Spot 중단 대응 미흡&lt;/strong&gt;: 2분 전 SIGTERM 보내고 중단. 컨테이너가 SIGTERM 처리 안 하면 데이터 손실. Graceful shutdown 구현 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;awsvpc 네트워크 모드 ENI 한도&lt;/strong&gt;: EC2 launch type 시 인스턴스 타입별 ENI 수 제한. &lt;code&gt;c5.large&lt;/code&gt; 는 ENI 3개 = Task 3개 상한. 인스턴스 타입 선택 시 ENI 한도 확인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;CloudWatch Logs 비용&lt;/strong&gt;: 모든 컨테이너 로그가 CloudWatch Logs 로. 고트래픽 서비스에서 로그 비용이 컴퓨팅 비용 초과 가능. &lt;code&gt;fluent-bit&lt;/code&gt; sidecar + S3/OpenSearch 로 라우팅 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Task Definition secrets 키 오타&lt;/strong&gt;: &lt;code&gt;secrets&lt;/code&gt; 필드에 Secrets Manager ARN 오타 시 Task 시작 실패 (ECS_EXEC 로 디버깅). &lt;code&gt;executionRole&lt;/code&gt; 에 &lt;code&gt;secretsmanager:GetSecretValue&lt;/code&gt; 권한 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Service 업데이트 후 롤링 지연&lt;/strong&gt;: &lt;code&gt;minimumHealthyPercent=100&lt;/code&gt; + &lt;code&gt;maximumPercent=200&lt;/code&gt; 시 기존 Task 유지 + 새 Task 추가 후 헬스체크 통과하면 구 Task 종료. 헬스체크가 길면 배포 느림.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Fargate Task 시작 지연&lt;/strong&gt;: 첫 Task 시작에 10-30초 소요 (이미지 풀 포함). [[aws-auto-scaling|Auto Scaling]] 반응 시간 고려, 사전에 여유 Task 유지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-ecr]] - 컨테이너 이미지 레지스트리&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb]] - 로드밸런서 통합&lt;/li&gt;
&lt;li&gt;[[aws-auto-scaling]] - Service Auto Scaling&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]] - 로그 + 메트릭&lt;/li&gt;
&lt;li&gt;[[aws-secrets-manager]] - 컨테이너 비밀 관리&lt;/li&gt;
&lt;li&gt;[[aws-iam]] - Task Role, Execution Role&lt;/li&gt;
&lt;li&gt;[[aws-eks]] - K8s 기반 대안&lt;/li&gt;
&lt;li&gt;[[k8s-deployment]] - K8s Deployment 비교&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>ecs</category><category>fargate</category><category>container</category><category>cloud</category><category>orchestration</category><author>koa (김신건)</author></item><item><title>[AWS] Secrets Manager + Parameter Store</title><link>https://shinkeonkim.com/wiki/cloud/aws-secrets-manager/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-secrets-manager/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; = &lt;em&gt;회전이 필요한 비밀&lt;/em&gt; (DB 패스워드, API key) 을 안전하게 저장/관리하는 서비스. Lambda 기반 자동 회전과 [[aws-kms]] 암호화 내장.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameter Store (SSM)&lt;/strong&gt; = &lt;em&gt;설정값 + 비밀값&lt;/em&gt;의 계층형 저장소. 대부분 무료, 간단한 구성 관리에 적합.&lt;/p&gt;
&lt;h2 id=&quot;secrets-manager-vs-parameter-store&quot;&gt;Secrets Manager vs Parameter Store&lt;/h2&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Secrets Manager&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Parameter Store&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;가격&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.40/secret/월 + $0.05/10k API&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Standard 무료, Advanced $0.05/1만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;자동 회전&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;내장 (Lambda)&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;아니오&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;버전 관리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;자동 (AWSPENDING / AWSCURRENT / AWSPREVIOUS)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;크기 제한&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;64 KB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;4 KB (standard) / 8 KB (advanced)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-kms]] 암호화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;기본 적용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SecureString 타입만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;타입&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;JSON / 문자열&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;String / StringList / SecureString&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;교차 계정&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한적&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;RDS 통합&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;내장 rotation&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수동&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;어떤-걸-언제-쓸까&quot;&gt;어떤 걸 언제 쓸까?&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q{&quot;비밀의 종류&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt;|&quot;DB password / API key (자동 회전 필요)&quot;| SM[&quot;Secrets Manager&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt;|&quot;앱 설정값, feature flag&quot;| PS[&quot;Parameter Store Standard&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt;|&quot;암호화 필요한 설정값&quot;| PSSec[&quot;Parameter Store SecureString&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt;|&quot;크기 &gt; 4KB (인증서 등)&quot;| SM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SM --&gt; Cost[&quot;$0.40/secret/월&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PS --&gt; Free[&quot;무료&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PSSec --&gt; KMSCost[&quot;KMS 비용만&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;secrets-manager-기본-사용&quot;&gt;Secrets Manager: 기본 사용&lt;/h2&gt;
&lt;h3 id=&quot;secret-저장&quot;&gt;Secret 저장&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# JSON 형식 (DB 자격증명)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secretsmanager&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-secret&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;prod/db/credentials&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --description&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;RDS Aurora production&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --secret-string&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&quot;username&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;s3cr3t&quot;}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 회전 주기 설정 (30일)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secretsmanager&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rotate-secret&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --secret-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;prod/db/credentials&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --rotation-rules&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; AutomaticallyAfterDays=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;secret-조회&quot;&gt;Secret 조회&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; boto3, json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sm &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; boto3.client(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;secretsmanager&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;region_name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;us-east-1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; get_secret&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(secret_name: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) -&gt; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    response &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sm.get_secret_value(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;SecretId&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;secret_name)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; json.loads(response[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;SecretString&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;creds &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; get_secret(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;prod/db/credentials&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;db_password &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; creds[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;password&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
매 요청마다 API 호출 금지. 애플리케이션 시작 시 캐싱 후 TTL 기반 갱신 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;secret-캐싱-패턴&quot;&gt;Secret 캐싱 패턴&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws_secretsmanager_caching &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; SecretCache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cache &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; SecretCache()   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 기본 TTL 3600초&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; get_cached_secret&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(name: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) -&gt; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cache.get_secret_string(name)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;aws-secretsmanager-caching&lt;/code&gt; 라이브러리가 공식 지원. Lambda 에서 전역 캐시로 콜드 스타트 이후 재사용.&lt;/p&gt;
&lt;h2 id=&quot;자동-회전-흐름&quot;&gt;자동 회전 흐름&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant SM as Secrets Manager&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant L as Rotation Lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant DB as 데이터베이스&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant App as 애플리케이션&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over SM: 30일 경과 / 수동 트리거&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SM-&gt;&gt;L: createSecret (AWSPENDING 생성)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;DB: 새 패스워드 생성 요청&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DB--&gt;&gt;L: OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SM-&gt;&gt;L: setSecret (DB 에 새 패스워드 적용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;DB: ALTER USER ... PASSWORD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SM-&gt;&gt;L: testSecret (새 패스워드 검증)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;DB: 로그인 테스트&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SM-&gt;&gt;L: finishSecret (AWSCURRENT 교체)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over SM: AWSPENDING -&gt; AWSCURRENT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over SM: 구 AWSCURRENT -&gt; AWSPREVIOUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App-&gt;&gt;SM: GetSecretValue (AWSCURRENT 조회)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SM--&gt;&gt;App: 새 패스워드&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;버전-레이블&quot;&gt;버전 레이블&lt;/h3&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;레이블&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSPENDING&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;회전 준비 중인 새 값&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSCURRENT&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;현재 활성 값&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSPREVIOUS&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;직전 값 (롤백 보험)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;rds-자동-회전-설정&quot;&gt;RDS 자동 회전 설정&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# RDS MySQL 자동 회전 활성화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secretsmanager&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rotate-secret&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --secret-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;prod/rds/mysql&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --rotation-lambda-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSMySQLRotationSingleUser&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --rotation-rules&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&quot;AutomaticallyAfterDays&quot;: 30}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AWS 가 지원하는 내장 rotation Lambda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SecretsManagerRDSMySQLRotationSingleUser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SecretsManagerRDSPostgreSQLRotationSingleUser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SecretsManagerRDSAuroraRotation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SecretsManagerRedshiftRotation&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;iam-접근-제어&quot;&gt;IAM 접근 제어&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2012-10-17&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Sid&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ReadSecretOnly&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Effect&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Allow&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;secretsmanager:GetSecretValue&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;secretsmanager:DescribeSecret&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:secretsmanager:us-east-1:123:secret:prod/*&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;code&gt;secretsmanager:*&lt;/code&gt; 권한 금지. 최소 권한으로 &lt;code&gt;GetSecretValue&lt;/code&gt; 만 부여. secret ARN 패턴으로 범위 제한.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;parameter-store-계층-구조&quot;&gt;Parameter Store: 계층 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 계층형 경로로 환경별 설정 관리&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/prod/app/db/host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/prod/app/db/port&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/prod/app/api/key&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      # SecureString&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/staging/app/db/host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/dev/app/db/host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 경로 아래 모든 파라미터 조회&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-parameters-by-path&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --path&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /prod/app&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --recursive&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --with-decryption&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # SecureString 복호화&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;parameter-타입&quot;&gt;Parameter 타입&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# String (평문)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-parameter&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;/prod/app/db/host&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --value&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;db.prod.internal&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; String&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SecureString (KMS 암호화)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-parameter&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;/prod/app/api/key&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --value&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;sk-xxxx&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; SecureString&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --key-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;alias/prod-params&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# StringList (쉼표 구분)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-parameter&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;/prod/app/allowed-ips&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --value&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;10.0.0.1,10.0.0.2&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; StringList&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;eks-통합-패턴&quot;&gt;EKS 통합 패턴&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;패턴&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;도구&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특징&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;K8s Secret 으로 sync&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;External Secrets Operator&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GitOps 친화&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Pod 에 파일로 마운트&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Secrets Store CSI Driver&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;파일 마운트&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;코드에서 직접 조회&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS SDK + IRSA&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;단순, 캐싱 주의&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# External Secrets Operator 예시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;external-secrets.io/v1beta1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ExternalSecret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;db-credentials&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  refreshInterval&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  secretStoreRef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;aws-secrets-manager&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;SecretStore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  target&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;db-credentials&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;secretKey&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;password&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      remoteRef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;prod/db/credentials&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;password&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cross-region-복제&quot;&gt;Cross-region 복제&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Secret 을 다른 리전에 복제&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secretsmanager&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; replicate-secret-to-regions&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --secret-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;prod/db/credentials&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --add-replica-regions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;[{&quot;Region&quot;:&quot;eu-west-1&quot;}]&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;리전 장애 시에도 비밀 접근 유지. 복제된 시크릿은 읽기 전용 (쓰기는 primary 에만).&lt;/p&gt;
&lt;h2 id=&quot;비용-최적화&quot;&gt;비용 최적화&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;방법&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;절감 효과&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Parameter Store Standard 사용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;비밀이 아닌 설정값에 무료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Secret 캐싱 라이브러리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;API 호출 수 대폭 감소&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;공유 Secret 사용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;여러 환경 값 JSON 으로 통합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;TTL 기반 갱신&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;불필요한 빈번 조회 방지&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;대안-비교&quot;&gt;대안 비교&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;솔루션&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특성&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;적합한 경우&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Secrets Manager&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;자동 회전, 관리형&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 네이티브, 멀티 서비스&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Parameter Store&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;저렴, 계층형&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;설정값, feature flag&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;HashiCorp Vault&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;멀티 클라우드, 세밀한 정책&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;멀티 클라우드, 복잡한 정책&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;환경 변수 (직접)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;단순&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;개발 환경 한정&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Hardcoded fallback 금지&lt;/strong&gt;: 코드에 평문 비밀값 절대 금지. 코드베이스 검색으로 &lt;code&gt;password =&lt;/code&gt; 같은 패턴 CI 차단.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;회전 실패 모니터링 부재&lt;/strong&gt;: rotation Lambda 실패 시 AWSPENDING 상태 고착, 서비스 다운 위험. CloudWatch Alarm + SNS 알림 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 회전 실패 CloudWatch Alarm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudwatch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; put-metric-alarm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --alarm-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;secrets-rotation-failure&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --metric-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;RotationFailed&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --namespace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;AWS/SecretsManager&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --statistic&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Sum&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --period&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 300&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --evaluation-periods&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --threshold&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --comparison-operator&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GreaterThanOrEqualToThreshold&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --alarm-actions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;arn:aws:sns:us-east-1:123:alerts&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Cross-region 없이 단일 리전&lt;/strong&gt;: Secret 은 리전별 서비스. 리전 장애 = 비밀 접근 불가. 크리티컬 서비스는 multi-region 복제.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Parameter Store 4KB 한도&lt;/strong&gt;: 인증서, 큰 JSON 설정은 Advanced (8KB) 또는 Secrets Manager (64KB) 사용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;매 요청마다 GetSecretValue 호출&lt;/strong&gt;: Lambda 가 요청마다 API 호출 시 throttling + 비용 폭증. 전역 캐시 또는 공식 캐싱 라이브러리 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Secret 삭제 즉시 불가&lt;/strong&gt;: &lt;code&gt;DeleteSecret&lt;/code&gt; 기본 복구 기간 30일. 즉시 삭제는 &lt;code&gt;--force-delete-without-recovery&lt;/code&gt; 옵션 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-iam]] - 접근 제어&lt;/li&gt;
&lt;li&gt;[[aws-kms]] - 암호화 키 관리&lt;/li&gt;
&lt;li&gt;[[aws-rds]] - DB 패스워드 회전 대상&lt;/li&gt;
&lt;li&gt;[[aws-lambda]] - Rotation Lambda&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]] - 회전 실패 모니터링&lt;/li&gt;
&lt;li&gt;[[k8s-configmap-secret]] - K8s 시크릿 연동&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>secrets</category><category>parameter-store</category><category>security</category><category>cloud</category><category>rotation</category><author>koa (김신건)</author></item><item><title>[AWS] Security Group vs NACL: stateful vs stateless 방화벽</title><link>https://shinkeonkim.com/wiki/cloud/aws-sg-vs-nacl/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-sg-vs-nacl/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS VPC&lt;/strong&gt; 에는 두 계층의 네트워크 방화벽이 존재.&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;SG (Security Group)&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;NACL (Network ACL)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;상태&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;Stateful&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;Stateless&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;적용 레벨&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ENI / 인스턴스&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Subnet&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;규칙 종류&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;Allow 만&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Allow + Deny&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;규칙 평가&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;모든 규칙 종합&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;번호 순 (첫 매칭)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;기본 Inbound&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;deny all&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;allow all&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;기본 Outbound&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;allow all&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;allow all&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;반환 트래픽&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;자동 허용&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;명시적 설정 필요&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;stateful-vs-stateless-심화&quot;&gt;Stateful vs Stateless 심화&lt;/h2&gt;
&lt;h3 id=&quot;stateful-security-group&quot;&gt;Stateful: Security Group&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client-&gt;&gt;SG: &quot;TCP SYN (port 80, inbound)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SG-&gt;&gt;Server: forward (inbound rule 일치)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over SG: &quot;connection 상태 추적&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Server-&gt;&gt;SG: &quot;TCP SYN-ACK (ephemeral port, outbound)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SG--&gt;&gt;Client: &quot;forward (상태 추적, outbound 규칙 검사 안 함)&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SG 는 연결 상태를 추적. Inbound 를 허용하면 그 연결의 응답은 &lt;em&gt;자동으로&lt;/em&gt; 허용. Outbound 규칙을 닫아도 기존 연결 응답은 통과.&lt;/p&gt;
&lt;h3 id=&quot;stateless-nacl&quot;&gt;Stateless: NACL&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client-&gt;&gt;NACL: &quot;TCP SYN (port 443, inbound)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NACL-&gt;&gt;Server: &quot;inbound rule 100: allow 443 -&gt; 통과&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Server-&gt;&gt;NACL: &quot;TCP SYN-ACK (ephemeral port 32768, outbound)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NACL-&gt;&gt;NACL: &quot;outbound rule 검사: 1024-65535 허용? -&gt; 확인&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NACL--&gt;&gt;Client: &quot;outbound rule 있어야 통과&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NACL 은 &lt;strong&gt;각 패킷을 독립적으로 검사&lt;/strong&gt;. 응답 트래픽도 별도 outbound rule 필요. 특히 &lt;em&gt;ephemeral port&lt;/em&gt; 처리가 핵심.&lt;/p&gt;
&lt;h2 id=&quot;ephemeral-port-이해&quot;&gt;Ephemeral Port 이해&lt;/h2&gt;
&lt;p&gt;클라이언트가 서버에 요청할 때 임시 포트를 사용:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt;: 32768-60999&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: 49152-65535&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS 권장&lt;/strong&gt;: 1024-65535&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# NACL Outbound rule (올바른 설정)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Rules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;RuleNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Direction&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;outbound&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;allow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    PortRange&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;From&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1024&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;To&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;65535&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ephemeral ports&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CidrBlock&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 이것만 있으면 Inbound 요청의 응답도 통과&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;NACL 에서 ephemeral port 누락&lt;/strong&gt; = 응답이 차단. NACL outbound 에 반드시 1024-65535 포트 범위 허용 규칙 추가.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;security-group-규칙&quot;&gt;Security Group 규칙&lt;/h2&gt;
&lt;h3 id=&quot;기본-설정-패턴&quot;&gt;기본 설정 패턴&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 웹 서버 Security Group&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;WebServerSG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Inbound&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      CidrIp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;         # 인터넷에서 HTTPS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      CidrIp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;         # 인터넷에서 HTTP (리다이렉트용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Outbound&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-1&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;               # 모든 아웃바운드 (기본)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      CidrIp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# DB 서버 Security Group&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;DatabaseSG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Inbound&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5432&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      SourceSecurityGroupId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sg-webserver&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 웹 SG 에서만 PostgreSQL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Outbound&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      CidrIp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sg-referencing-sg-핵심-기능&quot;&gt;SG Referencing SG (핵심 기능)&lt;/h3&gt;
&lt;p&gt;IP 대신 다른 SG 를 source/destination 으로 지정. Dynamic IP 환경에서 강력.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;DatabaseSG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Inbound&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5432&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      SourceSecurityGroupId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sg-app&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;         # app SG 가진 ENI 만 허용&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AppInstance[&quot;앱 EC2&amp;#x3C;br/&gt;sg-app&quot;] --&gt;|&quot;port 5432&quot;| DB[&quot;RDS&amp;#x3C;br/&gt;sg-db&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DB -.-&gt;|&quot;sg-app 만 허용&quot;| DB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Internet[&quot;인터넷&quot;] -.-x|&quot;차단&quot;| DB&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auto Scaling 으로 앱 인스턴스 IP 가 변해도 &lt;code&gt;sg-app&lt;/code&gt; 이 붙어있으면 자동 허용. &lt;em&gt;IP 추적 불필요&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;nacl-규칙-작성&quot;&gt;NACL 규칙 작성&lt;/h2&gt;
&lt;h3 id=&quot;번호-순-평가&quot;&gt;번호 순 평가&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;NACL Inbound Rules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RuleNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ALLOW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    PortRange&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CidrBlock&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RuleNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ALLOW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    PortRange&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1024-65535&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # ephemeral ports (응답)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CidrBlock&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RuleNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DENY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CidrBlock&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1.2.3.4/32&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 악의적 IP 차단&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RuleNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;32767&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DENY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-1&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;             # 기본 모두 차단&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CidrBlock&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
번호가 낮을수록 먼저 평가. 첫 번째 일치 규칙으로 결정. 100번에 ALLOW, 200번에 같은 IP 의 DENY 가 있으면 100번 ALLOW 가 우선.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;특정-ip-차단-nacl-만-가능&quot;&gt;특정 IP 차단 (NACL 만 가능)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;NACL Rules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RuleNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DENY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CidrBlock&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1.2.3.0/24&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 악성 IP 범위 차단&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  RuleNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ALLOW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    CidrBlock&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 나머지 허용&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SG 는 Allow 만 지원하므로 특정 IP 차단에는 NACL 사용.&lt;/p&gt;
&lt;h2 id=&quot;패킷-흐름-전체-평가-순서&quot;&gt;패킷 흐름: 전체 평가 순서&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Internet[&quot;인터넷&quot;] --&gt;|&quot;요청&quot;| NACL_In[&quot;NACL Inbound&amp;#x3C;br/&gt;(번호 순 평가)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NACL_In --&gt;|&quot;ALLOW&quot;| SG_In[&quot;SG Inbound&amp;#x3C;br/&gt;(모든 규칙 종합)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SG_In --&gt;|&quot;ALLOW&quot;| Instance[&quot;EC2 / RDS&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Instance --&gt;|&quot;응답&quot;| SG_Out[&quot;SG Outbound&amp;#x3C;br/&gt;(stateful - 자동)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SG_Out --&gt;|&quot;ALLOW&quot;| NACL_Out[&quot;NACL Outbound&amp;#x3C;br/&gt;(번호 순, ephemeral)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NACL_Out --&gt;|&quot;ALLOW&quot;| Internet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;패킷이 통과하려면 NACL + SG 모두 통과해야 함.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;레이어드-보안-설계&quot;&gt;레이어드 보안 설계&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[인터넷]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[NACL - subnet 경계]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; - 악성 IP 차단 (Deny)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; - 허용 포트 제한&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Security Group - 인스턴스 경계]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; - 세밀한 포트 제어&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; - SG-to-SG 참조&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[EC2/RDS/Lambda]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;실전 사용 패턴&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NACL&lt;/strong&gt;: subnet 레벨 coarse-grained 제어, 악성 IP 차단, 간단한 화이트리스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SG&lt;/strong&gt;: 인스턴스 레벨 fine-grained 제어, SG 참조, 대부분의 방화벽 규칙&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;변경-즉시-반영&quot;&gt;변경 즉시 반영&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SG 변경&lt;/strong&gt;: &lt;em&gt;즉시 반영&lt;/em&gt;. 새로운 연결에 바로 적용. 기존 연결은 stateful 로 유지.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NACL 변경&lt;/strong&gt;: &lt;em&gt;즉시 반영&lt;/em&gt;. 단, 기존 연결의 다음 패킷부터.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SG 인바운드 규칙 추가&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; authorize-security-group-ingress&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --group-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sg-12345&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --protocol&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tcp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --port&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 443&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --cidr&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0.0.0.0/0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# NACL 규칙 추가&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ec2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-network-acl-entry&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --network-acl-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; acl-12345&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --rule-number&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --protocol&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --rule-action&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; allow&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --ingress&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --port-range&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; From=443,To=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;443&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --cidr-block&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0.0.0.0/0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;session-manager-vs-ssh-sg-설계&quot;&gt;Session Manager vs SSH: SG 설계&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
SSH 포트 22 를 인터넷에 오픈하지 말 것. &lt;strong&gt;AWS Systems Manager Session Manager&lt;/strong&gt; 사용 시 SSH 포트 전혀 불필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 잘못된 설계 (SSH 공개)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;IngressRules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;22, CidrIp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 즉시 공격 대상&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 올바른 설계 (Session Manager)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;IngressRules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: []                    &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 인바운드 없음&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;EgressRules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;443, CidrIp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0.0.0.0/0&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # SSM endpoint 접근용&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;비용&quot;&gt;비용&lt;/h2&gt;
&lt;p&gt;SG 와 NACL 모두 &lt;strong&gt;추가 비용 없음&lt;/strong&gt;. VPC 의 기본 포함 기능.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;NACL ephemeral port 누락&lt;/strong&gt;: Stateless NACL 에서 응답 포트 (1024-65535) outbound 허용 없으면 응답 차단. SG 는 자동이지만 NACL 은 수동.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;SG outbound 모두 닫기&lt;/strong&gt;: 일반적으로 outbound 는 모두 허용. 닫으면 외부 API 호출, DNS 조회 모두 차단. stateful 이므로 inbound 응답은 별개.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;너무 넓은 0.0.0.0/0 inbound&lt;/strong&gt;: SSH/RDP 를 인터넷에 열면 즉시 brute force 공격 대상. Session Manager, Bastion Host, IP 제한 중 선택.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;SG 변경 후 기존 연결&lt;/strong&gt;: SG 는 stateful 이므로 규칙 변경 후에도 기존 연결은 유지. 즉시 차단이 필요하면 인스턴스 재시작 또는 연결 강제 종료.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;NACL 규칙 번호 간격&lt;/strong&gt;: 10, 20, 30 처럼 촘촘하게 쓰면 중간 삽입 불가. 100, 200, 300 처럼 여유있게 번호 부여.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;SG 규칙 상한&lt;/strong&gt;: 기본 60개 inbound + 60개 outbound. 너무 세분화된 규칙은 SG 여러 개로 분리하거나 NACL 사용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-vpc]] - VPC 네트워크 구조&lt;/li&gt;
&lt;li&gt;[[aws-ec2]] - Security Group 적용 대상&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb]] - LB 앞단 SG 설계&lt;/li&gt;
&lt;li&gt;[[aws-rds]] - DB SG 격리 패턴&lt;/li&gt;
&lt;li&gt;[[aws-iam]] - 네트워크 외 접근 제어&lt;/li&gt;
&lt;li&gt;[[k8s-network-policy]] - K8s 네트워크 정책 (대조)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>security</category><category>network</category><category>vpc</category><category>cloud</category><category>firewall</category><author>koa (김신건)</author></item><item><title>[AWS] SNS: pub-sub 알림, fan-out 패턴</title><link>https://shinkeonkim.com/wiki/cloud/aws-sns/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-sns/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SNS (Simple Notification Service)&lt;/strong&gt; = &lt;em&gt;pub-sub 메시징&lt;/em&gt;. Publisher 가 Topic 에 발행하면 모든 Subscriber 에 &lt;em&gt;동시에 fan-out&lt;/em&gt;. 알림, 이벤트 배포, 마이크로서비스 디커플링에 활용.&lt;/p&gt;
&lt;h2 id=&quot;구조&quot;&gt;구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    P[&quot;Publisher&amp;#x3C;br/&gt;(앱, AWS 서비스)&quot;] --&gt;|&quot;Publish&quot;| Topic[&quot;SNS Topic&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S1[&quot;SQS Queue&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S2[&quot;Lambda&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S3[&quot;Email&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S4[&quot;SMS / Mobile Push&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S5[&quot;HTTP/HTTPS&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S6[&quot;Kinesis Firehose&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: SNS 자체는 &lt;em&gt;메시지를 저장하지 않음&lt;/em&gt;. 전달 후 소멸. 내구성 필요하면 SQS 구독.&lt;/p&gt;
&lt;h2 id=&quot;subscriber-종류&quot;&gt;Subscriber 종류&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;종류&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;사용 케이스&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;내구성&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-sqs&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQS]]&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;큐 fan-out, 내구성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-lambda&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lambda]]&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;비동기 처리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Email&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;운영 알림&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;SMS&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;모바일 알림&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Mobile Push&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;APNS, FCM&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;HTTP/HTTPS&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Webhook&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Kinesis Firehose&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;데이터 파이프라인&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;높음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;standard-vs-fifo-topic&quot;&gt;Standard vs FIFO Topic&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Standard Topic&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;FIFO Topic&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;메시지 순서&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;best-effort&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;엄격 (MessageGroupId)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;중복&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;5분 중복 제거&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;처리량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무제한 (초당 수십만)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;300 TPS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;구독 가능 타입&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;전부&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;SQS FIFO 만&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;이름 접미사&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;.fifo&lt;/code&gt; 필수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;비용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;표준&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;약간 높음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# FIFO Topic 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sns&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-topic&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;OrderEvents.fifo&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attributes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&quot;FifoTopic&quot;:&quot;true&quot;,&quot;ContentBasedDeduplication&quot;:&quot;true&quot;}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;message-filtering&quot;&gt;Message Filtering&lt;/h2&gt;
&lt;p&gt;Subscriber 마다 FilterPolicy 로 받을 메시지 선택. Topic 이 전부 보내도 필터에 맞는 것만 전달.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;FilterPolicy&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;event_type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;order.created&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;order.paid&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;region&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;us-east-1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;us-west-2&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;amount&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{ &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;numeric&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic[&quot;SNS Topic&quot;] --&gt; S1[&quot;SQS: 주문처리&amp;#x3C;br/&gt;event_type=[order.created]&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S2[&quot;SQS: 정산&amp;#x3C;br/&gt;event_type=[order.paid]&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; S3[&quot;Lambda: 분석&amp;#x3C;br/&gt;필터 없음 (전부)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;FilterPolicy 매칭 방식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;문자열 정확 일치: &lt;code&gt;[&quot;value1&quot;, &quot;value2&quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;숫자 범위: &lt;code&gt;[{&quot;numeric&quot;: [&quot;&gt;&quot;, 100, &quot;&amp;#x3C;=&quot;, 500]}]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;prefix 매칭: &lt;code&gt;[{&quot;prefix&quot;: &quot;order.&quot;}]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;exists: &lt;code&gt;[{&quot;exists&quot;: true}]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;필터 없음: 모든 메시지 수신&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
FilterPolicy 잘못 설정 시 메시지 silently drop. CloudWatch &lt;code&gt;NumberOfNotificationsFilteredOut&lt;/code&gt; 메트릭 모니터링 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;sns--sqs-fan-out-패턴&quot;&gt;SNS + SQS Fan-out 패턴&lt;/h2&gt;
&lt;p&gt;SNS 의 fan-out + SQS 의 내구성 결합. 가장 많이 쓰이는 패턴.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OrderSvc[&quot;Order Service&quot;] --&gt;|&quot;OrderCreated 이벤트&quot;| Topic[&quot;SNS Topic&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; Q1[&quot;SQS: 배송처리&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; Q2[&quot;SQS: 분석&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Topic --&gt; Q3[&quot;SQS: 알림&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt; ShippingLambda[&quot;배송 처리 Lambda&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt; AnalyticsLambda[&quot;분석 Lambda&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q3 --&gt; NotifyLambda[&quot;알림 Lambda&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;이점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;독립 스케일링&lt;/strong&gt;: 각 SQS / Lambda 독립 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;내구성&lt;/strong&gt;: SQS 에 메시지 보존, 처리 실패 시 재시도&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디커플링&lt;/strong&gt;: Order Service 는 하위 서비스 모름&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DLQ&lt;/strong&gt;: 각 SQS 에 Dead Letter Queue 연결 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dead-letter-queue-설정&quot;&gt;Dead Letter Queue 설정&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SNS Subscription 에 DLQ 설정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sns&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set-subscription-attributes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --subscription-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;arn:aws:sns:...&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attribute-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RedrivePolicy&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attribute-value&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;deadLetterTargetArn&quot;: &quot;arn:aws:sqs:us-east-1:123:sns-dlq&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DLQ 는 전달 실패 메시지 보관. 실패 원인 분석 후 재처리.&lt;/p&gt;
&lt;h2 id=&quot;lambda-통합-동시성-주의&quot;&gt;Lambda 통합: 동시성 주의&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant SNS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Lambda&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SNS-&gt;&gt;Lambda: 배치 (최대 10,000 메시지 burst)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Lambda--&gt;&gt;SNS: 처리 중 (동시 실행 증가)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over Lambda: 계정 동시성 한도 도달 시 throttling&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SNS-&gt;&gt;Lambda: 재시도 (exponential backoff)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over SNS: 최대 3번 재시도, 실패 시 DLQ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
SNS -&gt; Lambda 직접 연결 시 대량 메시지에 Lambda 동시성 폭증. SQS 버퍼를 중간에 넣어 조절 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;http-구독-서명-검증&quot;&gt;HTTP 구독: 서명 검증&lt;/h2&gt;
&lt;p&gt;SNS 는 HTTP endpoint 에 메시지 전송 시 서명 포함.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; json, base64, urllib.request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cryptography.hazmat.primitives &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hashes, serialization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cryptography.hazmat.primitives.asymmetric &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; padding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; verify_sns_signature&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(message: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) -&gt; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # SigningCertURL 에서 인증서 다운로드&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cert_url &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; message[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;SigningCertURL&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # SNS URL 검증&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    assert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cert_url.startswith(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;https://sns.&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Invalid cert URL&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 서명 검증 (cryptography 라이브러리 사용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
HTTP endpoint 는 SNS 인척 위조 가능. 반드시 SNS 서명 검증 구현.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;메시지-구조&quot;&gt;메시지 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Notification&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;MessageId&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;12345&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;TopicArn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:sns:us-east-1:123:OrderEvents&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Subject&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Order Created&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Message&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;orderId&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;o-001&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;amount&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:150}&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Timestamp&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2026-07-15T10:00:00.000Z&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;MessageAttributes&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;event_type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;String&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Value&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;order.created&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Raw Message Delivery&lt;/strong&gt;: SQS / HTTP 구독에서 SNS 래퍼 없이 원본 메시지만 전달. SQS 에서 &lt;code&gt;json.loads&lt;/code&gt; 두 번 하는 실수 방지.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Raw delivery 활성화&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sns&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set-subscription-attributes&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --subscription-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;arn:aws:sns:...&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attribute-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RawMessageDelivery&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --attribute-value&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;비용-구조&quot;&gt;비용 구조&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;비용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;API 요청 (Publish)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.50/million&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;SQS 전달&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Lambda 전달&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Email 전달&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;처음 1,000 건 무료, 이후 $2/100k&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;SMS (한국)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.0843/건&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;HTTP/HTTPS 전달&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;처음 100k 건 무료, 이후 $0.60/million&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Mobile Push&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;처음 100만 건 무료&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;비용 최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQS/Lambda 구독 선호 (무료)&lt;/li&gt;
&lt;li&gt;SMS 는 Direct SMS 대신 SNS + Mobile Push 고려&lt;/li&gt;
&lt;li&gt;Message Filtering 으로 불필요한 메시지 전달 줄임&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sns-vs-대안-비교&quot;&gt;SNS vs 대안 비교&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;서비스&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특성&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;적합한 경우&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;SNS&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;단순 fan-out, 저렴, 고처리량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;알림 발송, fan-out&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;**[[aws-eventbridge&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EventBridge]]**&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;복잡한 라우팅, schema registry, SaaS 통합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;**[[aws-sqs&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQS]]**&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;큐, pull 기반, 내구성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Kinesis&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;스트리밍, 재처리 가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;대용량 스트림, 분석&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;실전 선택 기준&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;단순 알림 / 높은 fan-out -&gt; SNS&lt;/li&gt;
&lt;li&gt;복잡한 이벤트 라우팅 / 외부 SaaS 연동 -&gt; EventBridge&lt;/li&gt;
&lt;li&gt;순서 보장 / 내구성 / consumer 속도 제어 -&gt; SQS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-패턴-주문-이벤트-처리&quot;&gt;실전 패턴: 주문 이벤트 처리&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; boto3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sns &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; boto3.client(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;sns&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; publish_order_event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(order_id: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, event_type: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, amount: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    sns.publish(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        TopicArn&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;arn:aws:sns:us-east-1:123:OrderEvents&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        Message&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;json.dumps({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;orderId&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: order_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;amount&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: amount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        Subject&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;event_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        MessageAttributes&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;event_type&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;DataType&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;String&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;StringValue&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: event_type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;amount&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;DataType&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Number&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;StringValue&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;HTTP subscriber 서명 검증 누락&lt;/strong&gt;: SNS 에서 온 척 위조 webhook 가능. 반드시 &lt;code&gt;SigningCertURL&lt;/code&gt; 에서 인증서 받아 서명 검증.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Standard topic 중복 메시지&lt;/strong&gt;: at-least-once 전달. Subscriber 는 &lt;em&gt;idempotent&lt;/em&gt; 로 설계. &lt;code&gt;MessageId&lt;/code&gt; 로 중복 처리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;SNS -&gt; Lambda 직접: 동시성 폭증&lt;/strong&gt;: 대량 이벤트 시 Lambda 동시성 한도 초과. SQS 버퍼 삽입으로 back-pressure 적용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;DLQ 미설정&lt;/strong&gt;: 전달 실패 메시지 손실. SNS Subscription 에 SQS DLQ 설정 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;FIFO Topic - SQS FIFO 만 구독 가능&lt;/strong&gt;: Email, HTTP, Lambda, SMS 는 FIFO Topic 구독 불가. FIFO 순서 보장 필요 시 SQS FIFO 경유.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;FilterPolicy 비어있음 vs 없음&lt;/strong&gt;: &lt;code&gt;{}&lt;/code&gt; (빈 FilterPolicy) = 모든 메시지 차단. Attribute 없는 메시지도 차단. 없애거나 속성이 없어도 통과하도록 설정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-sqs]] - 큐 내구성 결합 (fan-out 패턴)&lt;/li&gt;
&lt;li&gt;[[aws-lambda]] - 서버리스 subscriber&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge]] - 복잡한 이벤트 라우팅 대안&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch]] - 메시지 전달 메트릭&lt;/li&gt;
&lt;li&gt;[[aws-iam]] - Topic 접근 제어&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>sns</category><category>pubsub</category><category>cloud</category><category>messaging</category><category>fanout</category><author>koa (김신건)</author></item><item><title>[AWS] CloudFormation</title><link>https://shinkeonkim.com/wiki/cloud/aws-cloudformation/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-cloudformation/</guid><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS CloudFormation&lt;/strong&gt; 은 JSON 또는 YAML 템플릿으로 AWS 인프라를 &lt;strong&gt;선언적으로 프로비저닝&lt;/strong&gt;하는 IaC (Infrastructure as Code) 서비스입니다. 원하는 최종 상태를 기술하면 CloudFormation 이 생성/수정/삭제를 순서에 맞게 자동으로 수행합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: “YAML/JSON 로 AWS 리소스를 선언하면, CloudFormation 이 의존성을 분석해 올바른 순서로 만들어준다”.&lt;/p&gt;
&lt;h2 id=&quot;왜-cloudformation-인가&quot;&gt;왜 CloudFormation 인가&lt;/h2&gt;
&lt;h3 id=&quot;수동-콘솔-조작의-문제&quot;&gt;수동 콘솔 조작의 문제&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;재현 불가&lt;/strong&gt;: 콘솔 클릭 내용은 기억 의존. 새 환경 구성 매번 다르게 됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;드리프트&lt;/strong&gt;: 누군가 콘솔에서 수정 → 개발/스테이징/프로덕션 환경 간 차이 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;감사 어려움&lt;/strong&gt;: 누가 언제 무엇을 바꿨는지 추적 불가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;삭제 어려움&lt;/strong&gt;: 어떤 리소스가 세트인지 몰라 삭제 시 일부 누락&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cloudformation-접근&quot;&gt;CloudFormation 접근&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;코드로 상태 관리&lt;/strong&gt;: Git 저장소에 템플릿 → 버전 관리 + PR 리뷰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;반복 가능한 배포&lt;/strong&gt;: 같은 템플릿으로 Dev / Staging / Prod 동일하게 구성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drift Detection&lt;/strong&gt;: 실제 상태와 템플릿 차이 자동 감지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rollback&lt;/strong&gt;: 업데이트 실패 시 이전 상태 자동 복원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;의존성 자동 처리&lt;/strong&gt;: RDS 가 VPC 보다 먼저 생성되지 않도록 자동 순서 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;핵심-개념&quot;&gt;핵심 개념&lt;/h2&gt;
&lt;h3 id=&quot;stack&quot;&gt;Stack&lt;/h3&gt;
&lt;p&gt;CloudFormation 의 &lt;strong&gt;배포 + 관리 단위&lt;/strong&gt;. 하나의 템플릿이 하나의 Stack 에 대응.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;리소스들을 하나의 단위로 생성 / 수정 / 삭제&lt;/li&gt;
&lt;li&gt;Stack 삭제 → 포함된 모든 리소스 삭제 (&lt;code&gt;DeletionPolicy: Retain&lt;/code&gt; 예외)&lt;/li&gt;
&lt;li&gt;Stack 이름은 리전 내 고유&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Stack 상태&lt;/strong&gt;:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;상태&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;CREATE_COMPLETE&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;생성 완료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;UPDATE_IN_PROGRESS&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;업데이트 중&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;UPDATE_ROLLBACK_COMPLETE&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;업데이트 실패, 롤백 완료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;DELETE_FAILED&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;삭제 실패 (리소스 의존성 등)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;stackset&quot;&gt;StackSet&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;여러 AWS 계정 + 여러 리전&lt;/strong&gt; 에 동일 스택 배포. 조직 전체 보안 기준선 적용에 활용.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Management Account (Admin)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── StackSet &quot;SecurityBaseline&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── Account A, us-east-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── Account A, ap-northeast-2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── Account B, us-east-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── Account B, ap-northeast-2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AWS Organizations 통합 시 신규 계정 자동 포함 가능.&lt;/p&gt;
&lt;h3 id=&quot;changeset&quot;&gt;ChangeSet&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;배포 전 변경 미리보기&lt;/strong&gt;. 실제 적용 전에 “무엇이 어떻게 바뀌는지” 확인.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ChangeSet 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-change-set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --stack-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-stack&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --template-body&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; file://template.yaml&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --change-set-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-changes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 변경 내용 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; describe-change-set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --change-set-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-changes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 실제 적용&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; execute-change-set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --change-set-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-changes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CI/CD 파이프라인에서 ChangeSet 생성 → 검토 게이트 → Execute 흐름을 권장합니다.&lt;/p&gt;
&lt;h2 id=&quot;아키텍처--라이프사이클&quot;&gt;아키텍처 / 라이프사이클&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Template[&quot;YAML / JSON 템플릿&quot;] --&gt;|create-stack| CFN[&quot;CloudFormation&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  CFN --&gt;|프로비저닝| Resources[&quot;AWS 리소스들&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Resources -.-&gt;|&quot;Drift Detection&quot;| CFN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  CFN --&gt;|update-stack| Resources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  CFN --&gt;|delete-stack| Delete[&quot;리소스 삭제&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;stackset-배포-구조&quot;&gt;StackSet 배포 구조&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Admin[&quot;Management Account&quot;] --&gt;|StackSet| SA[&quot;Stack Instance A&amp;#x3C;br/&gt;계정 111&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Admin --&gt;|StackSet| SB[&quot;Stack Instance B&amp;#x3C;br/&gt;계정 222&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Admin --&gt;|StackSet| SC[&quot;Stack Instance C&amp;#x3C;br/&gt;계정 333&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  SA --&gt; ResA[리소스들]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  SB --&gt; ResB[리소스들]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  SC --&gt; ResC[리소스들]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;템플릿-구조&quot;&gt;템플릿 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;AWSTemplateFormatVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;2010-09-09&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;앱 인프라 스택&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 배포 시 입력 받는 파라미터&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Parameters&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  Environment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;String&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    AllowedValues&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;dev&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;staging&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;prod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  InstanceType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;String&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;t3.small&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 조건식 (Intrinsic Function 조합)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Conditions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  IsProd&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Equals&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Ref&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Environment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;prod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 필수 섹션: 실제 리소스 정의&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Resources&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  MyBucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS::S3::Bucket&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Properties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      BucketName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Sub&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;${AWS::StackName}-data-${AWS::Region}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      VersioningConfiguration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        Status&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!If&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;IsProd&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Enabled&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Suspended&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    DeletionPolicy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Retain&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 스택 삭제 시 버킷 보존&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  LambdaRole&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS::IAM::Role&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Properties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      AssumeRolePolicyDocument&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        Version&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;2012-10-17&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        Statement&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Effect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Allow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;            Principal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;              Service&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;lambda.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;            Action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;sts:AssumeRole&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      ManagedPolicyArns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  MyFunction&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS::Lambda::Function&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Properties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      FunctionName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Sub&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;${AWS::StackName}-handler&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Runtime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;nodejs20.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;index.handler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        S3Bucket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Ref&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MyBucket&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        S3Key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;lambda.zip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Role&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!GetAtt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LambdaRole.Arn&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 다른 리소스 속성 참조&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    DependsOn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;LambdaRole&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 다른 스택에서 참조할 수 있도록 내보내기&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Outputs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  BucketName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Value&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Ref&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MyBucket&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Export&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Sub&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;${AWS::StackName}-BucketName&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  FunctionArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Value&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!GetAtt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MyFunction.Arn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;intrinsic-functions&quot;&gt;Intrinsic Functions&lt;/h2&gt;























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;함수&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;용도&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Ref&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;리소스 ID / 파라미터 값 참조&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Ref MyBucket&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!GetAtt&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;리소스 속성 참조&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!GetAtt LambdaRole.Arn&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Sub&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;문자열 치환 (변수 포함)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Sub &apos;${AWS::StackName}-bucket&apos;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!If&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;조건 분기&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!If [IsProd, Enabled, Disabled]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Join&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;문자열 결합&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Join [&apos;-&apos;, [a, b, c]]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Select&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;목록에서 선택&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Select [0, !GetAZs &apos;&apos;]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!ImportValue&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;다른 스택 Output 참조&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!ImportValue OtherStack-BucketName&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Split&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;문자열 분리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!Split [&apos;,&apos;, !Ref CsvList]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!FindInMap&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Mappings 섹션 값 조회&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;!FindInMap [RegionMap, !Ref AWS::Region, AMI]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;pseudo-parameters-자동-제공&quot;&gt;Pseudo Parameters (자동 제공)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;${AWS::AccountId}&lt;/code&gt;: 현재 계정 ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${AWS::Region}&lt;/code&gt;: 현재 리전&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${AWS::StackName}&lt;/code&gt;: 현재 스택 이름&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${AWS::StackId}&lt;/code&gt;: 스택 ARN&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${AWS::NoValue}&lt;/code&gt;: 속성 제거 (Condition 과 함께 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;drift-detection&quot;&gt;Drift Detection&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Drift&lt;/strong&gt;: 템플릿 정의와 실제 리소스 상태의 차이.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Drift 감지 시작&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; detect-stack-drift&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --stack-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-stack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 감지 상태 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; describe-stack-drift-detection-status&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --stack-drift-detection-id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 드리프트된 리소스 상세 보기&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cloudformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; describe-stack-resource-drifts&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --stack-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-stack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Drift 주요 원인&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;누군가 AWS 콘솔에서 수동으로 설정 변경&lt;/li&gt;
&lt;li&gt;외부 스크립트 / Terraform 등 다른 도구로 리소스 수정&lt;/li&gt;
&lt;li&gt;AWS 서비스 자동 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Drift 감지는 자동 아님&lt;/strong&gt;. 수동 실행 또는 Lambda + EventBridge 로 주기적 스캔 설정 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;rollback&quot;&gt;Rollback&lt;/h2&gt;
&lt;p&gt;스택 업데이트 중 실패 → &lt;strong&gt;이전 상태 자동 복원&lt;/strong&gt; (기본).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 상태 전이&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UPDATE_IN_PROGRESS&lt;/code&gt; → 실패 → &lt;code&gt;UPDATE_ROLLBACK_IN_PROGRESS&lt;/code&gt; → &lt;code&gt;UPDATE_ROLLBACK_COMPLETE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UPDATE_ROLLBACK_FAILED&lt;/code&gt;: 롤백 자체도 실패. &lt;code&gt;continue-update-rollback&lt;/code&gt; 명령 + 수동 복구 필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;DisableRollback&lt;/code&gt;&lt;/strong&gt; 옵션으로 실패 시 리소스 보존 가능 (디버그용, 프로덕션 비권장).&lt;/p&gt;
&lt;h2 id=&quot;nested-stacks-vs-cross-stack-references&quot;&gt;Nested Stacks vs Cross-Stack References&lt;/h2&gt;
&lt;h3 id=&quot;nested-stacks&quot;&gt;Nested Stacks&lt;/h3&gt;
&lt;p&gt;부모 스택이 자식 스택을 리소스로 포함하는 방식:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# parent-stack.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Resources&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  NetworkStack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS::CloudFormation::Stack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Properties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      TemplateURL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;https://s3.amazonaws.com/my-bucket/network.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  AppStack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS::CloudFormation::Stack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Properties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      TemplateURL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;https://s3.amazonaws.com/my-bucket/app.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Parameters&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        VpcId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!GetAtt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; NetworkStack.Outputs.VpcId&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;: 단일 배포 단위, 부모 업데이트로 전체 라이프사이클 관리.
&lt;strong&gt;단점&lt;/strong&gt;: 중첩 깊이 제한 (10 수준), 자식 스택도 스택 한도 (2000개/리전) 에 포함.&lt;/p&gt;
&lt;h3 id=&quot;cross-stack-references&quot;&gt;Cross-Stack References&lt;/h3&gt;
&lt;p&gt;별도 스택 간 &lt;code&gt;Export&lt;/code&gt; / &lt;code&gt;ImportValue&lt;/code&gt; 로 값 전달:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# network-stack.yaml Outputs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Outputs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  VpcId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Value&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Ref&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MyVPC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Export&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!Sub&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;${AWS::StackName}-VpcId&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# app-stack.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Resources&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  MyInstance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    Properties&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      VpcId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!ImportValue&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;network-stack-VpcId&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;: 스택 독립 배포, 팀별 소유권 분리, 변경 충격 격리.
&lt;strong&gt;단점&lt;/strong&gt;: 다른 스택이 ImportValue 중인 Export 삭제 불가, 리전 간 교차 참조 불가.&lt;/p&gt;
&lt;h2 id=&quot;cdk-와의-관계&quot;&gt;CDK 와의 관계&lt;/h2&gt;
&lt;p&gt;[[aws-cdk|AWS CDK]] 는 TypeScript / Python 등 프로그래밍 언어로 인프라를 정의하고, 내부적으로 CloudFormation 템플릿을 생성해 배포합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;CDK 코드 (TypeScript)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    → cdk synth&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    → CloudFormation 템플릿 (YAML)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    → cdk deploy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    → CloudFormation 스택 생성&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    → AWS 리소스&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CDK 는 CloudFormation 의 &lt;strong&gt;프로그래밍 언어 인터페이스&lt;/strong&gt;입니다. 실제 프로비저닝 엔진은 CloudFormation 이며, AWS 콘솔의 CloudFormation 스택에서 CDK 배포 결과를 확인할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;cloudformation-vs-대안-iac&quot;&gt;CloudFormation vs 대안 IaC&lt;/h2&gt;
&lt;p&gt;| 축 | CloudFormation | [[terraform|Terraform]] | [[aws-cdk|CDK]] | [[pulumi|Pulumi]] |
|:---|:---|:---|:---|:---|
| &lt;strong&gt;제공사&lt;/strong&gt; | AWS 관리형 | HashiCorp / OpenTofu | AWS | Pulumi Corp |
| &lt;strong&gt;언어&lt;/strong&gt; | YAML / JSON | HCL | TS / Python / Java / Go | TS / Python / Go / C# |
| &lt;strong&gt;대상 클라우드&lt;/strong&gt; | AWS 전용 | Multi-cloud | AWS 위주 | Multi-cloud |
| &lt;strong&gt;State 관리&lt;/strong&gt; | CFN 서비스 내장 | 자체 tfstate 파일 | CFN 서비스 내장 | Pulumi Cloud |
| &lt;strong&gt;변경 미리보기&lt;/strong&gt; | ChangeSet | &lt;code&gt;terraform plan&lt;/code&gt; | &lt;code&gt;cdk diff&lt;/code&gt; | &lt;code&gt;pulumi preview&lt;/code&gt; |
| &lt;strong&gt;새 AWS 서비스&lt;/strong&gt; | 즉시 지원 | Provider 업데이트 필요 | 즉시 지원 | Provider 업데이트 필요 |
| &lt;strong&gt;타입 안전성&lt;/strong&gt; | 없음 | HCL 제한적 | 완전 (TS) | 완전 |
| &lt;strong&gt;테스트&lt;/strong&gt; | 어려움 | terratest | jest / pytest | 언어 내장 |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;판단 기준&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS-only, AWS 관리 상태 선호, YAML 거부감 없음 → &lt;strong&gt;CloudFormation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AWS-only + 개발자 친화성 + 타입 안전성 + 테스트 → &lt;strong&gt;CDK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Multi-cloud, 인프라 팀 중심, 넓은 에코시스템 → &lt;strong&gt;Terraform&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Multi-cloud + 완전한 프로그래밍 언어 → &lt;strong&gt;Pulumi&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;비용&quot;&gt;비용&lt;/h2&gt;
&lt;p&gt;CloudFormation 자체는 &lt;strong&gt;무료&lt;/strong&gt;. 생성되는 AWS 리소스 요금만 부과.&lt;/p&gt;
&lt;p&gt;예외:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;StackSets&lt;/strong&gt;: 배포 Operation 당 소량 요금 (서비스 관리형 모드)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudFormation Guard&lt;/strong&gt;: 오픈소스 정책 검사 도구, 실행 비용 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;리소스 Update 가 Replacement 유발&lt;/strong&gt;. &lt;code&gt;UpdateRequiresReplacement&lt;/code&gt; 속성 변경 시 기존 리소스 삭제 후 재생성. 예: RDS 인스턴스 식별자 변경 → DB 데이터 포함 삭제. &lt;strong&gt;ChangeSet 으로 반드시 미리 확인&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;IAM Circular Dependency&lt;/strong&gt;. Lambda → IAM Role → Lambda 처럼 순환 참조 발생 시 스택 생성 교착 상태. &lt;code&gt;DependsOn&lt;/code&gt; 명시 또는 별도 스택으로 분리해 해결.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;스택당 리소스 500개 한계&lt;/strong&gt; (소프트 한도 200개). 대형 인프라는 Nested Stacks 또는 독립 스택 여러 개로 분리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Cross-Stack Export 삭제 불가&lt;/strong&gt;. 다른 스택이 &lt;code&gt;!ImportValue&lt;/code&gt; 로 참조 중인 Export 를 삭제하면 오류. 스택 간 의존성 설계 초기에 명확히 계획.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Rollback 실패 시 수동 복구 필요&lt;/strong&gt;. &lt;code&gt;UPDATE_ROLLBACK_FAILED&lt;/code&gt; 상태에서는 &lt;code&gt;continue-update-rollback&lt;/code&gt; 명령 실행 후 문제 리소스 수동 정리. 해결 못하면 스택이 잠길 수 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Stack 삭제 = 리소스 삭제&lt;/strong&gt;. 실수로 스택 삭제 시 RDS, S3 등 데이터 포함 삭제. 중요 리소스에 &lt;code&gt;DeletionPolicy: Retain&lt;/code&gt; 또는 &lt;code&gt;Snapshot&lt;/code&gt; 설정 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-cdk|CDK]] - CloudFormation 의 프로그래밍 언어 인터페이스&lt;/li&gt;
&lt;li&gt;[[terraform|Terraform]] - 대안 IaC (Multi-cloud)&lt;/li&gt;
&lt;li&gt;[[pulumi|Pulumi]] - 대안 IaC (프로그래밍 언어, Multi-cloud)&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - 리소스 권한 및 Role 정의&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - 중첩 스택 템플릿 / asset 저장&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]] - 스택 이벤트 메트릭&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail|CloudTrail]] - 스택 변경 이력 감사&lt;/li&gt;
&lt;li&gt;[[aws-config|Config]] - 리소스 구성 변경 추적 + 규정 준수&lt;/li&gt;
&lt;li&gt;[[well-architected|Well-Architected]] - IaC 모범 사례&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>iac</category><category>cloudformation</category><category>infrastructure-as-code</category><category>devops</category><author>koa (김신건)</author></item><item><title>[AWS] WAF (Web Application Firewall)</title><link>https://shinkeonkim.com/wiki/cloud/aws-waf/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-waf/</guid><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS WAF (Web Application Firewall)&lt;/strong&gt; 는 HTTP/HTTPS 요청을 검사하는 &lt;strong&gt;Layer 7 방화벽&lt;/strong&gt; 서비스입니다. CloudFront, ALB, API Gateway 등 앞단에 붙어 SQL injection, XSS, 악의적 봇, 비정상 Rate 등을 요청 단위로 차단합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: 개별 웹 요청의 URL, 헤더, 바디, 쿠키를 룰로 필터링하는 앱 계층 방화벽.&lt;/p&gt;
&lt;h2 id=&quot;layer-34-방화벽의-한계&quot;&gt;Layer 3/4 방화벽의 한계&lt;/h2&gt;
&lt;p&gt;[[aws-sg-vs-nacl|Security Group / NACL]] 은 IP/포트/프로토콜 레벨만 처리합니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP URL 경로 기반 차단 불가: &lt;code&gt;/admin&lt;/code&gt; 만 막고 싶어도 IP 막는 수 밖에 없음&lt;/li&gt;
&lt;li&gt;요청 헤더/바디 검사 불가: SQL injection payload 감지 없음&lt;/li&gt;
&lt;li&gt;사용자별 Rate Limit 불가: 동일 IP 에서 초당 1000 요청이 와도 허용&lt;/li&gt;
&lt;li&gt;국가/지역 기반 필터 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WAF 는 HTTP 요청을 7계층에서 분해해서 룰과 매칭합니다.&lt;/p&gt;
&lt;h2 id=&quot;핵심-개념&quot;&gt;핵심 개념&lt;/h2&gt;
&lt;h3 id=&quot;web-acl&quot;&gt;Web ACL&lt;/h3&gt;
&lt;p&gt;WAF 의 최상위 단위. 여러 &lt;strong&gt;Rule / Rule Group&lt;/strong&gt; 을 포함하고 각 AWS 리소스에 연결합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default Action&lt;/strong&gt;: 매칭 룰 없을 때 &lt;code&gt;Allow&lt;/code&gt; 또는 &lt;code&gt;Block&lt;/code&gt; 결정&lt;/li&gt;
&lt;li&gt;하나의 Web ACL 을 여러 리소스에 공유 가능&lt;/li&gt;
&lt;li&gt;리전 또는 글로벌 (CloudFront 전용) 스코프&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;rule-group&quot;&gt;Rule Group&lt;/h3&gt;
&lt;p&gt;Rule 을 묶는 컨테이너. 우선순위 숫자로 평가 순서 결정 (낮을수록 먼저).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;세 종류&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Managed Rules&lt;/strong&gt;: AWS 관리, 자동 업데이트, 즉시 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Marketplace Rules&lt;/strong&gt;: Fortinet, F5, Imperva 등 3rd-party 벤더&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Rules&lt;/strong&gt;: 직접 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;rule&quot;&gt;Rule&lt;/h3&gt;
&lt;p&gt;매칭 조건 + 액션 단위.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Statement (매칭 조건)&lt;/strong&gt;:&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Statement&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;ByteMatchStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;특정 문자열 포함 여부&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;SqliMatchStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQL injection 패턴&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;XssMatchStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;XSS 패턴&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;IPSetReferenceStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;IP 집합 (최대 10,000 IP)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;GeoMatchStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;국가 코드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;RateBasedStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;IP 당 요청 수 (5분 창)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;RegexMatchStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;정규식&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AndStatement&lt;/code&gt; / &lt;code&gt;OrStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;조건 조합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;NotStatement&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;조건 부정&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;검사 대상 필드&lt;/strong&gt;: URI, Query String, Header, Cookie, HTTP Method, Body, JSON Body.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Allow&lt;/code&gt;, &lt;code&gt;Block&lt;/code&gt;, &lt;code&gt;Count&lt;/code&gt;, &lt;code&gt;Challenge&lt;/code&gt;, &lt;code&gt;CAPTCHA&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Count&lt;/code&gt;: 실제 차단 않고 카운트만. False Positive 분석에 활용.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Challenge&lt;/code&gt;: JS 챌린지로 봇 여부 판별.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAPTCHA&lt;/code&gt;: 사람인지 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;wcu-web-acl-capacity-units&quot;&gt;WCU (Web ACL Capacity Units)&lt;/h3&gt;
&lt;p&gt;각 룰마다 WCU 비용이 있고, Web ACL 은 최대 &lt;strong&gt;5000 WCU&lt;/strong&gt; 까지.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SqliMatchStatement&lt;/code&gt;: 10~20 WCU&lt;/li&gt;
&lt;li&gt;&lt;code&gt;XssMatchStatement&lt;/code&gt;: 40 WCU&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RateBasedStatement + 조건 결합&lt;/code&gt;: 규칙별 추가&lt;/li&gt;
&lt;li&gt;Managed Rule Group: 각 그룹에서 선언한 WCU 합산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;복잡한 커스텀 룰은 WCU 를 빠르게 소진합니다.&lt;/p&gt;
&lt;h2 id=&quot;통합-대상&quot;&gt;통합 대상&lt;/h2&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;리소스&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특이사항&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CloudFront&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Web ACL 은 &lt;code&gt;us-east-1&lt;/code&gt; 에 생성 필수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;ALB&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;동일 리전에 생성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;API Gateway&lt;/strong&gt; (REST / HTTP API)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Stage 단위 연결&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AppSync&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Cognito User Pool&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;App Runner&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Verified Access&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;아키텍처&quot;&gt;아키텍처&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Internet[인터넷] --&gt; Resource[&quot;CloudFront / ALB / API GW&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Resource --&gt; WAF[Web ACL]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  WAF --&gt;|Allow| Origin[Origin 서버]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  WAF --&gt;|Block| Blocked[4xx 응답]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  WAF -.-&gt;|로그| Logs[&quot;Kinesis / S3 / CloudWatch&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;요청-평가-흐름&quot;&gt;요청 평가 흐름&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Req[HTTP 요청] --&gt; R1[&quot;Rule Group (우선순위 100)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  R1 --&gt;|Match| A1[액션 실행]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  R1 --&gt;|No Match| R2[&quot;Rule Group (우선순위 200)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  R2 --&gt;|Match| A2[액션 실행]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  R2 --&gt;|No Match| Default[Default Action]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;aws-managed-rules&quot;&gt;AWS Managed Rules&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;무료 포함&lt;/strong&gt; (별도 비용 없음, WCU 만 소비):&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;그룹&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;내용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesCommonRuleSet&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OWASP Top 10, SQLi, XSS, LFI, RFI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesKnownBadInputsRuleSet&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Log4Shell, Spring4Shell 등 CVE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesAmazonIpReputationList&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 위협 인텔리전스 IP 목록&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesAnonymousIpList&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPN, Tor, proxy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesLinuxRuleSet&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Linux OS 관련 취약점&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesSQLiRuleSet&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQL injection 전용 (더 세밀)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesBotControlRuleSet&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;별도 요금&lt;/strong&gt;, 봇 분류/차단&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSManagedRulesFraudControlAccountTakeoverPreventionRuleSet&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;별도 요금&lt;/strong&gt;, 계정 탈취 방지&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Override Action&lt;/strong&gt;: 특정 룰을 &lt;code&gt;Count&lt;/code&gt; 로 전환해 테스트 가능. 배포 전 False Positive 파악에 필수.&lt;/p&gt;
&lt;h2 id=&quot;커스텀-rule-예시&quot;&gt;커스텀 Rule 예시&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;BlockSQLi&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Priority&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;OrStatement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Statements&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;SqliMatchStatement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;FieldToMatch&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;QueryString&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {} },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;TextTransformations&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Priority&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;URL_DECODE&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;SqliMatchStatement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;FieldToMatch&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Body&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;OversizeHandling&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CONTINUE&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;} },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;TextTransformations&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Priority&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;HTML_ENTITY_DECODE&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Block&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {} },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;VisibilityConfig&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;SampledRequestsEnabled&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;CloudWatchMetricsEnabled&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;MetricName&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;BlockSQLi&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;rate-based-rule&quot;&gt;Rate-based Rule&lt;/h3&gt;
&lt;p&gt;IP 당 5분 창 기준 요청 수로 차단:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;RateLimitPerIP&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Priority&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;RateBasedStatement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Limit&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;AggregateKeyType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;IP&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Block&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {} }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IP 당 5분에 2000 요청 초과 시 차단. 집계 키를 &lt;code&gt;FORWARDED_IP&lt;/code&gt; 나 &lt;code&gt;HTTP_HEADER&lt;/code&gt; 로 변경 가능.&lt;/p&gt;
&lt;h3 id=&quot;geo-blocking&quot;&gt;Geo Blocking&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;GeoBlockKP&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;GeoMatchStatement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;CountryCodes&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;KP&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;IR&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;Block&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {} }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;bot-control&quot;&gt;Bot Control&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;AWSManagedRulesBotControlRuleSet&lt;/code&gt; (별도 요금, 월 + 요청 당):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Common 레벨&lt;/strong&gt;: User-Agent, IP 기반 봇 감지. 크롤러, 스캐너, 스크래퍼.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Targeted 레벨&lt;/strong&gt;: JavaScript challenge, CAPTCHA 포함. 정교한 봇도 탐지.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;레벨별 차이&lt;/strong&gt;:&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;레벨&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;비용&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;탐지 범위&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;COMMON&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;일반 봇, User-Agent 기반&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;TARGETED&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;높음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;정교한 봇, JS 실행 가능 여부 검사&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;fraud-control&quot;&gt;Fraud Control&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ATP (Account Takeover Prevention)&lt;/strong&gt;: 로그인 폼 브루트포스, 비밀번호 스터핑 방어&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACFP (Account Creation Fraud Prevention)&lt;/strong&gt;: 가짜 계정 대량 생성 방어&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;별도 요금이며, 특정 URI 경로 (로그인/회원가입 엔드포인트) 에만 적용.&lt;/p&gt;
&lt;h2 id=&quot;로깅&quot;&gt;로깅&lt;/h2&gt;
&lt;p&gt;WAF 요청 로그 대상:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kinesis Data Firehose&lt;/strong&gt;: S3 / Redshift / OpenSearch 실시간 전송&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudWatch Logs&lt;/strong&gt;: 로그 그룹 직접 전송&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3&lt;/strong&gt;: 직접 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;로그 필터&lt;/strong&gt;: 특정 조건 (Block 된 것만 등) 매칭 요청만 로깅해 비용 절감.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;샘플링&lt;/strong&gt;: Sampled Requests (최근 500개 샘플) 는 무료로 콘솔에서 확인 가능.&lt;/p&gt;
&lt;h2 id=&quot;비용-모델&quot;&gt;비용 모델&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;요금 (USD, ap-northeast-2 기준)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Web ACL 월&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;5.00 USD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Rule Group 월&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1.00 USD / 그룹&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;요청 처리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;0.60 USD / 100만 요청&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Bot Control Common&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;10.00 USD / 월 + 1.00 USD / 100만 요청&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Bot Control Targeted&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;10.00 USD / 월 + 1.50 USD / 100만 요청&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;ATP / ACFP&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;10.00 USD / 월 + 추가 요청 요금&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;참고&lt;/strong&gt;: 요금은 변동될 수 있으므로 AWS 공식 페이지 확인.&lt;/p&gt;
&lt;h2 id=&quot;waf-vs-유사-서비스&quot;&gt;WAF vs 유사 서비스&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;서비스&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;역할&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;계층&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;WAF&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;개별 HTTP 요청 검사, 룰 기반 필터링&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Layer 7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;**[[aws-shield&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Shield]]**&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;대용량 DDoS 트래픽 볼륨 완화&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;**[[aws-network-firewall&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Network Firewall]]**&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPC 수준 DPI, 도메인 필터, IPS (Suricata)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;**[[aws-guardduty&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GuardDuty]]**&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;이상 행위 탐지, 위협 인텔리전스 (차단 아님)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;판단 기준&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;웹 앱 SQL injection / XSS / 봇 방어 → &lt;strong&gt;WAF&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;수 Gbps 볼륨 DDoS 완화 → &lt;strong&gt;Shield&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;VPC 내부 East-West + IPS → &lt;strong&gt;Network Firewall&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;위협 탐지 + 가시성 (이상 행위 알림) → &lt;strong&gt;GuardDuty&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;실제 운영에서는 조합: CloudFront + WAF + Shield Advanced + GuardDuty.&lt;/p&gt;
&lt;h2 id=&quot;실전-배포-패턴&quot;&gt;실전 배포 패턴&lt;/h2&gt;
&lt;h3 id=&quot;cloudfront--waf-권장&quot;&gt;CloudFront + WAF (권장)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[사용자] → CloudFront + Web ACL → ALB → EC2/ECS&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;엣지에서 먼저 차단하므로 Origin 까지 트래픽 전달 최소화. 글로벌 지연 없음.&lt;/p&gt;
&lt;h3 id=&quot;alb-전용&quot;&gt;ALB 전용&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[사용자] → ALB + Web ACL → Target Group&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CloudFront 없는 구성, 리전 내 요청만 처리.&lt;/p&gt;
&lt;h3 id=&quot;api-gateway-보호&quot;&gt;API Gateway 보호&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[클라이언트] → API Gateway + Web ACL → Lambda / 백엔드&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rate Limit + IP 차단으로 API 남용 방어.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Managed Rule False Positive&lt;/strong&gt;. &lt;code&gt;AWSManagedRulesCommonRuleSet&lt;/code&gt; 이 정상 요청을 차단할 수 있습니다. 첫 배포는 반드시 &lt;code&gt;Override Action: Count&lt;/code&gt; 로 실행 후 로그 분석.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;WCU 5000 한계&lt;/strong&gt;. 복잡한 커스텀 룰 + 여러 Managed Rule Group 조합 시 WCU 초과. 불필요 룰 제거 또는 단순화 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;CloudFront WAF 는 us-east-1 고정&lt;/strong&gt;. 다른 리전에 Web ACL 을 만들면 CloudFront 에 연결 불가.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;로그 비용 폭발&lt;/strong&gt;. 대용량 트래픽에서 전체 로그 활성화 시 Kinesis / S3 비용 급증. 로그 필터 또는 샘플링 먼저 설정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Rate-based rule 집계 지연&lt;/strong&gt;. 5분 창 기반이라 순간 버스트는 차단이 늦을 수 있습니다. 짧은 burst 방어에는 [[aws-shield|Shield]] 보완.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Managed Rule 자동 업데이트 주의&lt;/strong&gt;. AWS 가 룰 업데이트 시 신규 룰이 정상 트래픽을 막을 수 있습니다. SNS 알림 구독 + 스테이징 환경에서 먼저 적용 후 프로덕션 반영.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-shield|Shield]] - DDoS 볼륨 방어&lt;/li&gt;
&lt;li&gt;[[aws-network-firewall|Network Firewall]] - VPC 수준 IPS&lt;/li&gt;
&lt;li&gt;[[aws-guardduty|GuardDuty]] - 위협 탐지&lt;/li&gt;
&lt;li&gt;[[aws-security-hub|Security Hub]] - 통합 보안 대시보드&lt;/li&gt;
&lt;li&gt;[[aws-cloudfront-cdn|CloudFront]] - 엣지 배포 + WAF 주 연결 대상&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb|ALB/NLB]] - 앱 로드 밸런서&lt;/li&gt;
&lt;li&gt;[[aws-api-gateway|API Gateway]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]] - WAF 메트릭 / 알림&lt;/li&gt;
&lt;li&gt;[[aws-sg-vs-nacl|SG vs NACL]] - Layer 3/4 방화벽 비교&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>security</category><category>waf</category><category>firewall</category><category>layer7</category><author>koa (김신건)</author></item><item><title>[AWS CAF] Business Perspective</title><link>https://shinkeonkim.com/wiki/cloud/aws-caf-business/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-caf-business/</guid><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Business Perspective&lt;/strong&gt; 는 [[aws-caf|AWS CAF]] 6 관점 중 &lt;strong&gt;비즈니스 성과&lt;/strong&gt; 에 초점을 맞춘 관점입니다. 클라우드 투자가 &lt;strong&gt;디지털 전환 목표와 비즈니스 성과 (revenue, cost, agility, innovation)&lt;/strong&gt; 를 실제로 견인하도록 보장합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 stakeholder&lt;/strong&gt;: CEO, CFO, COO, CIO, CTO.&lt;/p&gt;
&lt;h2 id=&quot;핵심-질문&quot;&gt;핵심 질문&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;클라우드로 어떤 비즈니스 성과를 달성할 것인가?&lt;/li&gt;
&lt;li&gt;투자 대비 성과 (ROI) 는?&lt;/li&gt;
&lt;li&gt;어떤 제품/서비스를 클라우드로 만들 것인가?&lt;/li&gt;
&lt;li&gt;조직의 데이터/역량을 어떻게 수익화 할 것인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;주요-capabilities-역량&quot;&gt;주요 Capabilities (역량)&lt;/h2&gt;
&lt;p&gt;Business perspective 는 8-10 개 capability. 대표:&lt;/p&gt;
&lt;h3 id=&quot;1-strategy-management-전략-관리&quot;&gt;1. Strategy Management (전략 관리)&lt;/h3&gt;
&lt;p&gt;디지털 전환 목표를 회사 전략과 정렬. 클라우드가 &lt;strong&gt;어떤 비즈니스 문제&lt;/strong&gt; 를 해결하는가 정의.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;성숙도 지표&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initial: 클라우드 사용은 있지만 전략 없음&lt;/li&gt;
&lt;li&gt;Optimized: 전략 정기 리뷰, KPI 로 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-portfolio-management-포트폴리오-관리&quot;&gt;2. Portfolio Management (포트폴리오 관리)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;어떤 앱/서비스를 클라우드로&lt;/strong&gt;, &lt;strong&gt;어떤 순서로&lt;/strong&gt;. 우선순위 결정 프레임워크 (6R: Rehost, Replatform, Refactor, Repurchase, Retire, Retain).&lt;/p&gt;
&lt;h3 id=&quot;3-innovation-management-혁신-관리&quot;&gt;3. Innovation Management (혁신 관리)&lt;/h3&gt;
&lt;p&gt;클라우드가 새 비즈니스 모델/서비스를 가능하게 하는지 관리. 실험 (experimentation), MVP, 학습 문화.&lt;/p&gt;
&lt;h3 id=&quot;4-product-management-제품-관리&quot;&gt;4. Product Management (제품 관리)&lt;/h3&gt;
&lt;p&gt;디지털 제품/서비스의 &lt;strong&gt;lifecycle&lt;/strong&gt; (착상 -&gt; 개발 -&gt; 배포 -&gt; 은퇴). Product manager 역할 강화.&lt;/p&gt;
&lt;h3 id=&quot;5-strategic-partnership-전략적-파트너십&quot;&gt;5. Strategic Partnership (전략적 파트너십)&lt;/h3&gt;
&lt;p&gt;AWS, SI, ISV 파트너와의 관계. Managed service provider (MSP), 컨설팅, 트레이닝 파트너.&lt;/p&gt;
&lt;h3 id=&quot;6-data-monetization-데이터-수익화&quot;&gt;6. Data Monetization (데이터 수익화)&lt;/h3&gt;
&lt;p&gt;조직의 데이터를 &lt;strong&gt;비즈니스 가치&lt;/strong&gt; 로 전환. 데이터 제품, ML/AI 인사이트, 개인화, 예측.&lt;/p&gt;
&lt;h3 id=&quot;7-business-insights-비즈니스-인사이트&quot;&gt;7. Business Insights (비즈니스 인사이트)&lt;/h3&gt;
&lt;p&gt;BI, 대시보드, 분석. 데이터 기반 의사결정 문화.&lt;/p&gt;
&lt;h3 id=&quot;8-data-science-데이터-과학&quot;&gt;8. Data Science (데이터 과학)&lt;/h3&gt;
&lt;p&gt;ML/AI 역량 개발. SageMaker, Bedrock 등 활용.&lt;/p&gt;
&lt;h2 id=&quot;cloud-value-framework-4-pillar&quot;&gt;Cloud Value Framework (4 pillar)&lt;/h2&gt;
&lt;p&gt;AWS 가 제시하는 &lt;strong&gt;클라우드 가치의 4 축&lt;/strong&gt;:&lt;/p&gt;
&lt;h3 id=&quot;1-cost-savings-비용-절감&quot;&gt;1. Cost Savings (비용 절감)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CapEx -&gt; OpEx&lt;/strong&gt;: 서버 구입 대신 사용료&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reserved / Savings Plans&lt;/strong&gt; 로 예측 가능 워크로드 절감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serverless / Spot&lt;/strong&gt; 로 유휴 자원 제거&lt;/li&gt;
&lt;li&gt;데이터센터 운영/부동산 절감&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;전형적 30-40% TCO 절감&lt;/strong&gt; (마이그레이션 규모에 따라).&lt;/p&gt;
&lt;h3 id=&quot;2-staff-productivity-스태프-생산성&quot;&gt;2. Staff Productivity (스태프 생산성)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;관리형 서비스 (RDS, Kinesis, Lambda) 로 운영 부담 감소&lt;/li&gt;
&lt;li&gt;IaC + CI/CD 로 배포 시간 단축&lt;/li&gt;
&lt;li&gt;관측 도구로 문제 진단 가속&lt;/li&gt;
&lt;li&gt;팀이 저부가가치 운영 대신 앱 개발/비즈니스 집중&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-operational-resilience-운영-회복력&quot;&gt;3. Operational Resilience (운영 회복력)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Multi-AZ / Multi-region HA&lt;/li&gt;
&lt;li&gt;자동 백업, DR&lt;/li&gt;
&lt;li&gt;자동 failover&lt;/li&gt;
&lt;li&gt;다운타임 비용 절감 (예: 1시간 다운타임 = 수백만 USD 손실)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-business-agility-비즈니스-민첩성&quot;&gt;4. Business Agility (비즈니스 민첩성)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;새 서비스 프로비저닝 몇 분 (기존 몇 주/월)&lt;/li&gt;
&lt;li&gt;신규 시장/지역 진출 빠름 (multi-region)&lt;/li&gt;
&lt;li&gt;실험 비용 낮음 (실패 부담 낮음)&lt;/li&gt;
&lt;li&gt;경쟁 대응 속도&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;정성적 가치&lt;/strong&gt;이나 흔히 정량화된 revenue 증가로 이어짐.&lt;/p&gt;
&lt;h2 id=&quot;kpi-예시&quot;&gt;KPI 예시&lt;/h2&gt;
&lt;h3 id=&quot;비용-관련&quot;&gt;비용 관련&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TCO reduction&lt;/strong&gt;: on-prem 대비 3-5년 절감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unit economics&lt;/strong&gt;: 사용자당 인프라 비용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost of goods sold (COGS)&lt;/strong&gt; 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;agility-관련&quot;&gt;Agility 관련&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time to market&lt;/strong&gt;: 신규 서비스 출시 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment frequency&lt;/strong&gt;: 배포 횟수 (DORA metric)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lead time&lt;/strong&gt;: 아이디어 -&gt; 프로덕션&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;innovation-관련&quot;&gt;Innovation 관련&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Number of experiments&lt;/strong&gt;: 분기별 실험 수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New products launched&lt;/strong&gt;: 신규 제품 수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revenue from new products&lt;/strong&gt;: 신규 제품 매출&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-활동&quot;&gt;실전 활동&lt;/h2&gt;
&lt;h3 id=&quot;envision-phase&quot;&gt;Envision phase&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;비즈니스 전략 워크숍 (경영진)&lt;/li&gt;
&lt;li&gt;산업/경쟁사 벤치마킹&lt;/li&gt;
&lt;li&gt;클라우드 채택 비즈니스 케이스 (business case)&lt;/li&gt;
&lt;li&gt;ROI 시뮬레이션&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;align-phase&quot;&gt;Align phase&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Portfolio 우선순위 매트릭스 (impact vs effort)&lt;/li&gt;
&lt;li&gt;Cloud value framework 4 축 갭 분석&lt;/li&gt;
&lt;li&gt;Product roadmap (12-24 개월)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;launch-phase&quot;&gt;Launch phase&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;첫 pilot 성과 측정 (KPI baseline vs target)&lt;/li&gt;
&lt;li&gt;성공 스토리 조직 내 공유&lt;/li&gt;
&lt;li&gt;팀 인센티브 정렬&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;scale-phase&quot;&gt;Scale phase&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;지속 성과 대시보드&lt;/li&gt;
&lt;li&gt;재투자 결정 (성공한 것에 더)&lt;/li&gt;
&lt;li&gt;신규 비즈니스 기회 발굴&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;caf-6-관점-관계도&quot;&gt;CAF 6 관점 관계도&lt;/h2&gt;
&lt;p&gt;Business Perspective 는 다른 5개 관점과 상호 의존합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Biz[&quot;Business Perspective\n전략/투자/포트폴리오&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    People[&quot;People Perspective\n조직/역량/문화&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Gov[&quot;Governance Perspective\n거버넌스/재무/리스크&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Plat[&quot;Platform Perspective\n기술/아키텍처&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Sec[&quot;Security Perspective\n보안/컴플라이언스&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Ops[&quot;Operations Perspective\n운영/지원&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Biz --&gt;|&quot;목표 정의&quot;| People&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Biz --&gt;|&quot;예산/우선순위&quot;| Gov&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Biz --&gt;|&quot;제품 요구사항&quot;| Plat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Biz --&gt;|&quot;리스크 허용 범위&quot;| Sec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Biz --&gt;|&quot;서비스 수준 목표&quot;| Ops&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    People --&gt;|&quot;역량 피드백&quot;| Biz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Gov --&gt;|&quot;재무 성과 측정&quot;| Biz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;6-관점-한눈에&quot;&gt;6 관점 한눈에&lt;/h3&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;관점&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;초점&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;주요 Stakeholder&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Business&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;비즈니스 성과, ROI, 전략&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CEO, CFO, COO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;People&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;조직 변화, 역량 개발, 문화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CHRO, CIO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Governance&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;재무 관리, 리스크, 포트폴리오&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CFO, CDO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Platform&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;아키텍처, 기술 플랫폼, 모던화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CTO, Architect&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;보안, 컴플라이언스, 신뢰&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CISO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Operations&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;운영, 모니터링, 지속 최적화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VP Ops, IT Ops&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;business-case-구성&quot;&gt;Business Case 구성&lt;/h2&gt;
&lt;p&gt;클라우드 전환 전 비즈니스 케이스 작성 프레임워크:&lt;/p&gt;
&lt;h3 id=&quot;1-현재-상태-분석-as-is&quot;&gt;1. 현재 상태 분석 (As-Is)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;온프레미스 비용 항목:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 하드웨어 (서버, 스토리지, 네트워크): CapEx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 데이터센터 (공간, 전력, 냉각): OpEx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 소프트웨어 라이선스: CapEx/OpEx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 인력 (서버 관리, DB 관리): OpEx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 유지보수 계약: OpEx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-미래-상태-예측-to-be&quot;&gt;2. 미래 상태 예측 (To-Be)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;클라우드 비용 예측:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 컴퓨팅 (EC2, Reserved/Savings Plans)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 스토리지 (S3, EBS, RDS)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 네트워크 (데이터 전송, CDN)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 관리형 서비스 (RDS, EKS, SageMaker)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 지원 (AWS Support plan)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;마이그레이션 비용:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 컨설팅/SI 비용&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 내부 인력 시간&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 교육/인증&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 병렬 운영 기간&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-비용-절감-계산&quot;&gt;3. 비용 절감 계산&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;절감 근거&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;일반적 절감률&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;서버 구매 비용 제거&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;하드웨어 수명 주기 없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;30-40%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;데이터센터 운영&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;공간/전력/냉각 없음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;20-30%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;인력 최적화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;관리형 서비스 활용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;10-20%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;유휴 자원 제거&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Auto Scaling, 정확한 사이징&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;15-25%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;roi-계산-방법론&quot;&gt;ROI 계산 방법론&lt;/h2&gt;
&lt;h3 id=&quot;3년-tco-비교-모델&quot;&gt;3년 TCO 비교 모델&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;총 절감 = (현재 3년 비용) - (클라우드 3년 비용 + 마이그레이션 비용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ROI % = (순 절감액 / 마이그레이션 비용) x 100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;손익분기점 = 마이그레이션 비용 / 월간 절감액&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cloud-value-framework-지표-정량화&quot;&gt;Cloud Value Framework 지표 정량화&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;가치 축&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;정량화 방법&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;예시&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;비용 절감&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;TCO 분석, 3-5년 비교&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;연간 $2M 절감&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;생산성 향상&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;배포 빈도, 장애 복구 시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;배포 10배 증가&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;운영 회복력&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;다운타임 비용, SLA 개선&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;연간 다운타임 99시간 → 1시간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;비즈니스 민첩성&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Time-to-market, 실험 수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;신규 기능 출시 6주 → 1주&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
AWS 의 &lt;a href=&quot;https://aws.amazon.com/tso-logic/&quot;&gt;TSO Logic&lt;/a&gt; 또는 AWS Migration Evaluator 로 데이터 기반 TCO 분석 가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;포트폴리오-우선순위-결정-6r&quot;&gt;포트폴리오 우선순위 결정 (6R)&lt;/h2&gt;
&lt;p&gt;마이그레이션 대상 앱의 전략 분류:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App[&quot;애플리케이션 평가&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App --&gt; Q1{&quot;비즈니스 가치?&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt;|&quot;낮음, 중복&quot;| Retire[Retire 폐기]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt;|&quot;중간, 외부 대체 가능&quot;| Repurchase[Repurchase SaaS 전환]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q1 --&gt;|높음| Q2{&quot;클라우드 최적화 필요?&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|&quot;즉시 리프트&quot;| Rehost[&quot;Rehost\nLift and Shift&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|&quot;일부 최적화&quot;| Replatform[&quot;Replatform\nLift Tinker Shift&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|&quot;전면 재설계&quot;| Refactor[&quot;Refactor\nRe-architect&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q2 --&gt;|&quot;당장 이전 불가&quot;| Retain[&quot;Retain\n현재 유지&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;전략&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;설명&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;마이그레이션 속도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Rehost&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VM을 그대로 클라우드로 (VMware, MGN)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;빠름&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Replatform&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DB를 RDS로, 앱 서버를 컨테이너로&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Refactor&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;마이크로서비스, 서버리스로 재설계&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;느림&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Repurchase&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CRM/ERP를 SaaS로 대체&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;빠름&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Retire&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;불필요한 앱 폐기&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;즉시&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Retain&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;현재 환경 유지 (추후 재평가)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;해당 없음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;성숙도-평가-모델&quot;&gt;성숙도 평가 모델&lt;/h2&gt;
&lt;p&gt;CAF 는 4단계 성숙도를 정의합니다:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;단계&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;명칭&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특성&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Project&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;개별 팀 클라우드 실험&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Foundation&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;기반 구축, 공통 플랫폼&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Migration&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;조직적 마이그레이션 진행&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Reinvention&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;클라우드 네이티브, 지속 혁신&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Business Perspective 성숙도 지표:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level 1&lt;/strong&gt;: 클라우드 사용하지만 비즈니스 목표 연결 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 2&lt;/strong&gt;: 클라우드 전환 로드맵 존재, C-level 인식&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 3&lt;/strong&gt;: KPI 로 성과 측정, 조직 전반 채택&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 4&lt;/strong&gt;: 클라우드 우선 문화, 지속적 혁신 사이클&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;흔한-실패-패턴&quot;&gt;흔한 실패 패턴&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;비즈니스 목표 없이 기술 도입&lt;/strong&gt;. “우리도 클라우드 써야지” 만으로는 ROI 안 나옴. 명확한 문제 정의부터.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;비용 절감만 목표&lt;/strong&gt;. Cost savings 는 4 축 중 하나. Agility / innovation 무시하면 경쟁력 손실.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;경영진 이탈&lt;/strong&gt;. 전환 3 년차에 경영진 관심 감소하며 지원 축소. 지속 참여 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;정성적 가치도 정량화 시도&lt;/strong&gt;. Agility, resilience 를 매출 영향으로 환산.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;마이그레이션 비용 과소평가&lt;/strong&gt;: 컨설팅, 교육, 병렬 운영 기간, 내부 인력 시간 모두 계산에 포함해야. 첫 1-2년은 비용 증가 후 절감 시작.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-caf|AWS CAF]] - 상위 개요&lt;/li&gt;
&lt;li&gt;[[aws-caf-people|People Perspective]] - 조직/문화&lt;/li&gt;
&lt;li&gt;[[aws-caf-governance|Governance Perspective]] - 재무/리스크&lt;/li&gt;
&lt;li&gt;[[aws-caf-platform|Platform Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-security|Security Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-operations|Operations Perspective]]&lt;/li&gt;
&lt;li&gt;[[well-architected]] - AWS Well-Architected Framework (실행 관점)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>caf</category><category>strategy</category><category>business</category><author>koa (김신건)</author></item><item><title>[AWS CAF] Governance Perspective</title><link>https://shinkeonkim.com/wiki/cloud/aws-caf-governance/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-caf-governance/</guid><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Governance Perspective&lt;/strong&gt; 는 [[aws-caf|AWS CAF]] 6 관점 중 &lt;strong&gt;클라우드 이니셔티브의 관리 (orchestration)&lt;/strong&gt; 를 담당합니다. 조직의 이익을 극대화하면서 전환 관련 &lt;strong&gt;리스크를 최소화&lt;/strong&gt; 하는 것이 목표입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 stakeholder&lt;/strong&gt;: Chief Transformation Officer, CIO, CTO, CFO, CDO (Data), CRO (Risk).&lt;/p&gt;
&lt;h2 id=&quot;왜-governance-인가&quot;&gt;왜 Governance 인가&lt;/h2&gt;
&lt;p&gt;Governance 없이 클라우드 도입 시:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;비용 폭주&lt;/strong&gt; (unmanaged 사용, tag 없음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shadow IT&lt;/strong&gt; (팀이 각자 계정 만들어 카오스)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컴플라이언스 위반&lt;/strong&gt; (감시 없이 리소스 배포)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;중복 투자&lt;/strong&gt; (같은 문제 여러 팀이 각자 해결)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;리스크 무방비&lt;/strong&gt; (재해복구, 백업, 보안 정책 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;주요-capabilities&quot;&gt;주요 Capabilities&lt;/h2&gt;
&lt;h3 id=&quot;1-program-and-project-management&quot;&gt;1. Program and Project Management&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;클라우드 전환 프로그램&lt;/strong&gt; 관리. 여러 프로젝트 orchestration.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Portfolio 관리&lt;/li&gt;
&lt;li&gt;Roadmap 조정&lt;/li&gt;
&lt;li&gt;Dependency 관리&lt;/li&gt;
&lt;li&gt;Stakeholder 커뮤니케이션&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-benefits-management&quot;&gt;2. Benefits Management&lt;/h3&gt;
&lt;p&gt;투자 대비 실현 가치 (benefits) 추적. 계획 vs 실현 gap 분석.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KPI 정의 및 측정&lt;/li&gt;
&lt;li&gt;Business case 검증&lt;/li&gt;
&lt;li&gt;Continuous improvement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-risk-management&quot;&gt;3. Risk Management&lt;/h3&gt;
&lt;p&gt;전환 관련 리스크 식별 + 관리:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;기술 리스크&lt;/strong&gt;: 이관 실패, 성능 저하&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비즈니스 리스크&lt;/strong&gt;: 다운타임, 매출 영향&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컴플라이언스 리스크&lt;/strong&gt;: 규제 위반&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재무 리스크&lt;/strong&gt;: 예상 초과 비용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인력 리스크&lt;/strong&gt;: 스킬 갭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mitigation plan 마련.&lt;/p&gt;
&lt;h3 id=&quot;4-cloud-financial-management-finops&quot;&gt;4. Cloud Financial Management (FinOps)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;클라우드 비용의 계획, 예측, 최적화, 책임 (accountability)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FinOps 3 원칙&lt;/strong&gt; (FinOps Foundation):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inform&lt;/strong&gt; (정보): 비용 가시성, 벤치마킹, 할당&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimize&lt;/strong&gt; (최적화): RI/SP, right-sizing, waste 제거&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operate&lt;/strong&gt; (운영): 지속 개선, 팀 accountability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AWS 도구&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Cost Explorer&lt;/strong&gt;: 비용 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Budgets&lt;/strong&gt;: 예산 + 알림&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Cost Anomaly Detection&lt;/strong&gt;: 이상 감지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Compute Optimizer&lt;/strong&gt;: right-sizing 추천&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Savings Plans / Reserved Instances&lt;/strong&gt;: 예약 할인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS CUR (Cost and Usage Report)&lt;/strong&gt;: 상세 데이터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Billing Conductor&lt;/strong&gt;: 사내 재청구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-application-portfolio-management&quot;&gt;5. Application Portfolio Management&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;6R Migration Strategy&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rehost&lt;/strong&gt; (lift-and-shift): 그대로 이관&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replatform&lt;/strong&gt; (lift-tinker-shift): 약간 조정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor&lt;/strong&gt; (re-architect): 클라우드 네이티브 재설계&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repurchase&lt;/strong&gt; (drop and shop): SaaS 로 대체&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retire&lt;/strong&gt; (은퇴): 안 씀&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retain&lt;/strong&gt; (유지): on-prem 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;각 앱을 6R 매트릭스에 매핑.&lt;/p&gt;
&lt;h3 id=&quot;6-data-governance&quot;&gt;6. Data Governance&lt;/h3&gt;
&lt;p&gt;데이터의 lifecycle, 소유권, 품질, 접근 통제 관리.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data catalog (AWS Glue Data Catalog)&lt;/li&gt;
&lt;li&gt;Data lineage&lt;/li&gt;
&lt;li&gt;Data quality metrics&lt;/li&gt;
&lt;li&gt;Data classification (PII, sensitive)&lt;/li&gt;
&lt;li&gt;Data access controls (Lake Formation)&lt;/li&gt;
&lt;li&gt;Retention policy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7-data-curation&quot;&gt;7. Data Curation&lt;/h3&gt;
&lt;p&gt;데이터를 유용한 상태로 유지: cleansing, enrichment, standardization.&lt;/p&gt;
&lt;h2 id=&quot;계정-전략&quot;&gt;계정 전략&lt;/h2&gt;
&lt;p&gt;Governance 의 실제 실현.&lt;/p&gt;
&lt;h3 id=&quot;aws-organizations&quot;&gt;AWS Organizations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Multi-account 계층&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Organization Root&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Management Account (billing, org-level policies)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Log Archive Account (CloudTrail, Config 중앙)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Security Account (Security Hub, GuardDuty)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Sandbox OU (실험)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Dev OU&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Staging OU&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── Production OU&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── Business Unit A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── Business Unit B&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;service-control-policies-scp&quot;&gt;Service Control Policies (SCP)&lt;/h3&gt;
&lt;p&gt;Org / OU 단위로 &lt;strong&gt;AWS API 제한&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2012-10-17&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;Statement&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Effect&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Deny&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Action&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ec2:RunInstances&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Resource&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Condition&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;StringNotEquals&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          &quot;ec2:InstanceType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;t3.micro&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;t3.small&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;t3.medium&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sandbox OU 에는 큰 인스턴스 금지 등.&lt;/p&gt;
&lt;h3 id=&quot;aws-control-tower&quot;&gt;AWS Control Tower&lt;/h3&gt;
&lt;p&gt;Landing Zone 자동화 서비스:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;계정 프로비저닝 자동화&lt;/li&gt;
&lt;li&gt;표준 가드레일 (SCP + Config Rules)&lt;/li&gt;
&lt;li&gt;로그 중앙화&lt;/li&gt;
&lt;li&gt;컴플라이언스 대시보드&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tagging-strategy&quot;&gt;Tagging Strategy&lt;/h2&gt;
&lt;p&gt;리소스 tag 필수. 비용 할당 + 관리:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;project: platform&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;environment: prod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;owner: alice@company.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cost-center: engineering&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;data-classification: pii&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;compliance: hipaa&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tag 강제: [[aws-config|Config]] rule &lt;code&gt;required-tags&lt;/code&gt; + SCP.&lt;/p&gt;
&lt;h2 id=&quot;chargeback--showback&quot;&gt;Chargeback / Showback&lt;/h2&gt;
&lt;p&gt;각 팀/사업부에 클라우드 비용 할당:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Showback&lt;/strong&gt;: 정보 제공만 (책임 의식)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chargeback&lt;/strong&gt;: 실제 내부 청구&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tag 기반 Cost Allocation Report -&gt; AWS Billing Conductor 로 커스텀 청구서.&lt;/p&gt;
&lt;h2 id=&quot;risk-register&quot;&gt;Risk Register&lt;/h2&gt;
&lt;p&gt;주요 리스크를 문서화 + 대응:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Risk: 마이그레이션 중 다운타임&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Impact: 매출 감소 (시간당 X USD)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Likelihood: Medium&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Mitigation: Blue/green, 야간 이관, rollback plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Owner: Platform team lead&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;change-management&quot;&gt;Change Management&lt;/h2&gt;
&lt;p&gt;프로덕션 변경 프로세스:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change Advisory Board (CAB) - 클라우드에서는 자동화 지향&lt;/li&gt;
&lt;li&gt;Automated approval (low-risk)&lt;/li&gt;
&lt;li&gt;Peer review (medium)&lt;/li&gt;
&lt;li&gt;Manual approval (high-risk)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-활동&quot;&gt;실전 활동&lt;/h2&gt;
&lt;h3 id=&quot;envision&quot;&gt;Envision&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;현재 IT governance 진단&lt;/li&gt;
&lt;li&gt;Risk register 초안&lt;/li&gt;
&lt;li&gt;FinOps 팀 계획&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;align&quot;&gt;Align&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Landing Zone 설계 (Control Tower)&lt;/li&gt;
&lt;li&gt;SCP 정책 초안&lt;/li&gt;
&lt;li&gt;Tagging strategy&lt;/li&gt;
&lt;li&gt;예산 목표&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;launch&quot;&gt;Launch&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Landing Zone 배포&lt;/li&gt;
&lt;li&gt;첫 workload 의 tag / 비용 할당 검증&lt;/li&gt;
&lt;li&gt;Governance dashboard&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;scale&quot;&gt;Scale&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;전사 Control Tower 확장&lt;/li&gt;
&lt;li&gt;FinOps 자동화&lt;/li&gt;
&lt;li&gt;지속 개선 (Cost review 월간)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cost-optimization-5-원칙-aws&quot;&gt;Cost Optimization 5 원칙 (AWS)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Right-sizing&lt;/strong&gt;: 실 사용량 기반 인스턴스 크기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reserved capacity&lt;/strong&gt;: 예측 가능 부하는 RI / Savings Plans&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Elastic scaling&lt;/strong&gt;: HPA, Auto Scaling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage lifecycle&lt;/strong&gt;: S3 IA/Glacier, snapshot 정리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waste elimination&lt;/strong&gt;: 유휴 리소스, 미사용 EIP&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;흔한-실패-패턴&quot;&gt;흔한 실패 패턴&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Governance 없이 시작&lt;/strong&gt;. 첫 6개월 편해 보이지만 3년차에 카오스. 초기부터 Landing Zone.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;비용 관리를 IT 만의 문제로&lt;/strong&gt;. 팀별 accountability 없이는 관리 안 됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;SCP 를 과도 제한&lt;/strong&gt;. 팀 자율성 저해, shadow IT 유발. Balance 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Tag 없으면 비용 할당 불가&lt;/strong&gt;. 초기부터 mandatory tags 강제.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;재무팀 vs 엔지니어링팀 간극&lt;/strong&gt;. Cost 대화가 언어 다름. FinOps 팀이 다리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-caf|AWS CAF]] - 상위 개요&lt;/li&gt;
&lt;li&gt;[[aws-caf-business|Business Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-people|People Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-platform|Platform Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-security|Security Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-operations|Operations Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail|CloudTrail]]&lt;/li&gt;
&lt;li&gt;[[aws-config|Config]]&lt;/li&gt;
&lt;li&gt;[[aws-audit-manager|Audit Manager]]&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>caf</category><category>governance</category><category>finops</category><category>risk-management</category><author>koa (김신건)</author></item><item><title>[AWS CAF] Operations Perspective</title><link>https://shinkeonkim.com/wiki/cloud/aws-caf-operations/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-caf-operations/</guid><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Operations Perspective&lt;/strong&gt; 는 [[aws-caf|AWS CAF]] 6 관점 중 &lt;strong&gt;클라우드 서비스가 비즈니스가 요구하는 수준으로 딜리버리되도록 보장&lt;/strong&gt; 하는 관점입니다. &lt;strong&gt;자동화 + 최적화&lt;/strong&gt; 로 신뢰성 있게 확장.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 stakeholder&lt;/strong&gt;: 인프라/운영 리더, SRE (Site Reliability Engineer), IT service manager.&lt;/p&gt;
&lt;h2 id=&quot;주요-capabilities&quot;&gt;주요 Capabilities&lt;/h2&gt;
&lt;h3 id=&quot;1-observability&quot;&gt;1. Observability&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;시스템 상태 가시성&lt;/strong&gt;. Metrics, Logs, Traces.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AWS 도구&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]] Metrics, Logs, Alarms, Dashboards&lt;/li&gt;
&lt;li&gt;CloudWatch Application Signals (2024+)&lt;/li&gt;
&lt;li&gt;X-Ray (tracing)&lt;/li&gt;
&lt;li&gt;[[opentelemetry|OpenTelemetry]] (표준)&lt;/li&gt;
&lt;li&gt;Managed Prometheus, Managed Grafana&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3 pillars of observability&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metrics&lt;/strong&gt;: 수치 시계열 (CPU%, requests/s)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;/strong&gt;: 이벤트 (structured JSON)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traces&lt;/strong&gt;: 요청 흐름 (분산 트레이싱)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-event-management-aiops&quot;&gt;2. Event Management (AIOps)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;이벤트 상관 + 자동 대응&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alert de-duplication&lt;/li&gt;
&lt;li&gt;Alert routing (PagerDuty, Opsgenie)&lt;/li&gt;
&lt;li&gt;Auto-remediation (Lambda + Systems Manager)&lt;/li&gt;
&lt;li&gt;ML 기반 이상 감지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-incident-and-problem-management&quot;&gt;3. Incident and Problem Management&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;사고 대응 프로세스&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Incident&lt;/strong&gt;: 실시간 문제 (down)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem&lt;/strong&gt;: 근본 원인 조사&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PIR (Post-Incident Review)&lt;/strong&gt;: Blameless postmortem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단계&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Detection&lt;/li&gt;
&lt;li&gt;Triage (severity 판단)&lt;/li&gt;
&lt;li&gt;Response (mitigation)&lt;/li&gt;
&lt;li&gt;Communication (상태 페이지, stakeholder)&lt;/li&gt;
&lt;li&gt;Resolution&lt;/li&gt;
&lt;li&gt;PIR&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;4-change-and-release-management&quot;&gt;4. Change and Release Management&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;프로덕션 변경 관리&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change Advisory Board (전통) -&gt; Automated (클라우드)&lt;/li&gt;
&lt;li&gt;Blue/green, canary&lt;/li&gt;
&lt;li&gt;Rollback 자동화&lt;/li&gt;
&lt;li&gt;Change failure rate 추적 (DORA metric)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-performance-and-capacity-management&quot;&gt;5. Performance and Capacity Management&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;성능 목표 (SLO) 정의 + 용량 계획&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SLO (Service Level Objective): 예 99.9% 가용성&lt;/li&gt;
&lt;li&gt;SLI (Service Level Indicator): 측정 지표&lt;/li&gt;
&lt;li&gt;Error budget: SLO 대비 여유&lt;/li&gt;
&lt;li&gt;Capacity planning: 미래 부하 예측&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6-configuration-management&quot;&gt;6. Configuration Management&lt;/h3&gt;
&lt;p&gt;리소스 설정 관리:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-config|Config]] 로 리소스 상태 추적&lt;/li&gt;
&lt;li&gt;Systems Manager Parameter Store&lt;/li&gt;
&lt;li&gt;IaC (immutable, versioned)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7-patch-management&quot;&gt;7. Patch Management&lt;/h3&gt;
&lt;p&gt;OS/앱 패치:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Systems Manager Patch Manager&lt;/li&gt;
&lt;li&gt;자동 스케줄 (매주 등)&lt;/li&gt;
&lt;li&gt;Compliance 상태 리포트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;8-availability-and-continuity-management&quot;&gt;8. Availability and Continuity Management&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;가용성 + 재해복구&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RTO&lt;/strong&gt; (Recovery Time Objective): 복구까지 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RPO&lt;/strong&gt; (Recovery Point Objective): 데이터 손실 허용 시간&lt;/li&gt;
&lt;li&gt;Multi-AZ, Multi-region&lt;/li&gt;
&lt;li&gt;DR runbook&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;9-application-performance-monitoring-apm&quot;&gt;9. Application Performance Monitoring (APM)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;앱 성능 관측&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Latency percentiles (p50, p95, p99)&lt;/li&gt;
&lt;li&gt;Throughput&lt;/li&gt;
&lt;li&gt;Error rate&lt;/li&gt;
&lt;li&gt;Apdex score&lt;/li&gt;
&lt;li&gt;User experience&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sre-site-reliability-engineering&quot;&gt;SRE (Site Reliability Engineering)&lt;/h2&gt;
&lt;p&gt;Google 이 만든 클라우드 시대 운영 접근법. Operations perspective 의 실현.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 원칙&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automation&lt;/strong&gt;: 반복 작업 자동화 (toil 제거)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measurement&lt;/strong&gt;: 모든 것 측정 (SLI/SLO/SLA)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error budget&lt;/strong&gt;: 100% 가용성 목표 X (혁신과 안정성 균형)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blameless postmortem&lt;/strong&gt;: 사람 아닌 시스템 문제로&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Toil&lt;/strong&gt;: 자동화 가능한 반복 수동 작업. SRE 는 toil 50% 이하 유지 목표.&lt;/p&gt;
&lt;h2 id=&quot;slo--sli--sla&quot;&gt;SLO / SLI / SLA&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SLI (Indicator)&lt;/strong&gt;: 측정 지표. 예: “요청의 99% 가 200ms 이하로 응답”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SLO (Objective)&lt;/strong&gt;: 내부 목표. 예: 99.9% availability/month&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SLA (Agreement)&lt;/strong&gt;: 고객과의 계약. 위반 시 배상.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Error Budget&lt;/strong&gt; = 100% - SLO. 예: SLO 99.9% -&gt; error budget 0.1% = 43분/월.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Budget 남으면: 새 기능 배포 OK&lt;/li&gt;
&lt;li&gt;Budget 소진: 안정성 개선 우선&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dora-metrics&quot;&gt;DORA Metrics&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Elite performing team&lt;/strong&gt; 지표 (Google DevOps Research):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deployment Frequency&lt;/strong&gt;: 몇 번 배포 (일/주)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lead Time for Changes&lt;/strong&gt;: 코드 커밋 -&gt; 프로덕션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change Failure Rate&lt;/strong&gt;: 배포가 문제 유발 %&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time to Restore Service&lt;/strong&gt;: 사고 복구 시간&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Elite&lt;/strong&gt;: 하루 여러 번 배포, 리드타임 &amp;#x3C; 1시간, 실패율 &amp;#x3C; 15%, MTTR &amp;#x3C; 1시간.&lt;/p&gt;
&lt;h2 id=&quot;operational-runbook&quot;&gt;Operational Runbook&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;표준 운영 절차 문서화&lt;/strong&gt;. 특정 상황에 따라야 할 단계.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Runbook: RDS Failover&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. CloudWatch alarm 확인 (CPU / Connections)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. Read replica lag 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. Manual failover 필요 시:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   aws rds failover-db-cluster --db-cluster-identifier prod-db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4. Application 재시작 (필요 시)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5. PIR 준비&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Systems Manager Automation runbook 으로 자동화 가능.&lt;/p&gt;
&lt;h2 id=&quot;chaos-engineering&quot;&gt;Chaos Engineering&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;의도적 실패 주입&lt;/strong&gt; 으로 시스템 회복력 검증.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Fault Injection Simulator (FIS)&lt;/strong&gt;: EC2 stop, latency 주입 등&lt;/li&gt;
&lt;li&gt;Netflix Chaos Monkey (원조)&lt;/li&gt;
&lt;li&gt;Game days (팀 훈련)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reliability capability 검증.&lt;/p&gt;
&lt;h2 id=&quot;automation-priorities&quot;&gt;Automation Priorities&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: CI/CD, IaC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing&lt;/strong&gt;: 자동 통합/E2E 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;: 알람 자동&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remediation&lt;/strong&gt;: 자동 복구 (예: EC2 replace)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scaling&lt;/strong&gt;: Auto Scaling, HPA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup / Restore&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patching&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;well-architected-operational-excellence&quot;&gt;Well-Architected Operational Excellence&lt;/h2&gt;
&lt;p&gt;Platform perspective 의 6 pillar 중 하나. Operations 는 이 pillar 의 실현.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;설계 원칙&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perform operations as code&lt;/li&gt;
&lt;li&gt;Make frequent, small, reversible changes&lt;/li&gt;
&lt;li&gt;Refine operations procedures frequently&lt;/li&gt;
&lt;li&gt;Anticipate failure&lt;/li&gt;
&lt;li&gt;Learn from all operational failures&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-활동&quot;&gt;실전 활동&lt;/h2&gt;
&lt;h3 id=&quot;envision&quot;&gt;Envision&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;현재 운영 성숙도 진단 (DORA)&lt;/li&gt;
&lt;li&gt;SLO 정의&lt;/li&gt;
&lt;li&gt;Incident history 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;align&quot;&gt;Align&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Observability 스택 설계&lt;/li&gt;
&lt;li&gt;On-call 계획&lt;/li&gt;
&lt;li&gt;Runbook 저장소&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;launch&quot;&gt;Launch&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CloudWatch dashboard + alarm&lt;/li&gt;
&lt;li&gt;On-call rotation 시작&lt;/li&gt;
&lt;li&gt;첫 GameDay&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;scale&quot;&gt;Scale&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;자동 remediation 확대&lt;/li&gt;
&lt;li&gt;SRE 팀 성숙&lt;/li&gt;
&lt;li&gt;DORA metric 지속 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;흔한-실패-패턴&quot;&gt;흔한 실패 패턴&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;관측 없이 배포&lt;/strong&gt;. 문제 발생 시 진단 불가. Metrics/logs/traces 첫날부터.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Alert fatigue&lt;/strong&gt;. 노이즈 알람 많으면 진짜 사고 놓침. SLO 기반 알람만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Runbook 없이 사고&lt;/strong&gt;. 매번 처음처럼. 반복되는 문제는 runbook + 자동화.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;PIR 를 blame 세션으로&lt;/strong&gt;. 사람 지목은 문화 파괴. 시스템/프로세스 개선 초점.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;DR 안 훈련&lt;/strong&gt;. 실제 사고 시 실패. 정기 DR drill.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-caf|AWS CAF]] - 상위 개요&lt;/li&gt;
&lt;li&gt;[[aws-caf-business|Business Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-people|People Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-governance|Governance Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-platform|Platform Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-security|Security Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]]&lt;/li&gt;
&lt;li&gt;[[opentelemetry|OpenTelemetry]]&lt;/li&gt;
&lt;li&gt;[[prometheus|Prometheus]]&lt;/li&gt;
&lt;li&gt;[[slo-sli-error-budget|SLO/SLI/Error Budget]]&lt;/li&gt;
&lt;li&gt;[[latency-percentiles|Latency Percentiles]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>caf</category><category>operations</category><category>sre</category><category>observability</category><author>koa (김신건)</author></item><item><title>[AWS CAF] People Perspective</title><link>https://shinkeonkim.com/wiki/cloud/aws-caf-people/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-caf-people/</guid><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;People Perspective&lt;/strong&gt; 는 [[aws-caf|AWS CAF]] 6 관점 중 &lt;strong&gt;비즈니스 와 기술 사이의 다리&lt;/strong&gt; 역할을 하는 관점입니다. &lt;strong&gt;문화, 조직 구조, 리더십, 인력 (workforce)&lt;/strong&gt; 을 다루며, “변화 (change) 가 일상 (business-as-normal) 이 되는” 조직 문화로의 진화를 촉진합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 stakeholder&lt;/strong&gt;: CIO, COO, CTO, cloud director, cross-functional/enterprise-wide leaders.&lt;/p&gt;
&lt;h2 id=&quot;왜-people-관점이-중요한가&quot;&gt;왜 People 관점이 중요한가&lt;/h2&gt;
&lt;p&gt;기술적으로 성숙한 조직도 &lt;strong&gt;사람 관점 미숙&lt;/strong&gt; 이면 실패:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;스킬 갭 -&gt; 프로덕션 문제&lt;/li&gt;
&lt;li&gt;저항 문화 -&gt; 도입 지연&lt;/li&gt;
&lt;li&gt;사일로 조직 -&gt; 협업 저해&lt;/li&gt;
&lt;li&gt;리더십 부재 -&gt; 방향성 상실&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;“기술은 쉽고, 사람이 어렵다”&lt;/strong&gt; 는 격언이 여기 해당.&lt;/p&gt;
&lt;h2 id=&quot;주요-capabilities&quot;&gt;주요 Capabilities&lt;/h2&gt;
&lt;h3 id=&quot;1-culture-evolution-문화-진화&quot;&gt;1. Culture Evolution (문화 진화)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;실험, 학습, 실패 허용&lt;/strong&gt; 문화로 진화. 위계적 승인 -&gt; 자율적 결정.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;측정&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;실험 횟수/분기&lt;/li&gt;
&lt;li&gt;Blameless postmortem 실행&lt;/li&gt;
&lt;li&gt;팀 자율성 지수&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-transformational-leadership-변혁적-리더십&quot;&gt;2. Transformational Leadership (변혁적 리더십)&lt;/h3&gt;
&lt;p&gt;경영진의 클라우드 전환 명확한 커밋. 리더 자체가 클라우드/디지털에 대한 이해 필수.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;활동&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;리더 클라우드 교육 (AWS Cloud Practitioner 등)&lt;/li&gt;
&lt;li&gt;정기 town hall 에서 비전 반복&lt;/li&gt;
&lt;li&gt;성공 스토리 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-cloud-fluency-클라우드-유창성&quot;&gt;3. Cloud Fluency (클라우드 유창성)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;모든 직원이 클라우드 기초 이해&lt;/strong&gt;. IT 팀만이 아니라 재무/HR/영업도.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloud 101 교육&lt;/li&gt;
&lt;li&gt;용어집 (glossary)&lt;/li&gt;
&lt;li&gt;사내 뉴스레터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-workforce-transformation-인력-전환&quot;&gt;4. Workforce Transformation (인력 전환)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;스킬 갭 매핑 + 재교육 계획&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;현재 스킬 인벤토리&lt;/li&gt;
&lt;li&gt;Target 스킬 매핑&lt;/li&gt;
&lt;li&gt;Learning path 별 교육&lt;/li&gt;
&lt;li&gt;AWS Certifications (Cloud Practitioner, Solutions Architect Associate, …)&lt;/li&gt;
&lt;li&gt;외부 채용 vs 내부 재교육&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-organizational-design-조직-설계&quot;&gt;5. Organizational Design (조직 설계)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;클라우드 지향 팀 구조&lt;/strong&gt;. Product team, DevOps team, Cloud Center of Excellence (CCoE).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;전통&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Dev team -----&gt; QA team -----&gt; Ops team -----&gt; Prod&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;클라우드 지향&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Product team (Dev + QA + Ops)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;CCoE (표준, 도구, 지원)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;6-organizational-alignment-조직-정렬&quot;&gt;6. Organizational Alignment (조직 정렬)&lt;/h3&gt;
&lt;p&gt;여러 팀이 같은 목표 / 인센티브. 사일로 감소.&lt;/p&gt;
&lt;h3 id=&quot;7-team-enablement-팀-인에이블먼트&quot;&gt;7. Team Enablement (팀 인에이블먼트)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;셀프서비스 도구, 문서, 지원&lt;/strong&gt;. 팀이 자율적으로 클라우드 활용.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloud portal (IaC 템플릿, 표준)&lt;/li&gt;
&lt;li&gt;사내 Slack channel (&lt;code&gt;#cloud-help&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Office hours&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;8-continuous-learning-지속-학습&quot;&gt;8. Continuous Learning (지속 학습)&lt;/h3&gt;
&lt;p&gt;기술은 계속 변함. 학습이 상시 프로세스.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learning budget 개인/팀별&lt;/li&gt;
&lt;li&gt;Conference/summit 참가&lt;/li&gt;
&lt;li&gt;Book club, tech talk&lt;/li&gt;
&lt;li&gt;Certification renewal&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cloud-center-of-excellence-ccoe&quot;&gt;Cloud Center of Excellence (CCoE)&lt;/h2&gt;
&lt;p&gt;People perspective 의 핵심 조직 단위. &lt;strong&gt;클라우드 관련 전문성 + 표준 + 지원&lt;/strong&gt; 을 담당.&lt;/p&gt;
&lt;h3 id=&quot;책임&quot;&gt;책임&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Landing Zone / 계정 관리&lt;/li&gt;
&lt;li&gt;표준 (naming, tagging, security)&lt;/li&gt;
&lt;li&gt;Reusable IaC 모듈&lt;/li&gt;
&lt;li&gt;교육 프로그램&lt;/li&gt;
&lt;li&gt;팀 지원 (컨설팅, 페어링)&lt;/li&gt;
&lt;li&gt;FinOps 리더십&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;조직-배치&quot;&gt;조직 배치&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Federated CCoE&lt;/strong&gt;: 중앙 팀 + 각 사업부 embed. 규모 있는 조직.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Central CCoE&lt;/strong&gt;: 하나의 중앙 팀. 시작 단계.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hub-and-spoke&lt;/strong&gt;: 중앙 CCoE + 각 팀의 champion. 균형.&lt;/p&gt;
&lt;h2 id=&quot;aws-certifications-path&quot;&gt;AWS Certifications Path&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Foundational&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Certified Cloud Practitioner (모든 직원 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Associate&lt;/strong&gt; (기술직):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solutions Architect Associate&lt;/li&gt;
&lt;li&gt;Developer Associate&lt;/li&gt;
&lt;li&gt;SysOps Administrator Associate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Professional&lt;/strong&gt; (시니어):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solutions Architect Professional&lt;/li&gt;
&lt;li&gt;DevOps Engineer Professional&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Specialty&lt;/strong&gt; (전문):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security, Advanced Networking, Machine Learning, Data Analytics, Database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AI 시리즈&lt;/strong&gt; (2024+):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Certified AI Practitioner&lt;/li&gt;
&lt;li&gt;AWS Certified Machine Learning Engineer Associate&lt;/li&gt;
&lt;li&gt;AWS Certified Machine Learning Specialty&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;learning-resources&quot;&gt;Learning Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Skill Builder&lt;/strong&gt;: 무료/유료 온라인 과정 (500+)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Training Partners&lt;/strong&gt;: 강의실 교육&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS re:Invent, re:Inforce&lt;/strong&gt;: 연례 컨퍼런스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Immersion Days&lt;/strong&gt;: 실습 세미나&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Well-Architected Labs&lt;/strong&gt;: 실전 시나리오&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Workshops&lt;/strong&gt;: 자율 실습&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-활동&quot;&gt;실전 활동&lt;/h2&gt;
&lt;h3 id=&quot;envision&quot;&gt;Envision&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;조직 문화 진단 (survey)&lt;/li&gt;
&lt;li&gt;현재 스킬 인벤토리&lt;/li&gt;
&lt;li&gt;리더십 커밋 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;align&quot;&gt;Align&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CCoE 구조 설계&lt;/li&gt;
&lt;li&gt;팀별 target skill 매핑&lt;/li&gt;
&lt;li&gt;Learning path 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;launch&quot;&gt;Launch&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;첫 팀 재교육 (pilot)&lt;/li&gt;
&lt;li&gt;CCoE 시범 운영&lt;/li&gt;
&lt;li&gt;문화 이니셔티브 (postmortem, tech talk)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;scale&quot;&gt;Scale&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;전사 확장&lt;/li&gt;
&lt;li&gt;지속 인에이블먼트 (매년 certification renewal)&lt;/li&gt;
&lt;li&gt;채용 브랜딩 (클라우드 인재)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;문화-변화-사례&quot;&gt;문화 변화 사례&lt;/h2&gt;
&lt;h3 id=&quot;devops-문화&quot;&gt;DevOps 문화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dev + Ops 팀 통합&lt;/li&gt;
&lt;li&gt;“You build it, you run it”&lt;/li&gt;
&lt;li&gt;Blameless postmortem&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;실험-문화&quot;&gt;실험 문화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Two-pizza team&lt;/li&gt;
&lt;li&gt;Feature flag 로 A/B&lt;/li&gt;
&lt;li&gt;실패는 학습 기회&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;data-driven-문화&quot;&gt;Data-driven 문화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;결정을 데이터로&lt;/li&gt;
&lt;li&gt;Dashboard 상시 참조&lt;/li&gt;
&lt;li&gt;가설 -&gt; 실험 -&gt; 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;흔한-실패-패턴&quot;&gt;흔한 실패 패턴&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;교육 없이 도입&lt;/strong&gt;. IT 팀이 EC2, S3 밖에 몰라 클라우드 네이티브 서비스 (Lambda, EKS, Bedrock) 활용 못 함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;CCoE 를 통제 조직으로&lt;/strong&gt;. Enabler 여야 하는데 “허가 게이트” 로 전락하면 팀 자율성 저해.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;문화 변화는 몇 년 걸림&lt;/strong&gt;. 기술 도입 (몇 개월) 대비 훨씬 오래. 인내와 리더십 지속.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;리더가 first mover&lt;/strong&gt;. 임원 교육을 먼저 (Cloud Practitioner 등). 모범 없이 아래 요구 안 됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;인재 유출 리스크&lt;/strong&gt;. 재교육받은 인재를 경쟁사가 스카웃. 커리어 트랙 + 대우 정비.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-caf|AWS CAF]] - 상위 개요&lt;/li&gt;
&lt;li&gt;[[aws-caf-business|Business Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-governance|Governance Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-platform|Platform Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-security|Security Perspective]]&lt;/li&gt;
&lt;li&gt;[[aws-caf-operations|Operations Perspective]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>caf</category><category>people</category><category>culture</category><category>workforce</category><author>koa (김신건)</author></item></channel></rss>