<?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] Amazon Pinpoint: EoS &amp; End User Messaging 마이그레이션</title><link>https://shinkeonkim.com/wiki/cloud/aws-pinpoint/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-pinpoint/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Pinpoint&lt;/strong&gt; 는 AWS 의 &lt;em&gt;고객 참여 (customer engagement) 플랫폼&lt;/em&gt; 이었음. 이메일, SMS, 푸시 알림, 음성 통화를 통합 채널로 발송하고 세그먼트/캠페인/저니로 조직화. &lt;strong&gt;2024-11 End of Support 발표, 2026-10-30 종료 예정&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;end-of-support-타임라인-핵심&quot;&gt;End of Support 타임라인 (핵심)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;2026-10-30 이후 Pinpoint 콘솔 접근/주요 기능 사용 불가&lt;/strong&gt;. 지금 마이그레이션 계획 필수.&lt;/p&gt;
&lt;/blockquote&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;2024-11&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;End of Support 공식 발표&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2025&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;2026-10-30&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;콘솔 접근 종료, Endpoints/Segments/Campaigns/Journeys/Analytics 종료&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;무엇이-종료되고-무엇이-남는가&quot;&gt;무엇이 종료되고 무엇이 남는가&lt;/h2&gt;
&lt;h3 id=&quot;종료되는-것-2026-10-30&quot;&gt;종료되는 것 (2026-10-30)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pinpoint 콘솔 UI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Endpoints&lt;/strong&gt; - 사용자별 채널 프로필 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Segments&lt;/strong&gt; - 오디언스 타겟팅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Campaigns&lt;/strong&gt; - 예약 발송&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Journeys&lt;/strong&gt; - 다단계 워크플로 (트리거 -&gt; 이메일 -&gt; 대기 -&gt; SMS 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analytics&lt;/strong&gt; - 발송/오픈/클릭 대시보드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine Learning 모델&lt;/strong&gt; - 추천, 이탈 예측&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;남는-것-계속-유지&quot;&gt;남는 것 (계속 유지)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SMS v2 API&lt;/strong&gt; - &lt;code&gt;AWS End User Messaging SMS&lt;/code&gt; 로 이관&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice v2 API&lt;/strong&gt; - &lt;code&gt;AWS End User Messaging Voice&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Push API&lt;/strong&gt; - &lt;code&gt;AWS End User Messaging Push&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OTP API&lt;/strong&gt; - OTP 검증&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phone Number 관리&lt;/strong&gt; - 발신 번호 (long code, short code, TFN)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, &lt;em&gt;로우 레벨 채널 API 는 이름만 바뀌어 유지&lt;/em&gt;. 상위 오케스트레이션 (segment/campaign/journey) 은 사라짐.&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;Pinpoint 에서 하던 것&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;Pinpoint SMS 발송&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AWS End User Messaging SMS&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Pinpoint Voice 발송&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AWS End User Messaging Voice&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Pinpoint Push 알림&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AWS End User Messaging Push&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Pinpoint OTP&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AWS End User Messaging OTP&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Pinpoint 이메일&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Amazon SES&lt;/strong&gt; (Simple Email Service)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Endpoints/Segments 관리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;자체 DB&lt;/strong&gt; ([[dynamodb|DynamoDB]] / [[aws-rds|RDS]]) + 앱 로직&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Campaigns (예약 발송)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-eventbridge|EventBridge Scheduler]] + [[aws-lambda|Lambda]]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Journeys (워크플로)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-step-functions|Step Functions]]&lt;/strong&gt; + End User Messaging&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Analytics (open/click)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Amazon SES event destinations&lt;/strong&gt; + [[aws-kinesis-data-streams|Kinesis]] + BI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Predictive ML&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;SageMaker&lt;/strong&gt; (자체 학습)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;aws-end-user-messaging&quot;&gt;AWS End User Messaging&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;포지션&lt;/strong&gt;: Pinpoint 의 channel API 를 계승한 새 서비스군.&lt;/p&gt;
&lt;h3 id=&quot;end-user-messaging-sms&quot;&gt;End User Messaging SMS&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&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sms &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;pinpoint-sms-voice-v2&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# API 는 여전히 v2&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;response &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sms.send_text_message(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    DestinationPhoneNumber&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;+821012345678&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;    OriginationIdentity&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;+18005551234&apos;&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:#FFAB70&quot;&gt;    MessageBody&lt;/span&gt;&lt;span style=&quot;color:#F97583&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:#FFAB70&quot;&gt;    MessageType&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;TRANSACTIONAL&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# or PROMOTIONAL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    ConfigurationSetName&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;my-config-set&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;p&gt;&lt;strong&gt;기능&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200+ 국가 SMS 발송&lt;/li&gt;
&lt;li&gt;Long/Short code, 10DLC, TFN, Sender ID&lt;/li&gt;
&lt;li&gt;Two-way SMS (수신)&lt;/li&gt;
&lt;li&gt;MMS (일부 국가)&lt;/li&gt;
&lt;li&gt;Delivery reports -&gt; [[aws-kinesis-data-streams|Kinesis]] / [[aws-sns|SNS]] / CloudWatch&lt;/li&gt;
&lt;li&gt;Opt-out 자동 처리&lt;/li&gt;
&lt;li&gt;국가별 요금&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;end-user-messaging-push&quot;&gt;End User Messaging Push&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;APNs (iOS), FCM (Android), ADM (Kindle), Baidu&lt;/li&gt;
&lt;li&gt;발송 API 직접 호출 (오케스트레이션은 직접)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;end-user-messaging-voice&quot;&gt;End User Messaging Voice&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TTS (Polly 통합) 또는 사전 녹음&lt;/li&gt;
&lt;li&gt;OTP 음성 전달&lt;/li&gt;
&lt;li&gt;국제 발신&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;이메일-amazon-ses&quot;&gt;이메일: Amazon SES&lt;/h2&gt;
&lt;p&gt;Pinpoint 이메일은 &lt;strong&gt;SES 로 마이그레이션&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;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 style=&quot;color:#E1E4E8&quot;&gt;ses &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;sesv2&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;ses.send_email(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    FromEmailAddress&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;no-reply@example.com&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;    Destination&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;ToAddresses&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;user@example.com&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;    Content&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;Simple&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;Subject&apos;&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 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:#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;Html&apos;&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 style=&quot;color:#9ECBFF&quot;&gt;&apos;&amp;#x3C;h1&gt;주문이 접수되었습니다&amp;#x3C;/h1&gt;&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:#FFAB70&quot;&gt;    ConfigurationSetName&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;transactional&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;p&gt;&lt;strong&gt;SES 주요 기능&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transactional / marketing 이메일&lt;/li&gt;
&lt;li&gt;SPF / DKIM / DMARC&lt;/li&gt;
&lt;li&gt;Reputation dashboard&lt;/li&gt;
&lt;li&gt;Event destinations -&gt; [[aws-kinesis-data-streams|KDS]] / [[aws-eventbridge|EventBridge]]&lt;/li&gt;
&lt;li&gt;Suppression list&lt;/li&gt;
&lt;li&gt;Sending quota (샌드박스 -&gt; 프로덕션 승인)&lt;/li&gt;
&lt;li&gt;Configuration sets&lt;/li&gt;
&lt;li&gt;템플릿 (SES Templates)&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;    subgraph Trigger[트리거]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Time[&quot;EventBridge Scheduler&amp;#x3C;br/&gt;(cron)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Event[&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;    end&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;    Trigger --&gt; SF[&quot;Step Functions&amp;#x3C;br/&gt;(저니 워크플로)&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;    subgraph Journey[&quot;예: Cart Abandonment 저니&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S1[&quot;1. 즉시 SMS 전송&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S2[&quot;2. 1시간 대기&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S3[&quot;3. 이메일 전송&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S4[&quot;4. 24시간 대기&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S5[&quot;5. 최종 할인 이메일&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SF -.-&gt; S1 -.-&gt; S2 -.-&gt; S3 -.-&gt; S4 -.-&gt; S5&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;    S1 --&gt; EUM[&quot;End User Messaging SMS&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3 --&gt; SES[&quot;Amazon SES&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S5 --&gt; SES&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;    Analytics[&quot;Analytics&amp;#x3C;br/&gt;(open/click)&quot;] -.-&gt; Kinesis&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SES --&gt; Kinesis[Kinesis]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Kinesis --&gt; S3D[(&quot;S3 이벤트 저장&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3D --&gt; Athena[Athena SQL 대시보드]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Endpoints/Segments 대체&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자 프로필 저장: [[dynamodb|DynamoDB]] 또는 [[aws-rds|RDS]]&lt;/li&gt;
&lt;li&gt;Segment 조회: 프로필 DB 에 SQL / query&lt;/li&gt;
&lt;li&gt;Personalization: 자체 로직 or SageMaker&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;otp-one-time-password&quot;&gt;OTP (One-Time Password)&lt;/h2&gt;
&lt;p&gt;Pinpoint OTP API 는 그대로 유지 (End User Messaging).&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:#E1E4E8&quot;&gt;sms.send_destination_number_verification_code(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    DestinationPhoneNumber&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;+821012345678&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;    DestinationCountryParameters&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:#FFAB70&quot;&gt;    OriginationIdentity&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;+18005551234&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;    ConfigurationSetName&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;otp-config&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;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;sms.verify_destination_number(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    DestinationPhoneNumber&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;+821012345678&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;    VerificationCode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;123456&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;pinpoint-를-계속-쓰던-사용자를-위한-체크리스트&quot;&gt;Pinpoint 를 계속 쓰던 사용자를 위한 체크리스트&lt;/h2&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; 마이그레이션 계획 수립 (2026-10-30 데드라인)&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; 채널별 대체 서비스 결정 (SMS/Voice/Push -&gt; End User Messaging, Email -&gt; SES)&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Endpoints/Segments 를 자체 DB 로 이관 ([[dynamodb|DynamoDB]] / [[aws-rds|RDS]])&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Campaigns -&gt; [[aws-eventbridge|EventBridge Scheduler]] + [[aws-lambda|Lambda]]&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Journeys -&gt; [[aws-step-functions|Step Functions]]&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Analytics -&gt; SES/EUM event destinations + [[aws-kinesis-data-streams|Kinesis]] + BI&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Predictive 기능 -&gt; SageMaker 자체 학습&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; IAM 정책 재검토 (&lt;code&gt;mobiletargeting:*&lt;/code&gt; -&gt; &lt;code&gt;sms-voice:*&lt;/code&gt;, &lt;code&gt;ses:*&lt;/code&gt;)&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; 발신 번호 (long/short code) 인벤토리&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; 인증/SPF/DKIM 재구성 (SES)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;신규-프로젝트라면&quot;&gt;신규 프로젝트라면&lt;/h2&gt;
&lt;p&gt;Pinpoint 자체는 &lt;strong&gt;선택하지 말 것&lt;/strong&gt;. 처음부터:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SMS/Push/Voice&lt;/strong&gt; -&gt; AWS End User Messaging&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt; -&gt; Amazon SES&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;오케스트레이션&lt;/strong&gt; -&gt; [[aws-step-functions|Step Functions]] + [[aws-eventbridge|EventBridge]]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용자 프로필&lt;/strong&gt; -&gt; [[dynamodb|DynamoDB]]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분석&lt;/strong&gt; -&gt; [[aws-kinesis-data-streams|Kinesis]] + [[aws-s3|S3]] + [[aws-athena|Athena]] + QuickSight&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;2026-10-30 이후 Pinpoint 콘솔/기능 종료&lt;/strong&gt;. 지금 마이그레이션 시작. 미룰수록 위험.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Endpoints/Segments/Campaigns/Journeys 는 자동 마이그레이션 안 됨&lt;/strong&gt;. 자체 앱으로 재구현.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;&lt;code&gt;mobiletargeting:*&lt;/code&gt; 권한&lt;/strong&gt; 은 없어짐. 신규 IAM 은 &lt;code&gt;sms-voice:*&lt;/code&gt;, &lt;code&gt;ses:*&lt;/code&gt;, &lt;code&gt;push:*&lt;/code&gt; (End User Messaging).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;SES 는 처음 sandbox 모드&lt;/strong&gt; (본인 확인된 주소만 발송). 프로덕션 발송은 승인 요청 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;SMS 국가별 규제&lt;/strong&gt; 상이 (10DLC, TFN 등록 등). 발신 번호 종류 신중 선택.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;A/B 테스트, Personalization&lt;/strong&gt; 등 고급 기능은 자체 구현하거나 서드파티 (Braze, OneSignal, Iterable) 로.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-lambda|AWS Lambda]] - 발송 로직&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge|EventBridge]] - 스케줄링&lt;/li&gt;
&lt;li&gt;[[aws-step-functions|Step Functions]] - 저니 오케스트레이션&lt;/li&gt;
&lt;li&gt;[[aws-sns|SNS]] - 알림 (다른 용도, 시스템 알림)&lt;/li&gt;
&lt;li&gt;[[dynamodb|DynamoDB]] - 사용자 프로필 저장&lt;/li&gt;
&lt;li&gt;[[aws-kinesis-data-streams|Kinesis]] - 이벤트 수집&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - 권한&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>pinpoint</category><category>messaging</category><category>sms</category><category>email</category><category>push</category><category>end-of-support</category><author>koa (김신건)</author></item><item><title>[AWS] Amazon Redshift</title><link>https://shinkeonkim.com/wiki/cloud/aws-redshift/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-redshift/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Redshift&lt;/strong&gt; 는 AWS 가 관리하는 &lt;strong&gt;페타바이트 규모 컬럼형 데이터 웨어하우스&lt;/strong&gt; 입니다. 2012년 PostgreSQL 8.0.2 를 기반으로 시작해 &lt;strong&gt;MPP (Massively Parallel Processing)&lt;/strong&gt; 아키텍처로 대규모 분석 쿼리를 병렬 실행합니다. 2020년대에는 &lt;strong&gt;Redshift Serverless&lt;/strong&gt;, &lt;strong&gt;Zero-ETL&lt;/strong&gt;, &lt;strong&gt;Data Sharing (writes)&lt;/strong&gt;, &lt;strong&gt;Streaming Ingestion&lt;/strong&gt;, &lt;strong&gt;Redshift ML&lt;/strong&gt; 등으로 확장되었습니다.&lt;/p&gt;
&lt;h2 id=&quot;왜-데이터-웨어하우스-인가&quot;&gt;왜 데이터 웨어하우스 인가&lt;/h2&gt;
&lt;p&gt;OLTP (RDS, Aurora) 는 트랜잭션 지향 (row-based). 분석 쿼리 (수십억 행 aggregation) 는 다른 스토리지/실행 모델이 필요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;컬럼형 저장&lt;/strong&gt;: 필요 컬럼만 읽음 -&gt; I/O 절감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;압축&lt;/strong&gt;: 컬럼 값이 유사 -&gt; 압축률 높음 (5-10x)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MPP&lt;/strong&gt;: 슬라이스로 나뉜 데이터를 병렬 스캔&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;집계 최적화&lt;/strong&gt;: SUM, COUNT, GROUP BY 등 대량 aggregation 특화&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 LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  U[클라이언트&amp;#x3C;br/&gt;BI/JDBC/ODBC] --&gt; LN[Leader Node]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  LN --&gt; CN1[Compute Node 1]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  LN --&gt; CN2[Compute Node 2]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  LN --&gt; CN3[Compute Node N]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  CN1 --&gt; RMS[(Redshift Managed&amp;#x3C;br/&gt;Storage on S3)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  CN2 --&gt; RMS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  CN3 --&gt; RMS&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Leader Node&lt;/strong&gt;: 쿼리 파싱, 최적화, compute node 로 분배, 결과 통합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compute Nodes&lt;/strong&gt;: 실제 데이터 저장 + 실행. 각 노드는 여러 &lt;strong&gt;slice&lt;/strong&gt; 로 분할.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RMS (Redshift Managed Storage)&lt;/strong&gt;: S3 위 계층. Compute 와 스토리지 독립 스케일링 (RA3+).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;노드-유형-2025-2026&quot;&gt;노드 유형 (2025-2026)&lt;/h2&gt;
&lt;h3 id=&quot;ra3-권장&quot;&gt;RA3 (권장)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Compute + Storage 분리&lt;/strong&gt;. Compute 만 늘리거나 storage 만 확장 가능.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ra3.large&lt;/strong&gt;, &lt;strong&gt;ra3.xlplus&lt;/strong&gt;, &lt;strong&gt;ra3.4xlarge&lt;/strong&gt;, &lt;strong&gt;ra3.16xlarge&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Storage&lt;/strong&gt;: 실제 데이터는 S3 layer. Local SSD 는 캐시.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Sharing, Zero-ETL, Streaming Ingestion&lt;/strong&gt; 모두 RA3+ 만.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ds2-deprecated&quot;&gt;DS2 (Deprecated)&lt;/h3&gt;
&lt;p&gt;이전 노드. RA3 로 마이그레이션 권장.&lt;/p&gt;
&lt;h3 id=&quot;dc2-deprecated&quot;&gt;DC2 (Deprecated)&lt;/h3&gt;
&lt;p&gt;Dense Compute. Compute+Storage 결합. 2025년 이후 신규 사용 안 함.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;결론&lt;/strong&gt;: RA3 또는 &lt;strong&gt;Redshift Serverless&lt;/strong&gt; 만 선택.&lt;/p&gt;
&lt;h2 id=&quot;redshift-serverless&quot;&gt;Redshift Serverless&lt;/h2&gt;
&lt;p&gt;Compute 를 완전 자동 스케일. 유휴 시 요금 없음.&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;RPU (Redshift Processing Unit) 단위&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Base capacity: 8 ~ 512 RPU&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;provisioned-ra3-vs-serverless&quot;&gt;Provisioned RA3 vs Serverless&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;RA3 provisioned&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Serverless&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;예측 가능한 지속 부하&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;Reserved instance 로 저렴&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;Cluster 관리 필요&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;워크로드 관리 (WLM)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Manual + Auto&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Auto only&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;Instance-hour 지속&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;0&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;Concurrency Scaling 필요&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;: 새 프로젝트는 Serverless 부터. 예측 가능한 heavy 부하면 RA3.&lt;/p&gt;
&lt;h2 id=&quot;managed-storage-rms&quot;&gt;Managed Storage (RMS)&lt;/h2&gt;
&lt;p&gt;RA3 / Serverless 의 스토리지 계층. S3 위에 구축되어 &lt;strong&gt;compute 와 독립 스케일&lt;/strong&gt;. 사용자는 스토리지 크기 걱정 없음, 사용한 만큼 GB-월 청구.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backup&lt;/strong&gt;: 자동 (증분)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hot data&lt;/strong&gt;: local SSD 캐시&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cold data&lt;/strong&gt;: S3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;압축&lt;/strong&gt;: 컬럼별 자동 encoding&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;분산-스타일-distribution-style&quot;&gt;분산 스타일 (Distribution Style)&lt;/h2&gt;
&lt;p&gt;테이블 데이터를 노드에 어떻게 나눌지.&lt;/p&gt;
&lt;h3 id=&quot;even&quot;&gt;EVEN&lt;/h3&gt;
&lt;p&gt;라운드 로빈. 균등 분포. &lt;strong&gt;JOIN 없는 fact table&lt;/strong&gt; 에 적합.&lt;/p&gt;
&lt;h3 id=&quot;key&quot;&gt;KEY&lt;/h3&gt;
&lt;p&gt;특정 컬럼 hash 로 분산. &lt;strong&gt;같은 key 조인 시 co-located&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; orders&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  order_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  user_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; NOT NULL&lt;/span&gt;&lt;span style=&quot;color:#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;) DISTKEY(user_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:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; users&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  user_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; NOT NULL&lt;/span&gt;&lt;span style=&quot;color:#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;) DISTKEY(user_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:#6A737D&quot;&gt;-- users.user_id JOIN orders.user_id 는 network shuffle 없이 로컬&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;all&quot;&gt;ALL&lt;/h3&gt;
&lt;p&gt;모든 노드에 복제. &lt;strong&gt;작은 dimension table&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; date_dim&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (...) DISTSTYLE ALL;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;auto&quot;&gt;AUTO&lt;/h3&gt;
&lt;p&gt;Redshift 가 데이터 크기 기반 자동 선택. 기본값.&lt;/p&gt;
&lt;h2 id=&quot;정렬-키-sort-key&quot;&gt;정렬 키 (Sort Key)&lt;/h2&gt;
&lt;p&gt;블록 skip 을 위한 물리적 정렬:&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; orders&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  order_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  order_date &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  amount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;NUMERIC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) SORTKEY(order_date);&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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; SUM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(amount) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; orders &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WHERE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; order_date &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-01-01&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;-- Redshift 는 order_date &amp;#x3C; 2026-01-01 인 블록 skip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compound sort key&lt;/strong&gt; (기본): 여러 컬럼 우선순위&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interleaved sort key&lt;/strong&gt;: 여러 컬럼 균등 (거의 사용 안 함, 성능 저하 사례 다수)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;압축-encoding&quot;&gt;압축 (Encoding)&lt;/h2&gt;
&lt;p&gt;컬럼 별 압축. 자동 감지 (ANALYZE COMPRESSION) 또는 명시:&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; users&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  user_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ENCODE az64,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  email &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;VARCHAR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;256&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) ENCODE zstd,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  created_at &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TIMESTAMP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ENCODE az64,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  status&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; CHAR&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;) ENCODE bytedict&lt;/span&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;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AZ64&lt;/strong&gt; (Amazon 개발, 정수/시간에 최적)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZSTD&lt;/strong&gt; (범용, 문자열)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LZO&lt;/strong&gt;, &lt;strong&gt;RUNLENGTH&lt;/strong&gt;, &lt;strong&gt;DELTA&lt;/strong&gt;, &lt;strong&gt;BYTEDICT&lt;/strong&gt;, &lt;strong&gt;MOSTLY8/16/32&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;copy-대량-로드&quot;&gt;COPY (대량 로드)&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;sql&quot;&gt;&lt;code&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; orders&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:#9ECBFF&quot;&gt; &apos;s3://my-bucket/data/orders/&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;arn:aws:iam::123:role/RedshiftLoadRole&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;FORMAT &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; PARQUET&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;지원 format: CSV, TSV, JSON, [[apache-parquet|Parquet]], ORC, Avro. Parquet 가 컬럼형이라 로드 빠름. 대부분의 [[etl|ETL]] 파이프라인은 [[aws-glue|Glue]] 로 변환 후 Parquet 로 저장 -&gt; COPY.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;옵션&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MAXERROR&lt;/code&gt;: 오류 허용 개수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MANIFEST&lt;/code&gt;: 여러 파일을 매니페스트로&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COMPUPDATE&lt;/code&gt;: 압축 encoding 자동 갱신&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;redshift-spectrum-s3-쿼리&quot;&gt;Redshift Spectrum (S3 쿼리)&lt;/h2&gt;
&lt;p&gt;S3 데이터를 Redshift 로 로드하지 않고 직접 쿼리. External table.&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SCHEMA&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; spectrum_schema&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:#F97583&quot;&gt; DATA&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; CATALOG&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DATABASE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;my_glue_db&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;arn:aws:iam::123:role/SpectrumRole&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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum_schema&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;access_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; date&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-01-01&apos;&lt;/span&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;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- Redshift 내부 테이블과 JOIN 도 가능&lt;/span&gt;&lt;/span&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:#79B8FF&quot;&gt; o&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;order_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;l&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;click_count&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; orders o&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;JOIN&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum_schema&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;access_logs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ON&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; o&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;user_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; l&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;user_id&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;[[aws-glue|Glue Data Catalog]] 로 스키마 관리. [[apache-parquet|Parquet]] / ORC 가 성능 최적. 별도 요금 &lt;code&gt;$5/TB scanned&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;자세히: [[aws-redshift-spectrum|Redshift Spectrum]].&lt;/p&gt;
&lt;h2 id=&quot;data-sharing&quot;&gt;Data Sharing&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Cross-cluster / cross-account read (write 도 지원)&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- Producer cluster&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; DATASHARE sales_share;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ALTER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; DATASHARE sales_share &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ADD&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SCHEMA&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; public;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ALTER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; DATASHARE sales_share &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ADD&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; public&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders&lt;/span&gt;&lt;span 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;GRANT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; USAGE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; DATASHARE sales_share &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TO&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ACCOUNT &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;123456789012&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:#6A737D&quot;&gt;-- Consumer cluster&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; DATABASE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sales_shared&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; DATASHARE sales_share OF ACCOUNT &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;123456789012&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; NAMESPACE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;producer-namespace&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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sales_shared&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.orders;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;RA3 / Serverless 만&lt;/strong&gt;. 조직 내 팀별 사일로 관리에 유리.&lt;/p&gt;
&lt;h2 id=&quot;zero-etl-integrations&quot;&gt;Zero-ETL Integrations&lt;/h2&gt;
&lt;p&gt;Aurora MySQL / PostgreSQL, RDS MySQL, DynamoDB 등에서 Redshift 로 &lt;strong&gt;거의 실시간 replication&lt;/strong&gt;. DMS 없이.&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;Source (Aurora / RDS / DynamoDB)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ↓ (초 단위 CDC)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Redshift (Zero-ETL target)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;소스에 트랜잭션 -&gt; Redshift 반영 (수 초)&lt;/li&gt;
&lt;li&gt;최대 50 통합/target&lt;/li&gt;
&lt;li&gt;Primary key 필요 (source 테이블)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;streaming-ingestion&quot;&gt;Streaming Ingestion&lt;/h2&gt;
&lt;p&gt;Kinesis Data Streams, MSK (Kafka) 에서 실시간 로드.&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SCHEMA&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; kds &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; KINESIS;&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MATERIALIZED VIEW events &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AUTO&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; REFRESH YES &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;/span&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; approximate_arrival_timestamp,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       JSON_EXTRACT_PATH_TEXT(kinesis_data, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;user_id&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)::&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; user_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       JSON_EXTRACT_PATH_TEXT(kinesis_data, &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;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; event&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; kds.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;my-stream&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; WHERE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; is_utf8(kinesis_data);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Materialized view auto-refresh 로 지속 갱신.&lt;/p&gt;
&lt;h2 id=&quot;redshift-ml&quot;&gt;Redshift ML&lt;/h2&gt;
&lt;p&gt;SQL 로 ML 모델 학습/예측. SageMaker 자동 통합.&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL churn_prediction&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; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; customer_id, age, tenure, ..., churned &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; customers &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WHERE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churn_flag_known &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TRUE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TARGET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churned&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FUNCTION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; predict_churn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SETTINGS (S3_BUCKET &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;my-redshift-ml-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&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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; customer_id, predict_churn(age, tenure, ...) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churn_probability&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; customers;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;내부적으로 SageMaker Autopilot / XGBoost / LinearLearner 등 활용.&lt;/p&gt;
&lt;h2 id=&quot;concurrency-scaling&quot;&gt;Concurrency Scaling&lt;/h2&gt;
&lt;p&gt;트래픽 급증 시 &lt;strong&gt;추가 클러스터 자동 프로비저닝&lt;/strong&gt;. Read-heavy 쿼리 오프로드.&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;ALTER&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; analyst &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; enable_result_cache_for_session &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TO&lt;/span&gt;&lt;span style=&quot;color:#F97583&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:#F97583&quot;&gt;ALTER&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SYSTEM&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; concurrency_scaling &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TO&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; auto&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;RA3 는 매일 1시간 무료, 이후 초 단위 청구. Serverless 는 자동.&lt;/p&gt;
&lt;h2 id=&quot;wlm-workload-management&quot;&gt;WLM (Workload Management)&lt;/h2&gt;
&lt;p&gt;RA3 provisioned 만. Query queue 를 정의해 사용자별 우선순위.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto WLM&lt;/strong&gt; (권장): AWS 자동 조정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual WLM&lt;/strong&gt;: 큐/메모리/동시성 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Redshift Serverless 는 auto only.&lt;/p&gt;
&lt;h2 id=&quot;vacuum--analyze&quot;&gt;VACUUM &amp;#x26; ANALYZE&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VACUUM&lt;/strong&gt;: DELETE 후 공간 회수, 정렬 재수행 (RA3+ 는 대부분 자동)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ANALYZE&lt;/strong&gt;: 통계 갱신 (query optimizer)&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;VACUUM FULL orders;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ANALYZE orders;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;백업--복구&quot;&gt;백업 &amp;#x26; 복구&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automated snapshot&lt;/strong&gt;: 8시간 or 5 GB 데이터 변경마다 (자동)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual snapshot&lt;/strong&gt;: 사용자 지정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-region copy&lt;/strong&gt;: DR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restore from snapshot&lt;/strong&gt;: 새 클러스터로&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;성능-튜닝&quot;&gt;성능 튜닝&lt;/h2&gt;
&lt;h3 id=&quot;1-distkey--sortkey-설계&quot;&gt;1. DISTKEY / SORTKEY 설계&lt;/h3&gt;
&lt;p&gt;Join 자주 하는 컬럼 = DISTKEY, filter/range 쿼리 컬럼 = SORTKEY.&lt;/p&gt;
&lt;h3 id=&quot;2-copy-성능&quot;&gt;2. COPY 성능&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-part&lt;/strong&gt; 파일 (여러 개로 나눠 병렬 로드)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parquet&lt;/strong&gt; (컬럼형, 압축)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;압축 파일&lt;/strong&gt;: gzip/bzip2/lzop&lt;/li&gt;
&lt;/ul&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;EXPLAIN &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;span 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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; SVL_QLOG &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WHERE&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;STL_, SVL_ 시스템 뷰로 실행 이력, redistribution 감지.&lt;/p&gt;
&lt;h3 id=&quot;4-materialized-view&quot;&gt;4. Materialized View&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:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MATERIALIZED VIEW daily_sales &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;/span&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:#F97583&quot;&gt; DATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(order_date), &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;SUM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(amount) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; orders &lt;/span&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&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;주기적 refresh 또는 auto refresh.&lt;/p&gt;
&lt;h3 id=&quot;5-result-cache&quot;&gt;5. Result Cache&lt;/h3&gt;
&lt;p&gt;같은 쿼리 반복 -&gt; 캐시 결과 (기본 활성).&lt;/p&gt;
&lt;h2 id=&quot;보안&quot;&gt;보안&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPC only&lt;/strong&gt; (RA3 provisioned) 또는 VPC + public (조합 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption&lt;/strong&gt;: KMS (기본 활성 권장)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAM 통합&lt;/strong&gt;: SSO, IAM database authentication&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Column-level access control&lt;/strong&gt;: &lt;code&gt;GRANT SELECT (col1, col2) ON table TO user;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Row-level security (RLS)&lt;/strong&gt;: 정책 기반 row 필터&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;데이터-api-redshift-data&quot;&gt;데이터 API (&lt;code&gt;redshift-data&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;JDBC 없이 REST 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;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; redshift-data&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; execute-statement&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;  --workgroup-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-serverless-workgroup&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;  --database&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dev&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;  --sql&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;SELECT COUNT(*) FROM orders;&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:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; redshift-data&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get-statement-result&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --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;Lambda 등에서 편리.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;DC2 / DS2 은 legacy&lt;/strong&gt;. RA3 / Serverless 로 마이그레이션 권장 (2025년 이후 신규 지원 축소).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;&lt;code&gt;INSERT&lt;/code&gt; 한 행씩은 매우 느림&lt;/strong&gt;. 대량 로드는 반드시 COPY. Streaming Ingestion 도 batch.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;JOIN 이 nested loop / hash redistribute&lt;/strong&gt; 로 실행되면 성능 급락. DISTKEY 설계로 co-located join.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Serverless base RPU 하한&lt;/strong&gt;. 너무 낮으면 병렬성 부족. 프로덕션은 최소 16 RPU 부터 검토.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Zero-ETL 지연&lt;/strong&gt;. “거의 실시간” 이지만 몇 초 ~ 몇 분. Sub-second 요구는 다른 아키텍처.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;VARCHAR 크기 잘못 잡으면 낭비&lt;/strong&gt;. 컬럼형 압축이 크기 영향 받음. 필요 이상 크게 잡지 말 것.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;redshift-vs-다른-데이터-웨어하우스&quot;&gt;Redshift vs 다른 데이터 웨어하우스&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;DW&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;Redshift&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 통합, 성숙, Spectrum&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Vertical scaling 어려움 (Serverless 로 완화)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Snowflake&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Multi-cloud, 사용자 경험 우수&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;BigQuery&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Serverless, low overhead&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GCP 종속&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Databricks SQL&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Delta Lake + Photon&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;ClickHouse&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;Firebolt&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;ul&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - Redshift 가 구현하는 개념&lt;/li&gt;
&lt;li&gt;[[etl|ETL / ELT]] - 데이터 로딩 파이프라인&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - 권장 COPY 포맷&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - S3 데이터 직접 쿼리&lt;/li&gt;
&lt;li&gt;[[aws-athena|Amazon Athena]] - Serverless SQL 대안&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - ETL + Data Catalog&lt;/li&gt;
&lt;li&gt;[[aws-rds|RDS]] - OLTP 대안&lt;/li&gt;
&lt;li&gt;[[aws-neptune|Neptune]] - 그래프 대안&lt;/li&gt;
&lt;li&gt;[[aws-documentdb|DocumentDB]] - NoSQL 대안&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - Spectrum, 백업 저장소&lt;/li&gt;
&lt;li&gt;[[aws-s3-glacier|S3 Glacier]] - Cold 데이터 아카이빙&lt;/li&gt;
&lt;li&gt;[[aws-s3-vectors|S3 Vectors]] - 벡터 저장 대안&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - IAM 통합 인증&lt;/li&gt;
&lt;li&gt;[[aws-kms|KMS]] - 저장 암호화&lt;/li&gt;
&lt;li&gt;[[aws-vpc|VPC]] - 네트워크&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]] - 모니터링&lt;/li&gt;
&lt;li&gt;[[aws-sagemaker|SageMaker]] - Redshift ML 백엔드&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>database</category><category>data-warehouse</category><category>analytics</category><category>olap</category><author>koa (김신건)</author></item><item><title>[AWS] Athena: 서버리스 SQL on S3</title><link>https://shinkeonkim.com/wiki/cloud/aws-athena/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-athena/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Athena&lt;/strong&gt; 는 &lt;em&gt;S3 에 있는 데이터를 서버 없이 SQL 로 쿼리&lt;/em&gt; 하는 서비스. 클러스터 프로비저닝, 스키마 로딩, 인덱스 생성 없이 데이터 파일 (Parquet/ORC/CSV/JSON/Iceberg/Hudi/Delta) 을 바로 쿼리.&lt;/p&gt;
&lt;p&gt;내부 엔진은 &lt;strong&gt;Trino&lt;/strong&gt; 기반 (Engine v3). 이전 v2 는 Presto 기반이었음. [[aws-glue|Glue Data Catalog]] 를 메타 저장소로 씀.&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;Ad-hoc 로그 분석&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;BI 대시보드 백엔드 (QuickSight 등)&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;Data lake 위 SQL&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;ETL의 lightweight transform (CTAS)&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;Federated query (RDS/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;초저지연 (&amp;#x3C; 1초) API 백엔드&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;부적합&lt;/em&gt;, DW 나 캐시&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;, [[postgresql|Postgres]]&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;, [[aws-redshift|Redshift]] / EMR&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;사용자 / BI / Lambda&quot;] --&gt;|&quot;SQL&quot;| Athena&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Athena --&gt;|&quot;meta 조회&quot;| Glue[(&quot;Glue Data Catalog&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Athena --&gt;|&quot;data 스캔&quot;| S3[(&quot;S3 데이터&amp;#x3C;br/&gt;Parquet/ORC/CSV/Iceberg&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Athena --&gt;|&quot;결과 저장&quot;| Res[(&quot;S3 결과 버킷&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Athena --&gt;|&quot;제어&quot;| WG[&quot;Workgroup&amp;#x3C;br/&gt;(비용/암호화/버전)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;엔진&lt;/strong&gt;: Trino (Engine v3)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메타 저장소&lt;/strong&gt;: [[aws-glue|Glue Data Catalog]] (Hive Metastore 호환)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터&lt;/strong&gt;: [[aws-s3|S3]] 그대로 (Athena 는 저장 X)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결과&lt;/strong&gt;: S3 결과 버킷 (workgroup 별)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;engine-v2-vs-v3&quot;&gt;Engine v2 vs v3&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;v2 (구)&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;v3 (현재)&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;Presto&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Trino&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-15% 개선&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;SQL 표준&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Presto 계열&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ANSI SQL 확장&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[apache-parquet|Parquet]] v2 encoding&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;Iceberg / Hudi / Delta&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;Query Result Reuse&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O (24h)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;auto-upgrade&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;-&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;기본 활성 (workgroup 별)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;정책&lt;/strong&gt;: v3 이 기본. AWS Health Dashboard 로 deprecation 통보. Workgroup pin 도 가능.&lt;/p&gt;
&lt;h2 id=&quot;요금-모델&quot;&gt;요금 모델&lt;/h2&gt;
&lt;h3 id=&quot;1-on-demand-기본&quot;&gt;1. On-demand (기본)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$5 / TB scanned&lt;/strong&gt; (region 별 상이, us-east-1 기준)&lt;/li&gt;
&lt;li&gt;최소 &lt;strong&gt;10 MB per query&lt;/strong&gt; (실제 스캔이 작아도 10 MB 로 청구)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성공/실패 쿼리 모두 청구&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DDL 은 무료&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Scan 1 TB Parquet =  $5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Scan 4 GB Parquet =  $5 × 4/1024 = $0.02  (10MB 는 넘으니 실 크기)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Scan 5 MB CSV     =  $5 × 10/1024/1024 = $0.00005  (10MB 로 청구)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-capacity-reservation-예약&quot;&gt;2. Capacity Reservation (예약)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$0.30 / DPU-hour&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;예측 가능한 큰 워크로드에 유리 (스캔 요금 아님)&lt;/li&gt;
&lt;li&gt;사용 안 하는 시간에는 요금 청구 안 됨 (예약 안 하면)&lt;/li&gt;
&lt;li&gt;DPU 을 워크그룹 단위로 예약&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;언제 유리&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하루 수 TB 이상 반복 스캔&lt;/li&gt;
&lt;li&gt;동시 사용자 많음&lt;/li&gt;
&lt;li&gt;스캔량이 큰 쿼리를 자주&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-athena-for-apache-spark&quot;&gt;3. Athena for Apache Spark&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$0.35 / DPU-hour&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Driver 1 DPU + workers (계산 시간만)&lt;/li&gt;
&lt;li&gt;Notebook 세션 (Jupyter 스타일)&lt;/li&gt;
&lt;/ul&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;계산 6회, 각 20 DPU 1분, 세션 1시간 (driver 1 DPU):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  worker DPU-hour = 6 × 20 × (1/60) = 2 DPU-hr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  driver DPU-hour = 1 × 1 = 1 DPU-hr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  총 = 3 DPU-hr × $0.35 = $1.05&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-federated-query&quot;&gt;4. Federated Query&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터 스캔은 동일 $5/TB&lt;/li&gt;
&lt;li&gt;Lambda 커넥터 호출 = Lambda 요금 별도&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;workgroups&quot;&gt;Workgroups&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;팀/워크로드 격리 단위&lt;/em&gt;. 각 workgroup 은:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;결과 저장 위치 (S3)&lt;/li&gt;
&lt;li&gt;암호화 정책&lt;/li&gt;
&lt;li&gt;엔진 버전 pin&lt;/li&gt;
&lt;li&gt;데이터 스캔 한도 (per-query, per-workgroup)&lt;/li&gt;
&lt;li&gt;CloudWatch 지표 발행 여부&lt;/li&gt;
&lt;li&gt;태그 (비용 배분)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cost Control&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;per-query limit:  1 GB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  → 쿼리가 1 GB 초과 스캔 시 자동 cancel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;per-workgroup limit: 10 GB / 15분&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  → SNS 알림 (자동 cancel 아님)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;가장 흔한 사고 방지: &lt;code&gt;SELECT *&lt;/code&gt; 인 실수 쿼리로 수 TB 스캔되는 것을 workgroup 한도로 차단.&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;1 TB raw 스캔 시 실 스캔량&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;CSV (uncompressed)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1x&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1 TB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;CSV + GZIP&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;3-4x&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~300 GB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$1.50&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;JSON&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1-2x&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~800 GB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[apache-parquet|Parquet]] + SNAPPY&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;3-4x + column projection&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~10 GB (컬럼 1개)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.05&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[apache-parquet|Parquet]] + ZSTD&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;4-6x + column projection&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~7 GB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$0.035&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
CSV -&gt; Parquet 로 옮기는 것만으로 &lt;strong&gt;10-100배 요금 절감&lt;/strong&gt;. Athena 비용 최적화의 첫 단계.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;파티션-partitions&quot;&gt;파티션 (Partitions)&lt;/h2&gt;
&lt;p&gt;Hive 스타일 디렉토리 파티션:&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;s3://bucket/events/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── year=2026/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── month=07/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   │   ├── day=15/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   │   │   └── part-00000.parquet&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; events (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  user_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  event_type STRING,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  amount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DECIMAL&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 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:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PARTITIONED &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;year&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;month&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;day&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;STORED &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; PARQUET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LOCATION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://bucket/events/&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:#6A737D&quot;&gt;-- 파티션 등록 (자동)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;MSCK REPAIR &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TABLE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; events;&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;-- 쿼리 (year=2026, month=7 파티션만 스캔)&lt;/span&gt;&lt;/span&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:#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;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; events&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; year&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2026&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; month&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 7&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;purchase&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;h3 id=&quot;partition-projection&quot;&gt;Partition Projection&lt;/h3&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; events (...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PARTITIONED &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;year&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;month&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;day&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;STORED &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; PARQUET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LOCATION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://bucket/events/&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;TBLPROPERTIES (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &apos;projection.enabled&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;true&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;projection.year.type&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;integer&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;projection.year.range&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;2020,2027&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;projection.month.type&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;integer&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;projection.month.range&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;1,12&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;projection.day.type&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;integer&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;projection.day.range&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;1,31&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;storage.location.template&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://bucket/events/year=${year}/month=${month}/day=${day}/&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;p&gt;&lt;strong&gt;장점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Glue Catalog partition API 호출 없음 (요금/지연 감소)&lt;/li&gt;
&lt;li&gt;새 파티션 자동 인식 (&lt;code&gt;ALTER TABLE ADD PARTITION&lt;/code&gt; 불필요)&lt;/li&gt;
&lt;li&gt;대규모 시계열에 최적&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ctas-create-table-as-select&quot;&gt;CTAS (CREATE TABLE AS SELECT)&lt;/h2&gt;
&lt;p&gt;쿼리 결과를 새 테이블로 저장. Parquet + 파티셔닝으로 lightweight ETL.&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; curated&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.orders_2026&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:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  format &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;PARQUET&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;  parquet_compression &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;ZSTD&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;  external_location &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://curated/orders_2026/&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;  partitioned_by &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ARRAY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&apos;year&apos;, &apos;month&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;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  order_id, user_id, amount,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  YEAR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(order_date) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; year&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  MONTH&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(order_date) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; month&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:#79B8FF&quot;&gt; raw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders&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:#E1E4E8&quot;&gt; order_date &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; DATE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;2026-01-01&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;p&gt;&lt;strong&gt;INSERT INTO&lt;/strong&gt; 도 지원 (append). CTAS + INSERT INTO 는 사실상 Athena 내에서 [[etl|ELT]] 를 가능하게 함.&lt;/p&gt;
&lt;h2 id=&quot;apache-iceberg-athena-에서&quot;&gt;Apache Iceberg (Athena 에서)&lt;/h2&gt;
&lt;p&gt;Iceberg v2 테이블 완전 지원 (2024+).&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lakehouse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.orders (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  order_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  user_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  amount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DECIMAL&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 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:#E1E4E8&quot;&gt;  order_date &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DATE&lt;/span&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;PARTITIONED &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (order_date)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LOCATION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://lakehouse/orders/&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;TBLPROPERTIES (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &apos;table_type&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;ICEBERG&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;format&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;parquet&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;write_compression&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;zstd&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;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ACID 트랜잭션 (UPDATE / DELETE / MERGE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;UPDATE&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; lakehouse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; amount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; amount &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;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; WHERE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; order_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 123&lt;/span&gt;&lt;span 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;DELETE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; lakehouse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; WHERE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; user_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 999&lt;/span&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;MERGE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INTO&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; lakehouse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USING&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; staging &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  ON&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;order_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;order_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  WHEN&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; MATCHED&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; THEN&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; UPDATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; amount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;amount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  WHEN&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; NOT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; MATCHED&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; THEN&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INSERT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; VALUES&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;order_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;user_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;amount&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;order_date&lt;/span&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;-- Time travel&lt;/span&gt;&lt;/span&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:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; lakehouse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FOR&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TIMESTAMP&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OF &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TIMESTAMP&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;2026-07-01 00:00:00&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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; lakehouse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FOR&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; VERSION&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OF &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;12345&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;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lake Formation 으로 등록된 Iceberg 테이블 DDL 제한&lt;/li&gt;
&lt;li&gt;중첩 필드 파티셔닝 X&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ALTER TABLE SET LOCATION&lt;/code&gt; 미지원&lt;/li&gt;
&lt;li&gt;시간 정밀도 밀리초 (마이크로초 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;federated-query&quot;&gt;Federated Query&lt;/h2&gt;
&lt;p&gt;Lambda 커넥터로 &lt;em&gt;S3 밖 데이터&lt;/em&gt; 를 SQL 로 조인.&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;지원 커넥터:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- RDS (MySQL, PostgreSQL)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Redshift&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- DynamoDB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- DocumentDB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Elasticsearch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- CloudWatch Logs / Metrics&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- HBase&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Custom (Lambda 로 직접 개발)&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 사전에 데이터 소스 등록 (커넥터 Lambda + IAM)&lt;/span&gt;&lt;/span&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:#79B8FF&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;customer_name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;SUM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;amount&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; total&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:#79B8FF&quot;&gt; rds_mysql&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.customers r&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;JOIN&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; s3_lake&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.orders a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ON&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;customer_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;customer_id&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; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;customer_name&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;: 대량 데이터를 원격 소스에서 pull 하면 Lambda 요금 + 지연. 소규모 lookup 이나 dimension join 에 적합.&lt;/p&gt;
&lt;h2 id=&quot;query-result-reuse-2023&quot;&gt;Query Result Reuse (2023+)&lt;/h2&gt;
&lt;p&gt;같은 쿼리를 24시간 이내 재실행 시 캐시된 결과 반환. 스캔 요금 없음.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;정확히 같은 쿼리 텍스트여야 함 (whitespace, comment 제외)&lt;/li&gt;
&lt;li&gt;Workgroup 이 같아야 함&lt;/li&gt;
&lt;li&gt;24시간 이내 (default, &lt;code&gt;MaxAgeInMinutes&lt;/code&gt; 설정 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;prepared-statements--views&quot;&gt;Prepared Statements &amp;#x26; Views&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- Prepared&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PREPARE q1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;/span&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:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; orders &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WHERE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; user_id &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;AND&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; status&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;EXECUTE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USING&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 123&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;paid&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:#6A737D&quot;&gt;-- View (Athena native)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE OR REPLACE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; VIEW&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; top_customers&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AS&lt;/span&gt;&lt;/span&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; customer_id, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;SUM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(amount) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; total&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; orders&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:#E1E4E8&quot;&gt; customer_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;HAVING&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; SUM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(amount) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&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;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;athena-for-apache-spark&quot;&gt;Athena for Apache Spark&lt;/h2&gt;
&lt;p&gt;Spark notebook 을 서버리스로. Trino SQL 로 안 되는 분석/ML feature engineering 에.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spark 3.5, Python&lt;/li&gt;
&lt;li&gt;세션 idle 20분 기본&lt;/li&gt;
&lt;li&gt;Iceberg / Hudi / Delta 지원&lt;/li&gt;
&lt;li&gt;DPU 기반 (&lt;code&gt;$0.35 / DPU-hour&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;노트북 첫 셀에서 세션 자동 생성. 커스텀 Spark 설정 가능.&lt;/p&gt;
&lt;h2 id=&quot;aws-athenaathena-vs-aws-redshift-spectrumredshift-spectrum-vs-aws-redshiftredshift&quot;&gt;[[aws-athena|Athena]] vs [[aws-redshift-spectrum|Redshift Spectrum]] vs [[aws-redshift|Redshift]]&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;Athena&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Redshift Spectrum&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Redshift (RA3/Serverless)&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;Trino&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redshift 자체&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redshift 자체&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;S3 만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;S3 + RMS 조인&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;RMS 내부&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;필요 (Redshift 클러스터)&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;$5/TB 스캔&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$5/TB Spectrum + Redshift 컴퓨트&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redshift 컴퓨트&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;클러스터 한도 (concurrency scaling)&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;JOIN 성능&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수 (RA3 노드에서)&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;ETL&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CTAS 지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한 (external table read 위주)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;COPY, MERGE 등&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;Ad-hoc, BI, ETL lite&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redshift 를 이미 씀 + S3 조인&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;무거운 배치, warehouse&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;사용-예제&quot;&gt;사용 예제&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ALB 로그 (S3 에 이미 있음)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&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;  type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; STRING, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; STRING, elb STRING,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  client_ip STRING, target_ip STRING, request_processing_time DOUBLE,&lt;/span&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:#F97583&quot;&gt;ROW&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; FORMAT SERDE &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;org.apache.hadoop.hive.serde2.RegexSerDe&apos;&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:#E1E4E8&quot;&gt; SERDEPROPERTIES (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;serialization.format&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;input.regex&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&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;LOCATION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://my-alb-logs/AWSLogs/123/elasticloadbalancing/us-east-1/2026/07/&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:#6A737D&quot;&gt;-- 지난 시간 5xx 오류 top 10 client&lt;/span&gt;&lt;/span&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, &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; n&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:#E1E4E8&quot;&gt; elb_status_code &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LIKE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;5%&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  AND&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-30T14:00:00Z&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:#E1E4E8&quot;&gt; client_ip&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; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DESC&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; LIMIT&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;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;s3-access-log-를-quicksight-대시보드로&quot;&gt;S3 Access Log 를 QuickSight 대시보드로&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;S3 Access Log → S3 → Glue Crawler → Glue Catalog&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;                              Athena Table&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;                            QuickSight 대시보드&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;&lt;code&gt;SELECT *&lt;/code&gt; on CSV&lt;/strong&gt; = 스캔량 폭탄. 컬럼 프로젝션 (필요한 컬럼만) + Parquet 로 변환.&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;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;파티션 프루닝 안 됨&lt;/strong&gt; = &lt;code&gt;WHERE UPPER(year) = &apos;2026&apos;&lt;/code&gt; 같은 함수 적용은 파티션 프루닝 실패. &lt;code&gt;WHERE year = 2026&lt;/code&gt; 그대로.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;작은 파일 수천 개&lt;/strong&gt; = Athena 성능 붕괴 + 요청 오버헤드. CTAS 로 큰 파일로 합침, Iceberg auto-compact.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Workgroup 한도 미설정&lt;/strong&gt; = 실수 &lt;code&gt;SELECT *&lt;/code&gt; 로 수십 TB 스캔 후 요금 청구. 반드시 per-query / per-workgroup 한도.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;10 MB 최소 청구&lt;/strong&gt; = 매우 작은 쿼리가 많은 워크로드는 오히려 비쌈. Batch aggregation 고려.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Federated Query 를 반복 대량 처리에 사용&lt;/strong&gt; = Lambda 요금 폭탄 + 지연. Materialize 후 로컬 조인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Iceberg 를 Lake Formation 으로 등록&lt;/strong&gt; = DDL 제한. Athena 에서 UPDATE/DELETE 안 되는 경우 있음. 등록 방식 사전 검토.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Query Result Reuse 를 데이터 신선도 필요한 쿼리에&lt;/strong&gt; = 최대 24시간 stale. &lt;code&gt;NoReuse&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-glue|AWS Glue]] - 메타 저장소, ETL&lt;/li&gt;
&lt;li&gt;[[aws-redshift|Redshift]] - DW 대안, Spectrum 의 엔진&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - Redshift 에서 S3 쿼리&lt;/li&gt;
&lt;li&gt;[[aws-s3|AWS S3]] - 데이터 소스&lt;/li&gt;
&lt;li&gt;[[aws-s3-glacier|S3 Glacier]] - Athena 로는 직접 못 씀 (restore 필요)&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - 필수 포맷&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - lakehouse 형태로 대체&lt;/li&gt;
&lt;li&gt;[[etl|ETL / ELT]] - CTAS 로 파이프라인 구현&lt;/li&gt;
&lt;li&gt;[[aws-lambda|Lambda]] - federated 커넥터&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - 접근 제어&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]] - 쿼리 지표&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>athena</category><category>sql</category><category>serverless</category><category>analytics</category><category>trino</category><category>presto</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, 30 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; (Content Delivery Network). 전 세계 &lt;strong&gt;600+ PoP (Points of Presence)&lt;/strong&gt; + &lt;strong&gt;13 Regional Edge Cache&lt;/strong&gt; 를 통해 사용자에게 가장 가까운 edge 에서 콘텐츠 제공. 지연 감소, origin 부하 감소, DDoS 완화가 목적.&lt;/p&gt;
&lt;h2 id=&quot;cloudfront-는-어떻게-동작하는가-원리&quot;&gt;CloudFront 는 어떻게 동작하는가 (원리)&lt;/h2&gt;
&lt;h3 id=&quot;1-글로벌-네트워크-계층&quot;&gt;1. 글로벌 네트워크 계층&lt;/h3&gt;
&lt;p&gt;CloudFront 는 &lt;strong&gt;3계층 캐시 구조&lt;/strong&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;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;사용자&amp;#x3C;br/&gt;(서울)&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;    subgraph Tier1[&quot;1차 캐시 (PoP)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Edge1[&quot;Edge Location&amp;#x3C;br/&gt;ICN61 (서울)&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Tier2[&quot;2차 캐시 (Regional)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        REC[&quot;Regional Edge Cache&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;    end&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;    subgraph Tier3[&quot;3차 캐시 (선택)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Shield[&quot;Origin Shield&amp;#x3C;br/&gt;(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;    end&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;    Origin[&quot;Origin&amp;#x3C;br/&gt;(S3 / ALB / Custom)&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;|&quot;1. DNS: cf-xxx.cloudfront.net&amp;#x3C;br/&gt;(anycast IP)&quot;| Edge1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Edge1 --&gt;|&quot;MISS&quot;| REC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    REC --&gt;|&quot;MISS&quot;| Shield&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Shield --&gt;|&quot;MISS&quot;| Origin&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;    Origin -.-&gt;|&quot;응답&quot;| Shield&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Shield -.-&gt; REC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    REC -.-&gt; Edge1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Edge1 -.-&gt; Client&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;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;Edge Location (PoP)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;600+ 도시&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;Regional Edge Cache&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;13 리전&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;PoP 미스 시 상위 캐시, 콘텐츠 대량&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;Origin Shield&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;특정 리전 (선택)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;최상위 통합 캐시, origin 요청 정리&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;Origin&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;S3/ALB/EC2/Custom&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;실제 데이터&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1개 (또는 origin group)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;2-dns-기반-라우팅-anycast&quot;&gt;2. DNS 기반 라우팅 (Anycast)&lt;/h3&gt;
&lt;p&gt;사용자가 &lt;code&gt;d111.cloudfront.net&lt;/code&gt; 을 조회하면:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;[[aws-route53|Route 53]]&lt;/strong&gt; (또는 사용자 DNS) 이 CloudFront 의 anycast IP 반환&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BGP anycast&lt;/strong&gt;: 같은 IP 를 전 세계 모든 PoP 이 광고 -&gt; ISP 는 가장 가까운 PoP 으로 라우팅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency-based / Geo-based&lt;/strong&gt; 조합: 정확한 지연 측정 결과와 지리적 위치를 함께 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Global Accelerator 와 차이&lt;/strong&gt;: [[aws-global-accelerator|Global Accelerator]] 는 anycast IP 2개를 사용자에게 제공 (정적 IP 필요 시), CloudFront 는 도메인 기반 라우팅 + HTTP/HTTPS 콘텐츠 캐싱에 특화.&lt;/p&gt;
&lt;h3 id=&quot;3-tcp--tls-종단-termination-at-edge&quot;&gt;3. TCP + TLS 종단 (Termination at Edge)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;핵심 성능 이점&lt;/strong&gt;: TCP handshake + TLS handshake 가 사용자와 가장 가까운 edge 에서 완료.&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;사용자 (서울) -&gt; ICN61 PoP (서울): TCP + TLS handshake (~5-10 ms RTT)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ICN61 PoP -&gt; Origin (us-east-1): AWS 백본 (지속 연결, keep-alive)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;일반 인터넷 대비 handshake 지연 100 ms+ 절감 가능&lt;/li&gt;
&lt;li&gt;Origin 연결은 &lt;strong&gt;persistent connection&lt;/strong&gt; 재사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/2, HTTP/3 (QUIC)&lt;/strong&gt; 지원 -&gt; multiplexing, 0-RTT resumption&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-aws-global-backbone-활용&quot;&gt;4. AWS Global Backbone 활용&lt;/h3&gt;
&lt;p&gt;Edge -&gt; Origin 구간은 &lt;strong&gt;인터넷이 아닌 AWS 사설 백본&lt;/strong&gt; 을 타고 감. BGP flap / peering 문제 없음.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Global backbone: 100+ Tbps 용량&lt;/li&gt;
&lt;li&gt;여러 대륙 간 전용 광케이블&lt;/li&gt;
&lt;li&gt;원본이 [[aws-s3|S3]] / ALB 인 경우 데이터 전송 완전 내부 (인터넷 hop 0)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-cache-계층-cache-tier-hierarchy&quot;&gt;5. Cache 계층 (Cache Tier Hierarchy)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;세 레벨 조회 순서&lt;/strong&gt; (miss 시 상위로):&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;1) Edge (PoP) 캐시 확인       → HIT: 즉시 응답 (~10 ms)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2) MISS → Regional Edge Cache 조회&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3) MISS → Origin Shield 조회 (활성화 시)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4) MISS → Origin fetch → 각 계층에 캐싱&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;PoP 이 600+ 개 -&gt; 각 PoP 은 콘텐츠의 일부만 캐시 (용량 제한)&lt;/li&gt;
&lt;li&gt;인기 콘텐츠는 PoP 에서 처리&lt;/li&gt;
&lt;li&gt;롱테일 콘텐츠는 Regional Edge Cache 에서 흡수 (Origin 요청 감소)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6-origin-shield-선택-최상위-캐시&quot;&gt;6. Origin Shield (선택 최상위 캐시)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Origin Shield&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;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;    subgraph NoShield[&quot;Origin Shield 없음&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        REC1[&quot;Regional 도쿄&quot;] --&gt; Origin1[&quot;Origin&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        REC2[&quot;Regional 프랑크푸르트&quot;] --&gt; Origin1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        REC3[&quot;Regional 상파울루&quot;] --&gt; Origin1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Note1[&quot;여러 REC 이 origin 을 동시에 fetch&amp;#x3C;br/&gt;= origin 부하 증가&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph WithShield[&quot;Origin Shield 있음&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        REC4[&quot;Regional 도쿄&quot;] --&gt; Shield[&quot;Origin Shield&amp;#x3C;br/&gt;(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;        REC5[&quot;Regional 프랑크푸르트&quot;] --&gt; Shield&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        REC6[&quot;Regional 상파울루&quot;] --&gt; Shield&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Shield --&gt; Origin2[&quot;Origin&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Note2[&quot;단 하나의 Origin Shield 가 origin fetch&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;    end&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;Origin 부하 감소 (같은 콘텐츠를 여러 REC 이 각자 fetch 하는 문제 해결)&lt;/li&gt;
&lt;li&gt;Cache hit rate 상승 (전역 통합)&lt;/li&gt;
&lt;li&gt;Custom origin (온프레미스) 의 대역폭 절감&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;과금&lt;/strong&gt;: Origin Shield 요청 수 × 요금 (data-out 은 origin 요금과 통합).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;언제 켜나&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Origin 이 다중 리전에서 동시에 요청받아 부담될 때&lt;/li&gt;
&lt;li&gt;Origin 이 온프레미스 / 자체 서버&lt;/li&gt;
&lt;li&gt;Cache hit rate 를 최대화 (인기 콘텐츠가 여러 지역에 균등 분포)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7-요청-흐름-완전판&quot;&gt;7. 요청 흐름 (완전판)&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;    participant U as 사용자 (서울)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant DNS as Route 53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Edge as ICN61 PoP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant REC as 도쿄 Regional Edge&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Shield as Origin Shield (us-east-1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Origin as Origin (S3 us-east-1)&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;    U-&gt;&gt;DNS: d111.cloudfront.net?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DNS--&gt;&gt;U: anycast IP (서울 근처)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    U-&gt;&gt;Edge: TCP + TLS handshake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    U-&gt;&gt;Edge: GET /image.jpg&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;    alt Edge 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;U: 응답 (~10 ms)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    else Edge 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;REC: 상위 fetch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        alt REC HIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            REC--&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;U: 응답&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        else REC MISS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            REC-&gt;&gt;Shield: 상위 fetch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            alt Shield HIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Shield--&gt;&gt;REC: 응답&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                REC--&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;U: 응답&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            else Shield MISS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Shield-&gt;&gt;Origin: fetch (AWS 백본)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Origin--&gt;&gt;Shield: 응답 + Cache-Control&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                Shield--&gt;&gt;REC: 응답 + 캐싱&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                REC--&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;U: 응답 + 캐싱&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;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;왜-이-아키텍처인가-설계-결정&quot;&gt;왜 이 아키텍처인가 (설계 결정)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PoP 다수 + 각 PoP 소형 캐시&lt;/strong&gt; = 사용자 근접 + 낮은 저장 비용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REC 소수 + 큰 캐시&lt;/strong&gt; = 롱테일 흡수 + PoP 부하 완화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Origin Shield 선택형&lt;/strong&gt; = 필요할 때만 (비용/hit rate 트레이드오프)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS 백본 활용&lt;/strong&gt; = 인터넷 라우팅 변동성 회피&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anycast IP&lt;/strong&gt; = 사용자에게 단일 도메인, 내부적으로 최적 PoP 자동 선택&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;동작-흐름&quot;&gt;동작 흐름&lt;/h2&gt;
&lt;h2 id=&quot;동작-흐름-1&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|S3]] - 정적 파일 origin&lt;/li&gt;
&lt;li&gt;[[aws-alb-nlb|ALB / NLB]] - 동적 origin&lt;/li&gt;
&lt;li&gt;[[aws-route53|Route 53]] - Custom domain DNS&lt;/li&gt;
&lt;li&gt;[[aws-lambda|Lambda]] - Lambda@Edge / Function URL origin&lt;/li&gt;
&lt;li&gt;[[aws-waf|WAF]] - 트래픽 필터링&lt;/li&gt;
&lt;li&gt;[[aws-shield|Shield]] - DDoS 방어&lt;/li&gt;
&lt;li&gt;[[aws-global-accelerator|Global Accelerator]] - 비HTTP 대안&lt;/li&gt;
&lt;li&gt;[[aws-api-gateway|API Gateway]] - Edge-optimized 는 CloudFront 사용&lt;/li&gt;
&lt;li&gt;[[aws-kms|KMS]] - OAC + SSE-KMS 통합&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloudfront</category><category>cdn</category><category>edge</category><category>cloud</category><category>network</category><author>koa (김신건)</author></item><item><title>[AWS] CloudHSM: 단일 테넌트 하드웨어 보안 모듈</title><link>https://shinkeonkim.com/wiki/cloud/aws-cloudhsm/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-cloudhsm/</guid><pubDate>Thu, 30 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 CloudHSM&lt;/strong&gt; 은 &lt;em&gt;AWS VPC 안에서 실행되는 단일 테넌트 (single-tenant) 하드웨어 보안 모듈 (HSM)&lt;/em&gt;. 물리 하드웨어에 격리된 HSM 을 고객 전용으로 프로비저닝하고, 고객이 사용자 / 키 / 백업을 완전히 통제. AWS 는 하드웨어 유지와 네트워크 가용성만 담당하며 &lt;strong&gt;키에는 접근할 수 없다&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: &lt;em&gt;AWS 관리 편의 (프로비저닝, HA)&lt;/em&gt; + &lt;em&gt;“AWS 도 못 보는 키” 를 원하는 규제/보안 요구&lt;/em&gt; 의 결합.&lt;/p&gt;
&lt;h2 id=&quot;hsm-이란&quot;&gt;HSM 이란&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HSM (Hardware Security Module)&lt;/strong&gt; = &lt;em&gt;암호화 키를 안전하게 생성 / 저장 / 사용하기 위한 전용 하드웨어&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;특징:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;키는 HSM 밖으로 나오지 않음&lt;/strong&gt; (사용은 HSM 안에서, 결과만 반환)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;물리적 tamper 대응&lt;/strong&gt;: 봉인 파괴 감지 시 키 자동 삭제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;표준 인터페이스&lt;/strong&gt; (PKCS#11, JCE, CNG/KSP) 로 애플리케이션 통합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FIPS / Common Criteria&lt;/strong&gt; 등 인증 획득&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;일반 서버의 소프트웨어 키 저장은 root 나 exploit 으로 유출 가능. HSM 은 물리 격리로 이를 원천 차단.&lt;/p&gt;
&lt;h2 id=&quot;왜-cloudhsm-인가&quot;&gt;왜 CloudHSM 인가&lt;/h2&gt;
&lt;h3 id=&quot;kms-와의-대비&quot;&gt;KMS 와의 대비&lt;/h3&gt;
&lt;p&gt;[[aws-kms|AWS KMS]] 도 HSM 백엔드를 쓴다. 그러면 왜 CloudHSM 이 별도 필요한가?&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;[[aws-kms|KMS]]&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;CloudHSM&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;Multi-tenant (여러 고객이 같은 HSM 풀)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Single-tenant&lt;/strong&gt; (고객 전용 HSM)&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;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;strong&gt;AWS 접근&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 가 관리 API 갖고 있음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AWS 는 접근 불가&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;표준 API&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KMS API (AWS 전용)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;PKCS#11, JCE, OpenSSL Dynamic Engine, CNG/KSP&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;AWS 가 지원하는 것만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;HSM 이 지원하는 것 전부 (커스텀 포함)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;FIPS 인증&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;FIPS 140-2 Level 2 (HSM 백엔드는 L3)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;FIPS 140-2 Level 3&lt;/strong&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;HSM 시간당&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AWS 서비스 통합&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;대부분 자동 (S3, EBS, RDS, …)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;통합 제한 (KMS Custom Key Store 통해 우회)&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;규제 / 커스텀 crypto / PKI CA&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-kms|KMS]] 로 충분&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;금융 결제 / 정부 기밀 / PKI CA / “AWS 도 못 봐야” 요구&lt;/strong&gt;: CloudHSM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;대표-사용처&quot;&gt;대표 사용처&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;금융 서비스&lt;/strong&gt;: PIN 처리, EMV 결제, HSM 기반 거래 서명&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정부 / 방위&lt;/strong&gt;: 분류된 데이터, 규제 준수 (FedRAMP High)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKI Certificate Authority&lt;/strong&gt;: 루트 / 중간 CA 개인 키 보관, 인증서 서명&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디지털 서명&lt;/strong&gt;: 계약서 서명, 문서 인증&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DRM / 저작권&lt;/strong&gt;: 콘텐츠 암호화 키&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커스텀 암호 알고리즘&lt;/strong&gt;: KMS 미지원 알고리즘 (예: 일부 국내 표준)&lt;/li&gt;
&lt;/ol&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;    subgraph AWS[&quot;고객 AWS 계정&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        subgraph VPC[&quot;고객 VPC&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            App[&quot;애플리케이션&amp;#x3C;br/&gt;(CloudHSM 클라이언트)&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;            subgraph AZ1[&quot;AZ 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                ENI1[&quot;ENI&quot;]&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;            subgraph AZ2[&quot;AZ 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                ENI2[&quot;ENI&quot;]&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;            subgraph AZ3[&quot;AZ 3&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                ENI3[&quot;ENI&quot;]&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;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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph AWSVPC[&quot;AWS 관리 VPC (숨김)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        subgraph Cluster[&quot;CloudHSM Cluster&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            HSM1[&quot;HSM 1 (AZ 1)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            HSM2[&quot;HSM 2 (AZ 2)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            HSM3[&quot;HSM 3 (AZ 3)&quot;]&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;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App --&gt;|&quot;PKCS#11 / JCE / OpenSSL&quot;| ENI1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ENI1 &amp;#x3C;-.-&gt;|&quot;AWS 사설 링크&quot;| HSM1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ENI2 &amp;#x3C;-.-&gt; HSM2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ENI3 &amp;#x3C;-.-&gt; HSM3&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;    HSM1 &amp;#x3C;-.-&gt;|&quot;자동 동기화&amp;#x3C;br/&gt;키 복제&quot;| HSM2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HSM2 &amp;#x3C;-.-&gt; HSM3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;구성-요소&quot;&gt;구성 요소&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cluster&lt;/strong&gt;: 여러 HSM 의 논리 그룹. 각 HSM 이 다른 AZ 에 위치 → HA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HSM&lt;/strong&gt;: 개별 물리 HSM (전용 하드웨어). 요청 부하 분산 대상&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ENI (Elastic Network Interface)&lt;/strong&gt;: 고객 VPC 서브넷에 생성. 클라이언트가 이 ENI 로 HSM 과 통신 (자세히: [[aws-eni|ENI]])&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클라이언트 SDK&lt;/strong&gt;: EC2 나 On-prem 서버에 설치. HSM API 호출 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ha-고가용성&quot;&gt;HA (고가용성)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cluster 안 여러 HSM 이 자동으로 키를 동기화&lt;/li&gt;
&lt;li&gt;클라이언트가 자동 로드 밸런싱&lt;/li&gt;
&lt;li&gt;한 HSM 이 죽어도 다른 HSM 이 서비스 지속&lt;/li&gt;
&lt;li&gt;실무 권장: &lt;strong&gt;최소 2 AZ, 2 HSM 이상&lt;/strong&gt; (단일 HSM 은 프로덕션 금지)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;표준-인터페이스&quot;&gt;표준 인터페이스&lt;/h2&gt;
&lt;p&gt;CloudHSM 이 지원하는 crypto API:&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;PKCS#11&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;C / Python / Go / etc&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;범용 표준, OpenSSL, PKI 도구&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;JCE (Java Cryptography Extension)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Java&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Java 앱, Bouncy Castle&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;OpenSSL Dynamic Engine&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OpenSSL 기반 어떤 도구든&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Nginx / Apache TLS 종단, PKI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CNG / KSP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Windows&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ADCS, Windows PKI&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;의미&lt;/strong&gt;: 애플리케이션은 기존 표준 API 를 그대로 쓰고, 백엔드만 CloudHSM 을 가리키게 설정하면 됨. 코드 재작성 대부분 불필요.&lt;/p&gt;
&lt;h2 id=&quot;kms-custom-key-store-통합&quot;&gt;KMS Custom Key Store 통합&lt;/h2&gt;
&lt;p&gt;CloudHSM 을 직접 안 쓰고 &lt;strong&gt;KMS 를 통해 CloudHSM 을 백엔드로 사용&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;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[애플리케이션] --&gt; KMS[AWS KMS API]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    KMS --&gt; CKS[&quot;Custom Key Store&amp;#x3C;br/&gt;(고객 CloudHSM Cluster)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CKS --&gt; HSM[CloudHSM]&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[&quot;S3 SSE-KMS&quot;] --&gt; KMS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    EBS[&quot;EBS 암호화&quot;] --&gt; KMS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RDS[&quot;RDS 암호화&quot;] --&gt; KMS&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;KMS 의 편의성 (S3/EBS/RDS 자동 통합) + CloudHSM 의 통제&lt;/li&gt;
&lt;li&gt;애플리케이션은 KMS API 로 개발 → 이식성&lt;/li&gt;
&lt;li&gt;KMS 감사 (CloudTrail) 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KMS 요금 + CloudHSM 요금 둘 다&lt;/li&gt;
&lt;li&gt;지연 (KMS → CloudHSM 왕복)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;언제 유리&lt;/strong&gt;: KMS 편의성은 원하되 규제로 인해 키가 고객 통제 하에 있어야 할 때.&lt;/p&gt;
&lt;h2 id=&quot;aws-서비스-통합&quot;&gt;AWS 서비스 통합&lt;/h2&gt;
&lt;p&gt;CloudHSM 을 직접 지원 (별도 통합) 하는 서비스:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[[aws-redshift|Redshift]]&lt;/strong&gt;: 클러스터 암호화 키를 CloudHSM 에 저장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDS Oracle TDE&lt;/strong&gt;: Transparent Data Encryption&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACM Private CA&lt;/strong&gt;: PKI 인증서 발급 (루트 CA 키를 CloudHSM 에)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NGINX / Apache&lt;/strong&gt;: OpenSSL 통해 TLS 개인 키 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그 외 대부분은 KMS Custom Key Store 를 경유.&lt;/p&gt;
&lt;h2 id=&quot;fips-140-2-level-3&quot;&gt;FIPS 140-2 Level 3&lt;/h2&gt;
&lt;p&gt;CloudHSM 이 인증 받은 표준. 물리 보안의 국제 표준.&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Level 1&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SW 기반 crypto&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Level 2&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SW + 물리 tamper 증거 (봉인 seal)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Level 3&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;물리 tamper 대응&lt;/strong&gt; (봉인 파괴 시 키 자동 삭제) + role-based auth&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Level 4&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;Level 3 는 대부분의 금융 / 정부 규제가 요구하는 수준. CloudHSM 의 이 인증이 KMS 대신 CloudHSM 을 선택하는 주된 이유.&lt;/p&gt;
&lt;h2 id=&quot;사용자-관리&quot;&gt;사용자 관리&lt;/h2&gt;
&lt;p&gt;CloudHSM 의 특별한 점: &lt;strong&gt;AWS 계정의 IAM 이 아니라, HSM 자체의 사용자 시스템&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HSM 사용자 역할&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Precrypto Officer (PRECO)&lt;/strong&gt;: 초기화 시 임시 관리자&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crypto Officer (CO)&lt;/strong&gt;: 사용자 관리, 클러스터 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crypto User (CU)&lt;/strong&gt;: 실제 crypto 연산 (key 생성/사용/삭제)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Appliance User (AU)&lt;/strong&gt;: 관리 목적&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CloudHSM 클러스터 활성화 시 CO 를 지정하고, 이후 애플리케이션 별로 CU 를 생성. AWS 는 이 사용자 데이터베이스에 접근 불가.&lt;/p&gt;
&lt;h2 id=&quot;백업&quot;&gt;백업&lt;/h2&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;: AWS 관리 KMS 키로 봉인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;저장 위치&lt;/strong&gt;: 클러스터와 같은 리전 S3 (고객 소유 아님)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;복원&lt;/strong&gt;: 새 클러스터 생성 시 백업에서 복원 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;중요&lt;/strong&gt;: 백업조차도 AWS 가 열 수 없음. 클러스터의 CO 자격 증명이 없으면 아무도 복원 불가.&lt;/p&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HSM 시간당&lt;/strong&gt; (~$1.60 - $2 USD / HSM-hour, 리전별 상이)&lt;/li&gt;
&lt;li&gt;Cluster 는 HSM 개수 x 시간&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;:&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;HA 최소 (2 HSM × 24 × 30) × $1.60 = ~$2,304 /월&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;3 HSM (3 AZ HA) × 24 × 30 × $1.60 = ~$3,456 /월&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;KMS 는 키당 $1/월 + 요청당 소액이라 대부분 훨씬 저렴. CloudHSM 은 규제 / 통제가 필수인 워크로드에만.&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;AWS&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;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&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;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&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;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;사용자 관리 (CO / CU)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;O&lt;/strong&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;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;O&lt;/strong&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;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;O&lt;/strong&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;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&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;O&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: AWS 가 하드웨어를 대신 운영해주지만, &lt;strong&gt;키와 사용자의 책임은 완전히 고객&lt;/strong&gt;. 이걸 KMS 와 혼동하면 안 됨 (KMS 는 대부분 AWS 가 함).&lt;/p&gt;
&lt;h2 id=&quot;관측--감사&quot;&gt;관측 &amp;#x26; 감사&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;: CloudHSM API 호출 (클러스터 관리) 기록&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudWatch&lt;/strong&gt;: HSM 상태 지표 (healthy 개수, 사용률)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HSM 자체 audit log&lt;/strong&gt;: crypto 연산 이력 (선택적 syslog 전송)&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;단일 HSM = 프로덕션 금지&lt;/strong&gt;. HSM 이나 AZ 장애 시 서비스 중단. 최소 2 AZ, 2 HSM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;CO / CU 자격증명 분실&lt;/strong&gt; = 클러스터 복구 불가. AWS 도 도와줄 수 없음. 자격증명은 여러 명 / 여러 저장소에 안전 백업 (예: 안전 금고).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;KMS 대신 CloudHSM 을 대부분 워크로드에&lt;/strong&gt; = 요금 폭탄 + 운영 부담. 규제/통제 요구가 없으면 KMS 부터.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;AWS 는 키에 접근 불가&lt;/strong&gt;. 좋은 점이자 나쁜 점. 관리자 실수로 잘못된 키를 지우면 복구 불가. 백업 정책 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;AWS 서비스 통합 제한&lt;/strong&gt;. S3 SSE-KMS 같은 자동 통합을 원하면 KMS Custom Key Store 로 우회 (양쪽 요금 다 발생).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;CloudHSM 클라이언트 SDK 관리&lt;/strong&gt;. EC2 / On-prem 에 설치되는 클라이언트가 있음. 버전 업그레이드, TLS 갱신 등 관리 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;hsm1.medium 은 end-of-support 로 마이그레이션 대상&lt;/strong&gt;. 신규는 hsm2m.medium (또는 최신).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-kms|AWS KMS]] - Multi-tenant 대안&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - AWS 계정 접근 제어 (별개)&lt;/li&gt;
&lt;li&gt;[[aws-vpc|VPC]] - CloudHSM ENI 배치&lt;/li&gt;
&lt;li&gt;[[aws-eni|ENI]] - 클라이언트가 접근하는 인터페이스&lt;/li&gt;
&lt;li&gt;[[aws-redshift|Redshift]] - CloudHSM 통합 서비스&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail|CloudTrail]] - 관리 API 감사&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>security</category><category>hsm</category><category>cryptography</category><category>fips</category><category>kms</category><author>koa (김신건)</author></item><item><title>[AWS] Data Firehose: 서버리스 스트림 적재</title><link>https://shinkeonkim.com/wiki/cloud/aws-data-firehose/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-data-firehose/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Data Firehose&lt;/strong&gt; (구 Kinesis Data Firehose, 2024-02 이름 변경) 는 &lt;em&gt;스트리밍 데이터를 받아 S3/Redshift/OpenSearch/Splunk 등으로 자동 적재&lt;/em&gt; 하는 완전 서버리스 서비스. 저장하지 않고 &lt;strong&gt;전달 (delivery)&lt;/strong&gt; 만.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 감각&lt;/strong&gt;: 스트림을 목적지까지 배달하는 트럭. 코드 작성 없이 인프라 관리 없이 적재.&lt;/p&gt;
&lt;h2 id=&quot;왜-firehose-인가&quot;&gt;왜 Firehose 인가&lt;/h2&gt;
&lt;p&gt;로그를 [[aws-s3|S3]] 에 넣는 흔한 요구를 예로 들면:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Firehose 없이&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kinesis / Kafka 컨슈머 코드 작성&lt;/li&gt;
&lt;li&gt;버퍼링, 배치, 재시도, 오류 처리 직접 구현&lt;/li&gt;
&lt;li&gt;인스턴스/컨테이너 운영&lt;/li&gt;
&lt;li&gt;파티션 폴더 구조 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Firehose 로&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;콘솔에서 delivery stream 생성 (5분)&lt;/li&gt;
&lt;li&gt;목적지: S3 버킷 지정&lt;/li&gt;
&lt;li&gt;그 뒤로 유지 관리 0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;kds-vs-firehose&quot;&gt;KDS vs Firehose&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;[[aws-kinesis-data-streams|Kinesis Data Streams]]&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Amazon Data Firehose&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;수집/저장 스트림&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;샤드 (Provisioned) or On-demand&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;실시간 (~200 ms, EFO ~70 ms)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;준실시간 (버퍼 최소 60초, Zero Buffering ~5초)&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;O (24h ~ 365일)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X (저장 X)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;재처리 (Replay)&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;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;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;샤드 내 O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;보장 X&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;Lambda 인라인 내장&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;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;최대 1 MiB&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;최대 1 MiB&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;pre class=&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 F as Firehose Delivery Stream&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant L as Lambda (선택, 변환)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant D as Destination (S3/Redshift/...)&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;F: PutRecord / PutRecordBatch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over F: 버퍼링 (시간 60s or 크기 5MB)&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;    alt Lambda 변환&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        F-&gt;&gt;L: 버퍼 배치 전달&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        L--&gt;&gt;F: 변환된 배치 (CSV→JSON, 필터, 마스킹)&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    F-&gt;&gt;D: 배치 flush (Parquet 변환, 압축, 파티션)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    D--&gt;&gt;F: OK&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 F: 실패 시 지수 백오프 재시도&amp;#x3C;br/&gt;결국 실패하면 S3 backup 버킷으로&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;목적지-destinations&quot;&gt;목적지 (Destinations)&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;[[aws-s3|Amazon S3]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가장 흔함. Parquet/ORC 변환 + 파티션 자동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-redshift|Amazon Redshift]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;S3 경유 후 COPY 자동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Amazon OpenSearch Service&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;Splunk&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;Apache Iceberg on S3&lt;/strong&gt; (2024+)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lakehouse 직접 적재&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;HTTP 엔드포인트&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Datadog, New Relic, MongoDB Atlas 등 파트너&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Snowflake&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;직접 통합 (2024+)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;소스-sources&quot;&gt;소스 (Sources)&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;Direct PUT&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;애플리케이션이 SDK 로 직접&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-kinesis-data-streams|Kinesis Data Streams]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KDS 를 소스로 (구독)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Amazon MSK&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kafka 를 소스로 (2023+)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CloudWatch Logs subscription filter&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;로그 -&gt; Firehose&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;IoT Rules&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;IoT 데이터&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;버퍼링-buffering&quot;&gt;버퍼링 (Buffering)&lt;/h2&gt;
&lt;p&gt;Firehose 는 배치로 flush -&gt; 준실시간.&lt;/p&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;: 60초 ~ 900초 (기본 300)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;크기&lt;/strong&gt;: 1 MB ~ 128 MB (기본 5)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Zero Buffering&lt;/strong&gt; (2023+):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;시간 0초 설정 시 사실상 실시간 (~5초)&lt;/li&gt;
&lt;li&gt;OpenSearch/Splunk 목적지에서 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;데이터-변환-transformation&quot;&gt;데이터 변환 (Transformation)&lt;/h2&gt;
&lt;h3 id=&quot;lambda-인라인-변환&quot;&gt;Lambda 인라인 변환&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; 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:#E1E4E8&quot;&gt;    output &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:#E1E4E8&quot;&gt;        raw &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; base64.b64decode(record[&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;]).decode(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;utf-8&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;        # CSV -&gt; JSON, 필드 추가, PII 마스킹 등&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        transformed &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; transform(raw)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        output.append({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;recordId&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;recordId&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;result&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Ok&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;data&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: base64.b64encode(transformed.encode()).decode()&lt;/span&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; {&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;: output}&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;code&gt;Ok&lt;/code&gt; - 변환 성공, 목적지로&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Dropped&lt;/code&gt; - 필터링됨 (조용히 버림)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ProcessingFailed&lt;/code&gt; - 오류, S3 backup 으로&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;포맷-변환-format-conversion&quot;&gt;포맷 변환 (Format Conversion)&lt;/h3&gt;
&lt;p&gt;S3 목적지 한정. JSON -&gt; [[apache-parquet|Parquet]] 또는 ORC 자동 변환.&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;입력: {&quot;user_id&quot;: 1, &quot;event&quot;: &quot;click&quot;, &quot;ts&quot;: &quot;2026-07-30&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ↓ Parquet 변환 + SNAPPY 압축&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;S3: my-lake/events/year=2026/month=07/day=30/hour=15/xxx.parquet&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;[[aws-glue|Glue Catalog]] 에 스키마 등록&lt;/li&gt;
&lt;li&gt;소스 데이터가 JSON&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;압축&lt;/strong&gt;: GZIP / SNAPPY / ZSTD 등.&lt;/p&gt;
&lt;h2 id=&quot;iceberg-목적지-2024&quot;&gt;Iceberg 목적지 (2024+)&lt;/h2&gt;
&lt;p&gt;Apache Iceberg 테이블에 직접 적재 (INSERT / UPDATE / 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:#85E89D&quot;&gt;DestinationConfiguration&lt;/span&gt;&lt;span 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;  IcebergDestinationConfiguration&lt;/span&gt;&lt;span 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;    CatalogConfiguration&lt;/span&gt;&lt;span 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;      CatalogARN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;arn:aws:glue:...:catalog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    S3Configuration&lt;/span&gt;&lt;span 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;      RoleARN&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      BucketARN&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-lake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    UniqueKeys&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;order_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]      &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Upsert 키&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    OperationTypes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;INSERT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;UPDATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DELETE&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;CDC 스트림을 Iceberg 로 그대로 반영. [[aws-athena|Athena]] / [[aws-emr|EMR]] 에서 즉시 쿼리.&lt;/p&gt;
&lt;h2 id=&quot;파티션-dynamic-partitioning&quot;&gt;파티션 (Dynamic Partitioning)&lt;/h2&gt;
&lt;p&gt;레코드 내용 기반으로 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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;입력 record: {&quot;customer_id&quot;: 42, &quot;event_ts&quot;: &quot;2026-07-30T15:00:00Z&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;파티션 표현식: !{partitionKeyFromQuery:customer_id}/!{partitionKeyFromLambda:date}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;S3 결과: my-lake/customer_id=42/date=2026-07-30/xxx.parquet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;partitionKeyFromQuery&lt;/code&gt;: JQ 로 필드 추출&lt;/li&gt;
&lt;li&gt;&lt;code&gt;partitionKeyFromLambda&lt;/code&gt;: Lambda 반환값&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주의&lt;/strong&gt;: 파티션 수 폭증 = small files&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;오류-처리-backup&quot;&gt;오류 처리 (Backup)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;변환/전달 실패 -&gt; S3 backup 버킷 (구성 필수)&lt;/li&gt;
&lt;li&gt;소스 데이터도 백업 가능 (&lt;code&gt;FailedDataOnly&lt;/code&gt; 또는 &lt;code&gt;AllData&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;재처리 시 backup 을 원본 소스처럼 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;수집 데이터&lt;/strong&gt;: $0.029 / GB (초기), 이후 볼륨 할인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변환 (Format Conversion)&lt;/strong&gt;: 추가 $0.018 / GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda 변환&lt;/strong&gt;: Lambda 요금 별도&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Partitioning&lt;/strong&gt;: 추가 요금&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPC Delivery&lt;/strong&gt;: 시간 + GB 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;과금 단위: &lt;strong&gt;5 KB 단위 반올림&lt;/strong&gt; (5 KB 미만 레코드도 5 KB 로 청구).&lt;/p&gt;
&lt;h2 id=&quot;실전-예제&quot;&gt;실전 예제&lt;/h2&gt;
&lt;h3 id=&quot;cloudwatch-logs---s3-로그-레이크&quot;&gt;CloudWatch Logs -&gt; S3 로그 레이크&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;[모든 Lambda 로그] -&gt; CloudWatch Logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ↓ subscription filter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Firehose (delivery stream)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ↓ Lambda 변환 (JSON 정제)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ↓ Parquet 변환 + SNAPPY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;S3 (year=/month=/day= 파티션)&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;Athena SQL 로 분석&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;kds--firehose-결합&quot;&gt;KDS + Firehose 결합&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;[생산자] -&gt; Kinesis Data Streams -&gt; ┬-&gt; Lambda (실시간 alert)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                    └-&gt; Data Firehose -&gt; S3 (자동 적재)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: KDS 가 고속 수집 + 다중 소비자 + 재처리를 담당, Firehose 가 그 중 하나의 소비자로서 적재.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Firehose 는 저장하지 않는다&lt;/strong&gt;. 재처리/다중 소비자 필요하면 [[aws-kinesis-data-streams|KDS]] 를 앞단에.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;밀리초 실시간 필요&lt;/strong&gt; = Firehose 부적합 (버퍼 지연). [[aws-kinesis-data-streams|KDS]] 소비자 직접 구현.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;버퍼 크기 5 MB 유지&lt;/strong&gt; = S3 파일 수백만 개 (small files). 파일 크기 128 MB 근처로 조정, 또는 Athena CTAS / Iceberg auto-compact.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;5 KB 최소 청구&lt;/strong&gt; = 매우 작은 레코드 많으면 오히려 비쌈. 프로듀서에서 배치.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Dynamic Partitioning 남용&lt;/strong&gt; = 파티션 폭증 + 스몰 파일. 카디널리티 검증 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Lambda 변환 응답 시간 5분 초과&lt;/strong&gt; = 실패. 무거운 변환은 별도 파이프라인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;이름 변경 (Kinesis Data Firehose → Amazon Data Firehose, 2024-02)&lt;/strong&gt;. API/SDK 는 하위 호환. 문서/블로그는 옛 이름 혼재.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-kinesis-data-streams|Kinesis Data Streams]] - 스트림 소스&lt;/li&gt;
&lt;li&gt;[[aws-kinesis-data-analytics|Managed Service for Apache Flink]] - 실시간 처리&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - 대표 목적지&lt;/li&gt;
&lt;li&gt;[[aws-redshift|Redshift]] - 목적지&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - 포맷 변환 결과&lt;/li&gt;
&lt;li&gt;[[aws-glue|Glue]] - Catalog 스키마&lt;/li&gt;
&lt;li&gt;[[aws-lambda|Lambda]] - 인라인 변환&lt;/li&gt;
&lt;li&gt;[[aws-athena|Athena]] - 적재 후 쿼리&lt;/li&gt;
&lt;li&gt;[[etl|ETL]] - 파이프라인 개념&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>firehose</category><category>streaming</category><category>ingestion</category><category>serverless</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, 30 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] EMR: 관리형 빅데이터 클러스터</title><link>https://shinkeonkim.com/wiki/cloud/aws-emr/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-emr/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon EMR&lt;/strong&gt; (Elastic MapReduce) 은 &lt;em&gt;[[hadoop-spark|Hadoop / Spark]] 등 오픈소스 빅데이터 프레임워크를 관리형 클러스터로 제공&lt;/em&gt; 하는 AWS 서비스. AWS 가 프로비저닝, 설치, 설정, 튜닝, 모니터링을 담당하고, 사용자는 잡 (job) 제출과 클러스터 크기 결정에만 집중한다.&lt;/p&gt;
&lt;p&gt;핵심 정체성은 &lt;em&gt;AWS 가 관리하는 대규모 분산 컴퓨트 플랫폼&lt;/em&gt; 이며, “어떤 프레임워크를 얹느냐” 는 선택. 대표적으로 &lt;strong&gt;Spark, Hive, Trino, HBase, Flink, Hudi/Iceberg/Delta&lt;/strong&gt; 를 그대로 사용 가능.&lt;/p&gt;
&lt;h2 id=&quot;왜-emr-이-필요한가&quot;&gt;왜 EMR 이 필요한가&lt;/h2&gt;
&lt;p&gt;빅데이터 프레임워크를 직접 운영하는 것의 어려움:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;분산 시스템 튜닝&lt;/strong&gt;: HDFS 복제, YARN 스케줄링, Spark memory 설정 등 수십 개 파라미터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;버전 호환성&lt;/strong&gt;: Hadoop 3.x + Spark 3.5 + Hive 3.1 + Trino 등의 조합 검증&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확장성&lt;/strong&gt;: 워크로드에 맞춰 노드 늘리기/줄이기 (수동은 지연 큼)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;장애 복구&lt;/strong&gt;: 노드 죽으면 리밸런싱, HDFS 재복제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패치&lt;/strong&gt;: OS + JVM + 각 프레임워크의 CVE 대응&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모니터링&lt;/strong&gt;: 클러스터 상태, YARN queue, Spark UI, driver log&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EMR 의 답:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;검증된 조합의 프레임워크를 &lt;strong&gt;패키지로 제공&lt;/strong&gt; (release label 로 버전 고정)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자동 프로비저닝 + 부트스트랩&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Scaling&lt;/strong&gt; 으로 워크로드에 맞춰 자동 확장/축소&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spot 통합&lt;/strong&gt; + 실패한 노드 자동 교체&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EMRFS&lt;/strong&gt; 로 [[aws-s3|S3]] 를 HDFS 처럼 접근 (영구 저장)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[[aws-iam|IAM]] / [[aws-vpc|VPC]] / [[aws-cloudwatch|CloudWatch]]&lt;/strong&gt; 네이티브 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;언제-emr-을-쓰나&quot;&gt;언제 EMR 을 쓰나&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;EMR 적합성&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;수 GB - PB 규모 배치 처리&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;Spark ETL / ML 학습&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;인터랙티브 Presto/Trino SQL&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;적합 (EMR on EC2)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;HBase (long-lived NoSQL)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;적합 (EMR on EC2)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Flink 스트리밍&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;Hudi / Iceberg / Delta 트랜잭션 lakehouse&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;단순 ETL + Glue Catalog 활용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;부적합&lt;/em&gt; → [[aws-glue|Glue]] 가 저렴&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;서버리스 SQL 애드혹&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;부적합&lt;/em&gt; → [[aws-athena|Athena]]&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; → [[postgresql|Postgres]] / [[aws-redshift|Redshift]]&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;세-가지-배포-방식&quot;&gt;세 가지 배포 방식&lt;/h2&gt;
&lt;p&gt;EMR 은 &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 TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Choice{배포 방식 선택}&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;    Choice --&gt; EC2[&quot;EMR on EC2&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;    Choice --&gt; SL[&quot;EMR Serverless&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;    Choice --&gt; EKS[&quot;EMR on EKS&amp;#x3C;br/&gt;(K8s 위)&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;    EC2 --&gt; C1[&quot;장수명 클러스터&amp;#x3C;br/&gt;HBase, Hive Metastore&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;    SL --&gt; C2[&quot;간헐적 Spark 배치&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;    EKS --&gt; C3[&quot;이미 EKS 표준화한 조직&amp;#x3C;br/&gt;공용 K8s 자원 활용&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;1-emr-on-ec2-전통&quot;&gt;1. EMR on EC2 (전통)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;직접 관리하는 클러스터&lt;/em&gt;. Master + Core + Task 3 종의 노드로 구성.&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 TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Cluster[&quot;EMR on EC2 클러스터&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        M[&quot;Master&amp;#x3C;br/&gt;(YARN ResourceManager,&amp;#x3C;br/&gt;HDFS NameNode)&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;        subgraph Core[&quot;Core Nodes&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            C1[&quot;HDFS DataNode&amp;#x3C;br/&gt;+ YARN NodeManager&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            C2[&quot;HDFS DataNode&amp;#x3C;br/&gt;+ YARN NodeManager&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        subgraph Task[&quot;Task Nodes (선택)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            T1[&quot;YARN NodeManager&amp;#x3C;br/&gt;(HDFS X)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            T2[&quot;Spot 활용 가능&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        M --&gt; C1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        M --&gt; C2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        M --&gt; T1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        M --&gt; T2&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cluster --&gt; EMRFS[&quot;EMRFS&amp;#x3C;br/&gt;(S3 어댑터)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    EMRFS --&gt; S3[(&quot;S3&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;Master&lt;/strong&gt;: 클러스터 조정. 죽으면 클러스터 전체 실패 (HA 옵션 있음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core&lt;/strong&gt;: HDFS + 컴퓨트. 데이터를 저장하므로 spot 부적합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Task&lt;/strong&gt;: 컴퓨트만 (HDFS X). &lt;strong&gt;Spot 인스턴스로 70% 비용 절감&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HBase 같은 stateful 서비스&lt;/li&gt;
&lt;li&gt;Hive Metastore 를 클러스터 안에서 유지&lt;/li&gt;
&lt;li&gt;인터랙티브 사용 (Zeppelin, Jupyter, Trino)&lt;/li&gt;
&lt;li&gt;여러 프레임워크 동시 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;비적합&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;짧은 단일 배치 (프로비저닝 5-10 분이 아까움)&lt;/li&gt;
&lt;li&gt;사용 안 하는 시간에도 인스턴스 요금&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-emr-serverless&quot;&gt;2. EMR Serverless&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Application 을 만들고, Job Run 을 제출&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;    App[&quot;EMR Serverless Application&amp;#x3C;br/&gt;(Spark or Hive)&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;    Job1[&quot;Job Run 1&quot;] --&gt; App&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Job2[&quot;Job Run 2&quot;] --&gt; App&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Job3[&quot;Job Run N&quot;] --&gt; App&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;    App -.-&gt;|&quot;실행 시만 컴퓨트 프로비저닝&quot;| Workers[&quot;Driver + Executor 자동 관리&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;    Workers --&gt; Result[(&quot;S3 결과&quot;)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Application 유형&lt;/strong&gt;: Spark / Hive 중 하나 (동시 지원 X)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컴퓨트 관리 없음&lt;/strong&gt;: 필요할 때 자동 프로비저닝, 유휴 시 자동 해제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;과금&lt;/strong&gt;: 실제 사용한 vCPU-hour + memory-hour + 임시 storage-hour&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cold start&lt;/strong&gt;: &amp;#x3C; 1 분&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최대 용량 상한&lt;/strong&gt;: application 설정으로&lt;/li&gt;
&lt;/ul&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;예측 불가한 워크로드&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;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HBase / HDFS 요구 (지원 X)&lt;/li&gt;
&lt;li&gt;다양한 프레임워크 동시 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-emr-on-eks&quot;&gt;3. EMR on EKS&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Kubernetes 위에서 Spark job 실행&lt;/em&gt;. EKS 클러스터가 이미 있는 조직에.&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 TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph EKS[&quot;기존 EKS 클러스터&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Nodes[&quot;여러 워크로드 pod&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        VC[&quot;Virtual Cluster&amp;#x3C;br/&gt;(EMR 네임스페이스)&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Job[&quot;EMR on EKS&amp;#x3C;br/&gt;Spark Job&quot;] --&gt; VC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VC --&gt;|&quot;Spark driver/executor pod 생성&quot;| Nodes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Nodes --&gt; S3[(&quot;S3&quot;)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Cluster&lt;/strong&gt;: EKS 네임스페이스에 대응하는 EMR 논리 클러스터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spark pod&lt;/strong&gt;: driver / executor 가 K8s pod 로 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자원 공유&lt;/strong&gt;: K8s 표준 스케줄링으로 다른 워크로드와 자원 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이미 EKS 로 표준화한 조직&lt;/li&gt;
&lt;li&gt;Spark 와 다른 K8s 워크로드 자원 공유&lt;/li&gt;
&lt;li&gt;K8s 관측 도구 (Prometheus, Grafana) 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;비적합&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EKS 관리 부담이 별개&lt;/li&gt;
&lt;li&gt;Spark 만 지원 (Hive, HBase, Trino 등 X)&lt;/li&gt;
&lt;/ul&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;EMR on EC2&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;EMR Serverless&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;EMR on EKS&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;클러스터 (Master/Core/Task)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음 (Job 제출만)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EKS 별도&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;5-10 분 (수동)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&amp;#x3C; 1 분 (자동)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;즉시 (K8s)&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;20+ (Spark, Hive, HBase, Trino, Flink, …)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Spark, Hive&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Spark 만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;HDFS / HBase&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&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;0&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;0 (EMR 관점)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Spot 통합&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Task fleet 로&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;자동&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;K8s spot&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;td align=&quot;left&quot;&gt;K8s 표준 조직&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;저장-계층-emrfs-와-s3&quot;&gt;저장 계층: EMRFS 와 S3&lt;/h2&gt;
&lt;p&gt;EMR 의 데이터 저장은 두 축.&lt;/p&gt;
&lt;h3 id=&quot;hdfs&quot;&gt;HDFS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Core 노드의 로컬 디스크에 저장 + 복제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클러스터 종료 시 데이터 손실&lt;/strong&gt; (일시적 저장만)&lt;/li&gt;
&lt;li&gt;Shuffle intermediate, cache 용도&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;emrfs-aws-s3s3-as-hdfs&quot;&gt;EMRFS ([[aws-s3|S3]] as HDFS)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-s3|S3]] 를 HDFS 처럼 사용하는 어댑터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;영구 저장&lt;/strong&gt; (클러스터와 독립)&lt;/li&gt;
&lt;li&gt;여러 클러스터가 같은 데이터 공유&lt;/li&gt;
&lt;li&gt;사실상 EMR 의 표준 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;패턴&lt;/strong&gt;: raw / staged / curated 데이터는 [[aws-s3|S3]] 에 [[apache-parquet|Parquet]] 로. HDFS 는 오직 job 실행 중 shuffle / cache.&lt;/p&gt;
&lt;h2 id=&quot;자동-확장-managed-scaling&quot;&gt;자동 확장: Managed Scaling&lt;/h2&gt;
&lt;p&gt;EMR on EC2 의 핵심 편의 기능. 워크로드에 따라 코어/태스크 노드 자동 증감.&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;    Metric[&quot;YARN 대기 컨테이너&amp;#x3C;br/&gt;+ Spark 미배정 task&quot;] --&gt; Judge{&quot;부하 급증?&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;    Judge --&gt;|Yes| ScaleUp[&quot;코어/태스크 노드 추가&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Judge --&gt;|No, 유휴| ScaleDown[&quot;Shuffle 안 하는 노드 종료&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;    ScaleUp --&gt; Cluster[클러스터]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ScaleDown --&gt; Cluster&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;Shuffle data-aware&lt;/strong&gt;: Spark shuffle 이 진행 중인 executor 는 종료하지 않음 (데이터 손실 방지)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-demand vs Spot 분리 관리&lt;/strong&gt;: 각각 min/max 지정 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최소 - 최대&lt;/strong&gt; 노드 수 지정, 초 단위 조정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Serverless / EKS 는 자동 스케일링이 기본 내장.&lt;/p&gt;
&lt;h2 id=&quot;대표-프레임워크&quot;&gt;대표 프레임워크&lt;/h2&gt;
&lt;p&gt;EMR release 하나에 검증된 조합으로 여러 프레임워크가 함께 포함.&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;strong&gt;[[hadoop-spark|Apache Spark]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;배치 + 스트리밍 + ML. 사실상 EMR 의 킬러 앱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apache Hive&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Hadoop SQL. Metastore 로 다른 엔진과 공유&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apache Flink&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;Trino&lt;/strong&gt; (구 Presto)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;인터랙티브 SQL (여러 데이터 소스 페더레이션)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apache HBase&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Wide-column NoSQL (long-lived 클러스터에서)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apache Hudi / Iceberg / Delta Lake&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lakehouse table format&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apache Zeppelin / JupyterHub&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;Apache Hadoop (HDFS + YARN)&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;p&gt;&lt;strong&gt;구성&lt;/strong&gt;: EMR release label (예: &lt;code&gt;emr-7.x.y&lt;/code&gt;) 로 세트를 고정 지정. AWS 가 조합을 검증.&lt;/p&gt;
&lt;h2 id=&quot;emr-studio&quot;&gt;EMR Studio&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;웹 IDE + Jupyter 노트북 + Git 통합 + Cluster/Application 관리 UI&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAM Identity Center 로 SSO&lt;/li&gt;
&lt;li&gt;노트북 하나에서 EMR on EC2 / Serverless / EKS 모두 실행&lt;/li&gt;
&lt;li&gt;팀 협업, 코드 재사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;emr-vs-glue-vs-athena&quot;&gt;EMR vs Glue vs Athena&lt;/h2&gt;
&lt;p&gt;세 서비스가 Spark / SQL 을 서비스로 제공한다는 점에서 겹침. 결정 축.&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;[[aws-glue|AWS Glue]]&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Amazon EMR&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;[[aws-athena|Amazon Athena]]&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;Spark ETL 코드&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Spark / Hive / Trino 등&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQL only&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;EC2: 중 / Serverless: 낮음&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;제한적 (Glue 릴리스)&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;Spark ETL + Python Shell 만&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Spark + Hive + HBase + Trino + Flink&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQL (Trino)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Job 시작&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1-2 분&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Serverless &amp;#x3C; 1 분 / EC2 5-10 분&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;단순 ETL, Catalog 통합 강함&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;대규모, 복잡, 커스텀, 다양한 앱&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;애드혹 SQL, 서버리스&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;&lt;strong&gt;단순 Spark ETL + Glue Catalog&lt;/strong&gt; → [[aws-glue|Glue]]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;복잡한 Spark / 커스텀 설정 / Iceberg 트랜잭션&lt;/strong&gt; → &lt;strong&gt;EMR (Serverless)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HBase, Trino 인터랙티브&lt;/strong&gt; → &lt;strong&gt;EMR on EC2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;애드혹 SQL&lt;/strong&gt; → [[aws-athena|Athena]]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;성능-튜닝의-핵심-축&quot;&gt;성능 튜닝의 핵심 축&lt;/h2&gt;
&lt;p&gt;프레임워크 (Spark 등) 자체의 튜닝은 [[hadoop-spark|Hadoop / Spark]] 참조. EMR 특유의 축:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;파일 포맷&lt;/strong&gt;: [[apache-parquet|Parquet]] + ZSTD (CSV/JSON 대비 10-100 배)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파티셔닝&lt;/strong&gt;: [[aws-s3|S3]] prefix 로 파티션 프루닝&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AQE&lt;/strong&gt;: Spark Adaptive Query Execution 활성화 (최신 Spark 는 기본 on)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spot Task Fleet&lt;/strong&gt;: 70% 비용 절감, Core 는 On-Demand&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Scaling&lt;/strong&gt;: 워크로드에 맞춰 자동&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 Committer&lt;/strong&gt;: 대용량 write 시 partitioned/directory committer 로 rename 최소화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instance Fleets&lt;/strong&gt;: 여러 타입 혼합 → 가용성 + 비용 최적&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;HDFS 를 영구 저장으로 오해&lt;/strong&gt;. 클러스터 종료 시 데이터 손실. 결과와 원본은 반드시 [[aws-s3|S3]] 에.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;EMR on EC2 를 계속 켜둠&lt;/strong&gt; = 유휴 시에도 인스턴스 요금. 배치는 Serverless / EC2 는 auto-terminate 정책 (&lt;code&gt;--auto-terminate&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Core 노드를 Spot 으로&lt;/strong&gt;. HDFS DataNode 이므로 spot interruption 시 블록 손실 가능. Spot 은 Task 만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Managed Scaling 은 Shuffle-aware&lt;/strong&gt;. 하지만 큰 job 시작 전 미리 스케일 아웃 트리거 필요할 수 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;EMR Serverless 는 HBase / HDFS X&lt;/strong&gt;. Stateful 서비스는 EMR on EC2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;[[aws-lake-formation|Lake Formation]] 세밀 권한 사용 시 EMR 버전 요건&lt;/strong&gt;. 최소 EMR 6.7+ 로 사용 전 확인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Trino 와 PrestoDB 는 다른 프로젝트&lt;/strong&gt;. EMR 은 둘 다 지원하지만 신규는 Trino 권장 (활발한 개발).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[hadoop-spark|Hadoop / Spark]] - EMR 이 얹는 프레임워크&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - 관리형 ETL 대안&lt;/li&gt;
&lt;li&gt;[[aws-athena|Amazon Athena]] - 서버리스 SQL 대안&lt;/li&gt;
&lt;li&gt;[[aws-s3|AWS S3]] - 저장 백엔드 (EMRFS)&lt;/li&gt;
&lt;li&gt;[[aws-lake-formation|Lake Formation]] - 세밀 접근 제어&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - 권장 포맷&lt;/li&gt;
&lt;li&gt;[[data-lake|Data Lake]] - EMR 의 대표 소비 대상&lt;/li&gt;
&lt;li&gt;[[mpp|MPP]] - 다른 계보의 분산 처리&lt;/li&gt;
&lt;li&gt;[[aws-kinesis-data-analytics|Managed Flink]] - Flink 서버리스 대안&lt;/li&gt;
&lt;li&gt;[[aws-ec2|AWS EC2]] - EMR on EC2 컴퓨트&lt;/li&gt;
&lt;li&gt;[[aws-eks|AWS EKS]] - EMR on EKS 기반&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - EMR 역할 (Service, Instance, Job Execution)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>emr</category><category>hadoop</category><category>spark</category><category>big-data</category><category>analytics</category><author>koa (김신건)</author></item><item><title>[AWS] ENI: Elastic Network Interface</title><link>https://shinkeonkim.com/wiki/cloud/aws-eni/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-eni/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ENI&lt;/strong&gt; (Elastic Network Interface, 탄력적 네트워크 인터페이스) 는 &lt;em&gt;AWS [[aws-vpc|VPC]] 안의 가상 네트워크 카드&lt;/em&gt;. 물리 서버의 NIC (Network Interface Card) 를 소프트웨어로 구현한 것으로, [[aws-ec2|EC2]] / [[aws-lambda|Lambda]] / [[aws-rds|RDS]] / ECS 등이 VPC 에 붙기 위해 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 개념&lt;/strong&gt;: &lt;em&gt;컴퓨트 리소스 (인스턴스, 함수) 는 하나 이상의 ENI 를 통해서만 VPC 네트워크에 접근&lt;/em&gt; 한다. ENI 없이는 IP 주소도, 보안 그룹도 없다.&lt;/p&gt;
&lt;h2 id=&quot;eni-가-가지는-속성&quot;&gt;ENI 가 가지는 속성&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;Primary Private IP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPC 서브넷의 사설 IP (필수)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Secondary Private IP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;추가 사설 IP (여러 개)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Public IP / EIP&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;MAC Address&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ENI 고정 (인스턴스 재부팅해도 유지)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Security Group&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ENI 별로 부착 (여러 개 가능)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Source/Dest Check&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;NAT 인스턴스는 disable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Subnet&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;소속 서브넷 (AZ 결정)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Description&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;p&gt;&lt;strong&gt;중요&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ENI 는 &lt;strong&gt;AZ 종속&lt;/strong&gt; (서브넷이 AZ 단위). 다른 AZ 로 이동 불가&lt;/li&gt;
&lt;li&gt;ENI 는 인스턴스와 &lt;strong&gt;독립 수명&lt;/strong&gt;. 인스턴스 종료 후 재부착 가능 (network migration)&lt;/li&gt;
&lt;li&gt;MAC 주소가 고정이라 &lt;strong&gt;라이선스 바인딩&lt;/strong&gt; 용도로 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;eni-유형&quot;&gt;ENI 유형&lt;/h2&gt;
&lt;h3 id=&quot;1-primary-eni-eth0&quot;&gt;1. Primary ENI (&lt;code&gt;eth0&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;인스턴스 시작 시 자동 생성&lt;/li&gt;
&lt;li&gt;인스턴스와 &lt;strong&gt;수명 동일&lt;/strong&gt; (인스턴스 종료 시 삭제)&lt;/li&gt;
&lt;li&gt;분리 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-secondary-eni&quot;&gt;2. Secondary ENI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;추가로 부착 (인스턴스 실행 중에도 hot-plug)&lt;/li&gt;
&lt;li&gt;다른 인스턴스로 이동 가능 (&lt;strong&gt;failover 용도&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;인스턴스 종료해도 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-requester-managed-eni&quot;&gt;3. Requester-managed ENI&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;AWS 서비스&lt;/em&gt; 가 자기 대신 생성한 ENI. 사용자가 직접 삭제 불가 (서비스가 관리).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lambda VPC 함수의 ENI&lt;/li&gt;
&lt;li&gt;RDS 인스턴스의 ENI&lt;/li&gt;
&lt;li&gt;ECS Fargate task 의 ENI&lt;/li&gt;
&lt;li&gt;VPC Endpoint 의 ENI&lt;/li&gt;
&lt;li&gt;ELB 노드의 ENI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;왜-eni-라는-개념이-필요한가&quot;&gt;왜 ENI 라는 개념이 필요한가&lt;/h2&gt;
&lt;p&gt;물리 세계에서는 서버 = NIC. AWS 는 가상화 환경이라 &lt;em&gt;컴퓨트와 네트워크를 분리&lt;/em&gt; 해야 유연.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;분리의 이점&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Failover&lt;/strong&gt;: EC2 A 가 죽으면 ENI 를 EC2 B 로 이동 -&gt; IP + MAC + SG 그대로 유지 -&gt; 클라이언트는 몰라도 됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-homing&lt;/strong&gt;: 하나의 인스턴스가 여러 서브넷 (다중 네트워크) 에 참여&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;관리 분리&lt;/strong&gt;: 관리 트래픽용 ENI 와 데이터 트래픽용 ENI 분리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라이선스 고정&lt;/strong&gt;: MAC 기반 라이선스 (Windows Server 등) 를 인스턴스와 무관하게 유지&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;인스턴스별-eni-한도&quot;&gt;인스턴스별 ENI 한도&lt;/h2&gt;
&lt;p&gt;인스턴스 타입에 따라 부착 가능한 ENI 수 + ENI 당 IP 수가 다름.&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;대략 ENI 수&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;ENI 당 IP 수&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;t3.micro&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;t3.medium&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;3&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;m5.large&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;3&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;m5.4xlarge&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;8&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;m5.24xlarge&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;15&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;50&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;정확한 값은 &lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI&quot;&gt;Nitro 인스턴스 ENI 한도 문서&lt;/a&gt; 참조.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;의미&lt;/strong&gt;: EKS Pod (VPC CNI 기본), Fargate task 등이 노드당 사용 가능한 IP 수를 결정.&lt;/p&gt;
&lt;h2 id=&quot;실전-사용-예&quot;&gt;실전 사용 예&lt;/h2&gt;
&lt;h3 id=&quot;1-ec2-failover-active-passive&quot;&gt;1. EC2 Failover (Active-Passive)&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;    Client[&quot;클라이언트&quot;] --&gt; ENI[&quot;ENI&amp;#x3C;br/&gt;(고정 IP 10.0.1.42)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ENI --&gt;|&quot;현재 부착&quot;| A[&quot;EC2 A (active)&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;    A -.-&gt;|&quot;장애 감지 후&amp;#x3C;br/&gt;스크립트/Lambda 가 ENI 재부착&quot;| B[&quot;EC2 B (passive)&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;    Note[&quot;IP 그대로 유지&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DNS TTL 대기 없이 초 단위 페일오버 가능.&lt;/p&gt;
&lt;h3 id=&quot;2-multi-homed-서버&quot;&gt;2. Multi-homed 서버&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;EC2 (Firewall/NAT)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├─ ENI eth0: public subnet (인터넷)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ ENI eth1: private subnet (내부)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;한 인스턴스가 두 네트워크를 걸침 (레거시 NAT 인스턴스 패턴).&lt;/p&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;EC2 (DB 서버)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├─ ENI eth0: management subnet (SSH, 모니터링)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└─ ENI eth1: data subnet (앱 트래픽)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Security group 이 ENI 별로 다르므로 관리 트래픽만 SSH 허용.&lt;/p&gt;
&lt;h2 id=&quot;lambda-eni-의-역사-cold-start-개선&quot;&gt;Lambda ENI 의 역사 (Cold Start 개선)&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lambda 는 VPC 안에서 실행 시 ENI 가 필요&lt;/em&gt;. 이 부분이 오랜 시간 Lambda [[aws-lambda-cold-start|cold start]] 의 주범이었다.&lt;/p&gt;
&lt;h3 id=&quot;옛날-모델-2019-각-함수마다-eni&quot;&gt;옛날 모델 (~2019, 각 함수마다 ENI)&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;    participant U as 사용자&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant L as Lambda 서비스&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant EC2API as EC2 API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant ENI as ENI&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;    U-&gt;&gt;L: 함수 호출 (첫 호출)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;EC2API: CreateNetworkInterface (VPC 안에서 ENI 생성 요청)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over EC2API,ENI: ENI 생성 5-10 초&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    EC2API--&gt;&gt;L: ENI ARN 반환&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;L: 함수 컨테이너 부팅&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;ENI: ENI attach&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over ENI: 총 지연 5-15 초&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L--&gt;&gt;U: 응답&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;각 함수 실행마다 ENI 생성 -&gt; &lt;strong&gt;5-15 초 cold start&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;함수 실행 종료 시 ENI 회수 -&gt; 서브넷 IP 낭비&lt;/li&gt;
&lt;li&gt;동시 실행이 많으면 서브넷 IP 고갈 -&gt; ENI 생성 실패&lt;/li&gt;
&lt;li&gt;개발자가 함수 코드를 얼마나 최적화해도 이 부분은 못 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 때문에 &lt;em&gt;“Lambda 는 VPC 안에 넣지 마라”&lt;/em&gt; 는 조언이 있었다.&lt;/p&gt;
&lt;h3 id=&quot;새로운-모델-2019--hyperplane-eni&quot;&gt;새로운 모델 (2019-, Hyperplane ENI)&lt;/h3&gt;
&lt;p&gt;AWS 는 2019 년 &lt;strong&gt;Hyperplane&lt;/strong&gt; 이라는 내부 인프라를 활용해 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;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 U as 사용자&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant L as Lambda 서비스&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant H as Hyperplane ENI (미리 생성됨, 공유)&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 H: 여러 함수 실행이&amp;#x3C;br/&gt;같은 ENI 공유&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;    U-&gt;&gt;L: 함수 호출 (첫 호출)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;L: 함수 컨테이너 부팅&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L-&gt;&gt;H: attach (기존 공유 ENI 에)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over L: 총 지연 &amp;#x3C; 1 초&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L--&gt;&gt;U: 응답&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Hyperplane ENI 의 핵심&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;함수/버전/서브넷/보안 그룹 조합당 하나&lt;/strong&gt; 의 ENI (기존: 함수 실행마다 하나)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;여러 실행이 같은 ENI 공유&lt;/strong&gt; (network multiplexing)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ENI 를 사전 생성&lt;/strong&gt; 후 재사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ENI 생성 시간이 cold start 에서 사라짐&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPC Lambda cold start: &lt;strong&gt;5-15 초 -&gt; &amp;#x3C; 1 초&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IP 소비 대폭 감소&lt;/li&gt;
&lt;li&gt;서브넷 크기 걱정 완화 (전에는 &lt;code&gt;/24&lt;/code&gt; 이상 강력 권장, 이제는 여유 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2024-추가-개선&quot;&gt;2024+ 추가 개선&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Warm ENI pool&lt;/strong&gt;: ENI 가 항상 warm 상태&lt;/li&gt;
&lt;li&gt;일반 (non-VPC) 함수와 cold start 차이 거의 없음&lt;/li&gt;
&lt;li&gt;Provisioned Concurrency 와 조합 시 사실상 0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vpc-endpoint-도-eni&quot;&gt;VPC Endpoint 도 ENI&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Interface Endpoint&lt;/strong&gt; ([[aws-privatelink|PrivateLink]] 기반) 은 VPC 서브넷에 &lt;strong&gt;ENI 를 생성&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;[VPC] -&gt; ENI (Interface Endpoint) -&gt; AWS 서비스 (S3, DynamoDB, KMS 등)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 ENI 의 IP 로 서비스 호출 -&gt; 인터넷/NAT 우회.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gateway Endpoint&lt;/strong&gt; (S3, DynamoDB 만) 는 다른 메커니즘 (라우트 테이블) 이라 ENI 없음.&lt;/p&gt;
&lt;h2 id=&quot;성능--대역폭&quot;&gt;성능 &amp;#x26; 대역폭&lt;/h2&gt;
&lt;p&gt;ENI 자체는 대역폭 상한이 없지만, &lt;em&gt;인스턴스 타입의 네트워크 성능&lt;/em&gt; 에 종속.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nitro 인스턴스 (m5, m6, c5, c6 등): ENA (Elastic Network Adapter) 지원 -&gt; 최대 100 Gbps&lt;/li&gt;
&lt;li&gt;이전 세대 (m4 등): 낮은 상한&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EFA&lt;/strong&gt; (Elastic Fabric Adapter): HPC / ML 학습용 초저지연 인터페이스. RDMA 스타일. ENI 의 특수 형태.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;multi-attach-vs-multi-eni&quot;&gt;Multi-Attach vs Multi-ENI&lt;/h2&gt;
&lt;p&gt;혼동 주의:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-Attach EBS&lt;/strong&gt;: 하나의 EBS 볼륨을 여러 EC2 에 부착 (io1/io2 only)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-ENI&lt;/strong&gt;: 하나의 EC2 에 여러 ENI 부착&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;전혀 다른 개념.&lt;/p&gt;
&lt;h2 id=&quot;비용&quot;&gt;비용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ENI 자체 요금 &lt;strong&gt;없음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IP 자체 요금 &lt;strong&gt;없음&lt;/strong&gt; (2024-02 이후 IPv4 public IP 는 시간당 과금)&lt;/li&gt;
&lt;li&gt;인스턴스 대역폭 / EIP 미사용 시 요금 등이 관련&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;ENI 는 AZ 종속&lt;/strong&gt;. 서브넷 = AZ. 다른 AZ 로 이동 불가. Multi-AZ HA 는 다른 ENI 로.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Requester-managed ENI&lt;/strong&gt; (Lambda, RDS, VPC Endpoint 가 만든 것) 는 사용자가 직접 삭제 X. 서비스 리소스를 먼저 삭제해야 함. VPC 삭제 실패의 흔한 원인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;서브넷 IP 고갈&lt;/strong&gt;. Lambda / EKS Pod 등이 서브넷의 IP 를 소비. &lt;code&gt;/24&lt;/code&gt; (~250개) 는 소규모, 대규모는 &lt;code&gt;/22&lt;/code&gt; (~1000) 이상 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Lambda cold start 옛 기억&lt;/strong&gt;. “VPC Lambda 는 느리다” 는 2019 이전 이야기. 지금은 Hyperplane 으로 큰 문제 없음. 아직 이 이유로 Lambda 를 VPC 밖에 두는 관행이 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Security Group 이 ENI 별&lt;/strong&gt;. 한 EC2 에 여러 ENI 붙이면 각자 다른 SG. 트래픽이 어느 ENI 로 오는지 파악 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Public IP 자동 할당&lt;/strong&gt; 은 서브넷 설정. Private subnet 에 만든 ENI 는 EIP 별도 부여해야 인터넷 접근.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;인스턴스별 ENI 한도&lt;/strong&gt; 를 넘으면 attach 실패. EKS 노드 크기 결정 시 반드시 확인 (Pod 수 = ENI 수 × IP-per-ENI).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-vpc|AWS VPC]] - ENI 의 실행 환경&lt;/li&gt;
&lt;li&gt;[[aws-lambda|AWS Lambda]] - VPC Lambda + Hyperplane&lt;/li&gt;
&lt;li&gt;[[aws-lambda-cold-start|Lambda Cold Start]] - ENI 개선으로 완화된 문제&lt;/li&gt;
&lt;li&gt;[[aws-ec2|AWS EC2]] - 주 사용처&lt;/li&gt;
&lt;li&gt;[[aws-privatelink|PrivateLink]] - Interface Endpoint 로 ENI 활용&lt;/li&gt;
&lt;li&gt;[[aws-sg-vs-nacl|SG vs NACL]] - ENI 에 부착하는 방화벽&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>network</category><category>eni</category><category>vpc</category><category>lambda</category><category>ec2</category><author>koa (김신건)</author></item><item><title>[AWS] Gateway Load Balancer + GENEVE</title><link>https://shinkeonkim.com/wiki/cloud/aws-gwlb/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-gwlb/</guid><pubDate>Thu, 30 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 Gateway Load Balancer&lt;/strong&gt; (GWLB) 는 &lt;em&gt;네트워크 계층 (L3) 에서 동작하는 투명 (transparent) 로드 밸런서&lt;/em&gt;. 방화벽 / IPS / IDS / DPI 같은 &lt;strong&gt;네트워크 보안 어플라이언스 (network security appliance) 를 배치, 확장, 관리&lt;/strong&gt;하는 것이 유일한 목적이다. 데이터는 GWLB 를 통과하면서 어플라이언스로 우회 (inline inspection) 되고, 응답 후 원래 목적지로 이어진다.&lt;/p&gt;
&lt;p&gt;트래픽 캡슐화에는 &lt;strong&gt;GENEVE&lt;/strong&gt; (Generic Network Virtualization Encapsulation, &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8926&quot;&gt;RFC 8926&lt;/a&gt;) 프로토콜을 사용한다. UDP 포트 &lt;strong&gt;6081&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: &lt;em&gt;“모든 VPC 트래픽을 서드파티 방화벽 어플라이언스에 통과시켜라”&lt;/em&gt; 를 관리형으로 구현한 서비스.&lt;/p&gt;
&lt;h2 id=&quot;왜-alb--nlb-로는-부족한가&quot;&gt;왜 ALB / NLB 로는 부족한가&lt;/h2&gt;
&lt;p&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;strong&gt;[[aws-alb-nlb|ALB]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;L7 (HTTP)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;HTTP path / host 라우팅, TLS 종단&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-alb-nlb|NLB]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;L4 (TCP/UDP)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;초저지연 TCP/UDP 부하 분산&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;GWLB&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;L3 (IP)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;모든 IP 패킷을 어플라이언스로 우회&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ALB / NLB 는 &lt;em&gt;애플리케이션 트래픽을 여러 서버로 분산&lt;/em&gt; 이 목적. GWLB 는 &lt;em&gt;트래픽을 서버로 보내기 전 반드시 검사/변형하는 미들박스로 보내기&lt;/em&gt; 위한 것.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;대표 시나리오&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;조직 정책: 모든 VPC 트래픽을 서드파티 방화벽 (Palo Alto, Fortinet, Check Point 등) 이 검사해야 함&lt;/li&gt;
&lt;li&gt;IDS/IPS: 침입 감지/방지 어플라이언스 클러스터 배치&lt;/li&gt;
&lt;li&gt;DLP: 데이터 유출 방지 스캐너&lt;/li&gt;
&lt;li&gt;커스텀 패킷 검사 (SSL decrypt, protocol validation)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;아키텍처&quot;&gt;아키텍처&lt;/h2&gt;
&lt;p&gt;전형적 “centralized inspection 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;    subgraph AppVPC[&quot;소비자 VPC A (workload)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Sub1[&quot;Subnet&amp;#x3C;br/&gt;(app EC2)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        RT1[&quot;Route Table&amp;#x3C;br/&gt;0.0.0.0/0 → GWLBe&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        GWLBe1[&quot;GWLB Endpoint&amp;#x3C;br/&gt;(GWLBe)&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph InspVPC[&quot;Inspection VPC (중앙)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        GWLB[&quot;GWLB&amp;#x3C;br/&gt;(L3 transparent)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        subgraph Fleet[&quot;보안 어플라이언스 fleet&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            A1[&quot;Appliance 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            A2[&quot;Appliance 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            A3[&quot;Appliance N&quot;]&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;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph AppVPC2[&quot;소비자 VPC B&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Sub2[&quot;app EC2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        GWLBe2[&quot;GWLBe&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Sub1 --&gt; RT1 --&gt; GWLBe1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Sub2 --&gt; GWLBe2&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;    GWLBe1 -.-&gt;|&quot;GENEVE tunnel&amp;#x3C;br/&gt;UDP 6081&quot;| GWLB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWLBe2 -.-&gt;|&quot;GENEVE&quot;| GWLB&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;    GWLB --&gt; A1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWLB --&gt; A2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWLB --&gt; A3&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;    A1 -.-&gt;|&quot;검사 후 다시 GENEVE&quot;| GWLB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWLB -.-&gt;|&quot;복귀&quot;| GWLBe1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    GWLBe1 --&gt;|&quot;원래 목적지로&quot;| Inet[&quot;Internet / peered VPC&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;구성-요소&quot;&gt;구성 요소&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GWLB&lt;/strong&gt;: 어플라이언스 fleet 앞단의 L3 로드 밸런서. 반드시 inspection VPC 에.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GWLBe (GWLB Endpoint)&lt;/strong&gt;: 소비자 VPC 안에 배포하는 [[aws-privatelink|PrivateLink]] 스타일 endpoint. 라우트 테이블이 이 endpoint 를 목적지로 지정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Appliance fleet&lt;/strong&gt;: EC2 인스턴스에 서드파티 SW 설치. GENEVE 지원 필수.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Route Table&lt;/strong&gt;: 소비자 VPC 의 서브넷 라우트가 트래픽을 GWLBe 로 우회.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;트래픽-흐름-ingress-예&quot;&gt;트래픽 흐름 (Ingress 예)&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;1. Internet → IGW → 소비자 VPC 서브넷 라우트&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. 라우트가 &quot;→ GWLBe&quot; 지시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. GWLBe 가 트래픽을 GENEVE 로 캡슐화 → GWLB 로 (사설 링크)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4. GWLB 가 flow hash 로 특정 appliance 선택 → GENEVE 로 전달&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5. Appliance 가 GENEVE decapsulate → 원본 패킷 검사&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;6. 통과 결정 시 → GENEVE 로 재캡슐화 → GWLB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;7. GWLB → GWLBe → 원래 목적지 (app EC2)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: appliance 는 원본 패킷의 &lt;strong&gt;모든 헤더와 페이로드를 그대로 봄&lt;/strong&gt; (GENEVE 는 캡슐화만 함, 원본 훼손 X). 그래서 IPS / IDS 등이 “실제” 트래픽으로 판단 가능.&lt;/p&gt;
&lt;h2 id=&quot;geneve-프로토콜&quot;&gt;GENEVE 프로토콜&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Generic Network Virtualization Encapsulation&lt;/strong&gt; (&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8926&quot;&gt;RFC 8926&lt;/a&gt;, 2020 표준화). 네트워크 가상화용 범용 캡슐화.&lt;/p&gt;
&lt;h3 id=&quot;왜-geneve-인가&quot;&gt;왜 GENEVE 인가&lt;/h3&gt;
&lt;p&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;strong&gt;VXLAN&lt;/strong&gt; (&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc7348&quot;&gt;RFC 7348&lt;/a&gt;)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;UDP 캡슐화, L2 over L3&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;NVGRE&lt;/strong&gt; (&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc7637&quot;&gt;RFC 7637&lt;/a&gt;)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GRE 캡슐화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;UDP 기반 아니라 hash 어려움&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;STT&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;TCP 캡슐화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;TCP 헤더 활용, 미들박스 오해&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;GENEVE&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;UDP + 확장 가능한 TLV&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;p&gt;&lt;strong&gt;GENEVE 의 결정적 이점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLV (Type-Length-Value) 옵션 필드&lt;/strong&gt; → 메타데이터를 유연하게 추가 (누가 보냈는지, 어느 tenant 인지, 어떤 정책 태그인지 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컨트롤 플레인 독립성&lt;/strong&gt; → 어떤 컨트롤러 (SDN) 와도 조합 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;미들박스 / service chaining&lt;/strong&gt; 에 최적 → 여러 어플라이언스를 순차 통과 시 메타데이터 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS 는 이러한 GENEVE 특성을 활용해 GWLB 를 구현. Appliance 벤더가 표준 GENEVE 만 지원하면 자동으로 GWLB 호환.&lt;/p&gt;
&lt;h3 id=&quot;geneve-패킷-구조&quot;&gt;GENEVE 패킷 구조&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;| Outer Ethernet     |&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;| Outer IP           |  ← GWLB ↔ Appliance IP&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;| Outer UDP (6081)   |  ← Geneve 포트&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;| Geneve Header      |  ← VNI + TLV 옵션&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;| ORIGINAL PACKET    |  ← 원본 (Ethernet / IP / TCP / Payload)&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;&lt;strong&gt;포트 6081&lt;/strong&gt;: IANA 등록. Appliance 는 UDP 6081 을 listen 해서 GENEVE 트래픽 수신.&lt;/p&gt;
&lt;h2 id=&quot;flow-stickiness-5-tuple&quot;&gt;Flow Stickiness (5-tuple)&lt;/h2&gt;
&lt;p&gt;같은 흐름 (flow) 이 항상 같은 appliance 로 가야 함. 그래야 stateful inspection (예: TCP session 추적) 이 가능.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;기본 동작&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;5-tuple hash&lt;/strong&gt;: (src IP, dst IP, src port, dst port, protocol) 로 해시&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symmetric hashing&lt;/strong&gt;: A→B 와 B→A 가 같은 hash → 양방향 모두 같은 appliance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Health check 실패&lt;/strong&gt; 시 해당 appliance 제외 (해당 flow 재분배 - stateful 세션은 끊길 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대체 옵션&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;3-tuple&lt;/strong&gt;: (src IP, dst IP, protocol) - port 무시. 여러 흐름을 같은 appliance 로 묶고 싶을 때&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2-tuple&lt;/strong&gt;: (src IP, dst IP) - 가장 broad 그룹핑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;health-check&quot;&gt;Health Check&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Appliance 상태 확인 (TCP, HTTP, HTTPS)&lt;/li&gt;
&lt;li&gt;실패 target 은 rotation 에서 제외&lt;/li&gt;
&lt;li&gt;프로덕션: 어플라이언스 자체가 healthy 를 정확히 반영해야 함 (죽었는데 healthy 라 답하면 트래픽 blackhole)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;배포-패턴&quot;&gt;배포 패턴&lt;/h2&gt;
&lt;h3 id=&quot;1-centralized-inspection-vpc-일반적&quot;&gt;1. Centralized Inspection VPC (일반적)&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;[여러 workload VPC] → [Transit Gateway] → [Inspection VPC (GWLB + fleet)] → [Egress]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;하나의 inspection VPC 가 조직 전체 방화벽 담당&lt;/li&gt;
&lt;li&gt;관리 단순 (규칙 / 어플라이언스 fleet 한 곳)&lt;/li&gt;
&lt;li&gt;TGW route table 로 트래픽 우회&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-분산-inspection&quot;&gt;2. 분산 Inspection&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;[각 workload VPC 안에] → [GWLBe → 로컬 fleet] → [원래 목적지]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;각 VPC 가 자기 fleet&lt;/li&gt;
&lt;li&gt;지연 최소 (같은 리전 안 데이터센터에서만)&lt;/li&gt;
&lt;li&gt;관리 부담 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-ingress-only--egress-only&quot;&gt;3. Ingress-only / Egress-only&lt;/h3&gt;
&lt;p&gt;Ingress 만 (인터넷 → 서비스) 검사하거나 Egress 만 (서비스 → 외부) 검사하는 부분 배치도 가능. 라우트 테이블 설계로 결정.&lt;/p&gt;
&lt;h2 id=&quot;gwlb-vs-aws-network-firewallaws-network-firewall&quot;&gt;GWLB vs [[aws-network-firewall|AWS Network Firewall]]&lt;/h2&gt;
&lt;p&gt;같은 목적 (VPC 방화벽) 이지만 방식이 다름.&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;GWLB (+ 3rd party appliance)&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;[[aws-network-firewall|AWS Network Firewall]]&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;Appliance fleet (사용자 관리)&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;Palo Alto / Fortinet / Check Point / 커스텀&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Suricata 기반&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;AWS 지원 rule 만&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;어플라이언스 라이선스 (BYOL 또는 marketplace)&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;관측&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;어플라이언스 벤더 도구&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CloudWatch / CloudTrail&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;기존 벤더 이미 사용, 고급 기능 (SSL decrypt 등)&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;&lt;strong&gt;기존 조직 표준 방화벽&lt;/strong&gt; (Palo Alto 등) 을 그대로 클라우드에 → &lt;strong&gt;GWLB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS 관리형 방화벽만&lt;/strong&gt; 원함 → &lt;strong&gt;Network Firewall&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;둘 다 필요&lt;/strong&gt;: L4 는 Network Firewall, L7 DPI 는 GWLB + 어플라이언스&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-시나리오&quot;&gt;실전 시나리오&lt;/h2&gt;
&lt;h3 id=&quot;1-서드파티-방화벽-표준화&quot;&gt;1. 서드파티 방화벽 표준화&lt;/h3&gt;
&lt;p&gt;조직이 이미 Palo Alto VM-Series 를 온프렘에서 사용 중. AWS 로 확장 시:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Palo Alto VM-Series 를 GWLB target group 으로 배포&lt;/li&gt;
&lt;li&gt;모든 workload VPC 의 outbound 를 inspection VPC 로 우회&lt;/li&gt;
&lt;li&gt;온프렘과 동일 정책 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-idsips-클러스터&quot;&gt;2. IDS/IPS 클러스터&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Snort / Suricata 어플라이언스 fleet&lt;/li&gt;
&lt;li&gt;GWLB 로 부하 분산&lt;/li&gt;
&lt;li&gt;Symmetric hashing 으로 stateful IDS 세션 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-dpi-deep-packet-inspection&quot;&gt;3. DPI (Deep Packet Inspection)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;네트워크 트래픽을 DPI 엔진에 통과&lt;/li&gt;
&lt;li&gt;특정 프로토콜 / 페이로드 감지&lt;/li&gt;
&lt;li&gt;Compliance 요구 (금융/의료)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cross-az-고려사항&quot;&gt;Cross-AZ 고려사항&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GWLB 는 리전 단위지만 target 은 &lt;strong&gt;AZ-aware&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-AZ 라우팅&lt;/strong&gt; = 데이터 전송 비용 + 지연&lt;/li&gt;
&lt;li&gt;권장: workload / GWLBe / appliance 를 &lt;strong&gt;같은 AZ 에 위치&lt;/strong&gt; 시켜 flow 가 AZ 안에서 완결되도록&lt;/li&gt;
&lt;li&gt;Route table 을 서브넷별로 (같은 AZ) 로컬 GWLBe 를 참조하게&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GWLB 시간당&lt;/strong&gt; + &lt;strong&gt;처리 데이터량 (GB)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GWLBe 시간당&lt;/strong&gt; + &lt;strong&gt;처리 데이터량 (GB)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Appliance EC2 인스턴스 요금 별도&lt;/li&gt;
&lt;li&gt;어플라이언스 라이선스 (marketplace / BYOL) 별도&lt;/li&gt;
&lt;li&gt;Cross-AZ 데이터 전송 요금 (일반 VPC 규칙 적용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;총 비용은 상당함&lt;/strong&gt; (여러 요소 합산). 도입 전 시뮬레이션 필수.&lt;/p&gt;
&lt;h2 id=&quot;어플라이언스-요구사항&quot;&gt;어플라이언스 요구사항&lt;/h2&gt;
&lt;p&gt;Appliance 는 GENEVE 를 이해해야 함:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UDP 6081 listen&lt;/li&gt;
&lt;li&gt;GENEVE decapsulate → 원본 패킷 처리 → 재캡슐화&lt;/li&gt;
&lt;li&gt;Health check 응답&lt;/li&gt;
&lt;li&gt;Symmetric flow 지원 (양방향 같은 appliance 로 오는 것 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대부분의 상용 방화벽 벤더&lt;/strong&gt; (Palo Alto, Fortinet, Check Point, Cisco, F5 등) 가 GWLB 대상 이미지 (AMI) 를 marketplace 에 제공.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;모든 어플라이언스가 GENEVE 지원하지 않음&lt;/strong&gt;. GWLB 도입 전 어플라이언스가 “GWLB target” 을 공식 지원하는지 벤더 문서 확인 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;어플라이언스 fleet 이 SPOF&lt;/strong&gt; = 죽으면 workload 트래픽 blackhole. 최소 3 AZ, Health check 실전 검증, 어플라이언스 auto-recovery 설정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Symmetric flow 실패&lt;/strong&gt; = stateful 세션 (TCP, TLS) 이 다른 appliance 로 가서 검사 실패. 어플라이언스가 symmetric hashing 을 정확히 지원해야 함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Cross-AZ 요금&lt;/strong&gt;. 서브넷별 로컬 GWLBe / appliance 배치로 최소화.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;관리 부담 크다&lt;/strong&gt;. GWLB + GWLBe + appliance fleet + 라우트 테이블 + 어플라이언스 자체 관리. 소규모 조직은 [[aws-network-firewall|AWS Network Firewall]] 가 훨씬 저렴/편함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;[[aws-alb-nlb|ALB / NLB]] 와 목적 완전 다름&lt;/strong&gt;. 애플리케이션 부하 분산에 GWLB 를 쓰지 말 것.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;디버깅 어려움&lt;/strong&gt;. VPC Flow Logs 로 트래픽 경로 관찰, appliance 자체 로그, GENEVE 캡슐화 특수성 이해 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-alb-nlb|ALB / NLB]] - 애플리케이션 부하 분산 (다른 목적)&lt;/li&gt;
&lt;li&gt;[[aws-network-firewall|AWS Network Firewall]] - 관리형 대안&lt;/li&gt;
&lt;li&gt;[[aws-privatelink|PrivateLink]] - GWLBe 의 기반 기술&lt;/li&gt;
&lt;li&gt;[[aws-vpc|VPC]] - 배포 컨텍스트&lt;/li&gt;
&lt;li&gt;[[aws-sg|Security Group]] - ENI 레벨 필터&lt;/li&gt;
&lt;li&gt;[[aws-waf|AWS WAF]] - L7 HTTP 방화벽 (다른 계층)&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]] - 관측&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>network</category><category>load-balancer</category><category>security</category><category>firewall</category><category>vpc</category><author>koa (김신건)</author></item><item><title>[AWS] Glue DataBrew: 시각적 데이터 준비</title><link>https://shinkeonkim.com/wiki/cloud/aws-glue-databrew/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-glue-databrew/</guid><pubDate>Thu, 30 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 Glue DataBrew&lt;/strong&gt; 는 &lt;em&gt;데이터 분석가와 데이터 사이언티스트를 위한 시각적 (no-code) 데이터 준비 도구&lt;/em&gt;. [[aws-glue|AWS Glue]] 제품군의 일부지만 별도 UI 를 갖고 SQL/Spark 코드 없이 250+ 개 사전 정의 변환으로 데이터를 클리닝, 정규화, 변환.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;대상 사용자&lt;/strong&gt;: 데이터 사이언티스트, 애널리스트, 비즈니스 사용자 (엔지니어 아님).&lt;/p&gt;
&lt;h2 id=&quot;glue-studio-vs-glue-databrew&quot;&gt;Glue Studio vs Glue DataBrew&lt;/h2&gt;
&lt;p&gt;같은 Glue 제품군이지만 목적이 다름.&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;[[aws-glue|Glue Studio]]&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Glue DataBrew&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;데이터 엔지니어&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;UI 방식&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;노드 그래프 (source → transform → sink)&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;Spark 코드 생성 (Python/Scala)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Recipe (선언형 스텝)&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;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;임의 (Spark)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;250+ 사전 정의&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;이상값/PII 자동 감지, 통계 프로파일&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;대규모 배치 ETL&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;h3 id=&quot;dataset&quot;&gt;Dataset&lt;/h3&gt;
&lt;p&gt;DataBrew 가 참조하는 데이터 소스.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;파일&lt;/strong&gt;: [[aws-s3|S3]] (CSV, JSON, [[apache-parquet|Parquet]], ORC, Avro, XLSX)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;테이블&lt;/strong&gt;: [[aws-glue|Glue Data Catalog]] 등록 테이블&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DB&lt;/strong&gt;: [[aws-rds|RDS]], [[aws-redshift|Redshift]], [[dynamodb|DynamoDB]] (커넥션)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SaaS&lt;/strong&gt;: Salesforce, Marketo, ServiceNow (일부)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;project&quot;&gt;Project&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Dataset + Recipe&lt;/strong&gt; 조합의 작업 공간. 인터랙티브 편집.&lt;/p&gt;
&lt;h3 id=&quot;recipe&quot;&gt;Recipe&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;순서대로 실행되는 변환 스텝의 집합&lt;/em&gt;. JSON 으로 저장, 버전 관리, 재사용 가능.&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:#E1E4E8&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:#79B8FF&quot;&gt;      &quot;Operation&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;REMOVE_MISSING&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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 style=&quot;color:#79B8FF&quot;&gt;&quot;sourceColumn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;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:#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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Operation&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CHANGE_DATA_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;Parameters&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;sourceColumn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&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;targetDataType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;double&quot;&lt;/span&gt;&lt;span style=&quot;color:#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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;Operation&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;STANDARDIZE_TEXT&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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 style=&quot;color:#79B8FF&quot;&gt;&quot;sourceColumn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;country&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;standardizeMode&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;UPPERCASE&quot;&lt;/span&gt;&lt;span style=&quot;color:#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;h3 id=&quot;job&quot;&gt;Job&lt;/h3&gt;
&lt;p&gt;Recipe 를 dataset 에 적용해 실제 결과를 저장.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Job 유형&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recipe Job&lt;/strong&gt;: Recipe 를 데이터에 적용, 결과를 S3 등에 저장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile Job&lt;/strong&gt;: 데이터 통계 (min, max, null, distinct, 히스토그램, 이상값) 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;변환-종류-250-개&quot;&gt;변환 종류 (250+ 개)&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;Cleaning&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;공백 제거, null 처리, 중복 제거, 특수문자 제거&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Format&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;Structural&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;컬럼 분할/합치기, pivot/unpivot, transpose&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Combine&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Join, Union&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Statistical&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Standardize, normalize (z-score, min-max), outliers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Text&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;정규식 추출, translate, tokenize&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Date/Time&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Parse, format, extract components, timezone&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Math&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;PII&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;자동 감지, mask, hash, delete&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;NLP&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;p&gt;Profile Job 을 실행하면 데이터 품질 리포트 자동 생성.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;포함&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;컬럼별 통계 (min, max, mean, median, stddev)&lt;/li&gt;
&lt;li&gt;Null / distinct / duplicate 카운트&lt;/li&gt;
&lt;li&gt;값 분포 히스토그램&lt;/li&gt;
&lt;li&gt;상관관계 (correlation matrix)&lt;/li&gt;
&lt;li&gt;이상치 (outlier) 감지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PII 감지&lt;/strong&gt; (이름, 이메일, 주소, 신용카드 등)&lt;/li&gt;
&lt;li&gt;데이터 품질 규칙 (Data Quality Rules) 결과&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 LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Sources[&quot;소스&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S3In[(&quot;S3 파일&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Cat[(&quot;Glue Data Catalog&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        RDS[(&quot;RDS/Redshift&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        SaaS[SaaS 커넥터]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Sources --&gt; DS[Dataset]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DS --&gt; Proj[Project]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Proj --&gt;|&quot;인터랙티브&amp;#x3C;br/&gt;편집&quot;| Rec[Recipe]&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;    Rec --&gt; RJ[Recipe Job]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DS --&gt; PJ[Profile Job]&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;    RJ --&gt; Out[(&quot;S3 출력&amp;#x3C;br/&gt;CSV/Parquet/JSON&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PJ --&gt; Report[(&quot;S3 프로파일 리포트&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;&lt;strong&gt;Interactive Session&lt;/strong&gt;: &lt;code&gt;$1.00 / 30분 세션&lt;/code&gt; (Project 편집)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recipe Job&lt;/strong&gt;: &lt;code&gt;$0.48 / node-hour&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile Job&lt;/strong&gt;: &lt;code&gt;$0.48 / node-hour&lt;/code&gt;&lt;/li&gt;
&lt;/ul&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;매일 recipe job 10분 실행 (2 nodes):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  2 × (10/60) × $0.48 = $0.16 /일&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  = ~$5 /월&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Glue Spark ETL 대비 저렴 (단순 정제 용도).&lt;/p&gt;
&lt;h2 id=&quot;실전-예제&quot;&gt;실전 예제&lt;/h2&gt;
&lt;h3 id=&quot;1-csv-를-정제해-parquet-로&quot;&gt;1. CSV 를 정제해 Parquet 로&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;Dataset: s3://raw/customer.csv (100 GB)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Recipe:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  1. REMOVE_DUPLICATES on customer_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  2. STANDARDIZE_TEXT on country (UPPERCASE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  3. CHANGE_DATA_TYPE on signup_date (STRING -&gt; DATE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  4. REPLACE_MISSING on email with &apos;unknown@domain&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  5. DELETE_COLUMN ssn                      // PII 제거&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  6. HASH_STRING on phone_number             // PII masking&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Job:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Output: s3://curated/customer/ (Parquet, SNAPPY)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-데이터-품질-리포트-profile-job&quot;&gt;2. 데이터 품질 리포트 (Profile Job)&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;Dataset: s3://raw/orders.parquet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Profile Job:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Output: s3://profiles/orders/report.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Includes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - order_amount: min=0, max=1M, mean=50, stddev=100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Outliers: 12 rows (amount &gt; $10K)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - customer_email: PII detected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - country: 32 distinct values&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Dataset A: s3://sales/orders.csv&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Dataset B: Glue Catalog 의 customers 테이블&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Recipe:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  1. JOIN on customer_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  2. AGGREGATE by country: SUM(amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  3. TOP_N n=10 by revenue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Job: Redshift 로 적재&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;glue-databrew-언제-쓰나&quot;&gt;Glue DataBrew 언제 쓰나&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터 사이언티스트가 Jupyter 로 데이터 탐색 (대안: pandas)&lt;/li&gt;
&lt;li&gt;애널리스트가 원본 CSV 를 BI 용으로 정제&lt;/li&gt;
&lt;li&gt;데이터 품질 감사 (Profile Job)&lt;/li&gt;
&lt;li&gt;PII 감지 자동화 (한 번)&lt;/li&gt;
&lt;li&gt;프로토타이핑, 파일럿&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;부적합&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;대규모 배치 ETL (수 TB / 시간) - [[aws-glue|Glue Spark]] 나 [[aws-emr|EMR]]&lt;/li&gt;
&lt;li&gt;실시간 스트리밍 - [[aws-kinesis-data-analytics|Managed Flink]] / [[aws-data-firehose|Firehose]]&lt;/li&gt;
&lt;li&gt;복잡한 커스텀 로직 - Glue Spark&lt;/li&gt;
&lt;li&gt;프로덕션 grade CI/CD - 코드 기반 (dbt / Glue)&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;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;DataBrew&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;애널리스트&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;No-code, 시각적, PII 감지&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;[[aws-glue|Glue Studio]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;데이터 엔지니어&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Spark 파워&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;dbt&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;애널리틱스 엔지니어&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQL + 테스트 + lineage&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ELT 만&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Trifacta&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;애널리스트&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DataBrew 원류, 성숙&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;pandas / polars&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;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;DataBrew 는 대규모 ETL 아님&lt;/strong&gt;. 100 GB 이상 반복 정제는 [[aws-glue|Glue Spark]] 나 [[aws-emr|EMR]] 이 저렴/빠름.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Interactive Session 을 켜두고 idle&lt;/strong&gt; = 세션당 $1/30분 계속 청구. 사용 후 반드시 종료.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Recipe 는 순서 의존&lt;/strong&gt;. 스텝 순서 바꾸면 결과 달라짐. Version 관리 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Recipe 는 Spark 로 변환 실행&lt;/strong&gt;. 매우 큰 데이터에는 partition/parallel 튜닝 불가.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Profile Job 도 유료 (node-hour)&lt;/strong&gt;. 매일 실행하면 비용 누적. 필요할 때만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;CI/CD 자동화 어려움&lt;/strong&gt;. Recipe JSON 을 Git 관리 하되, 배포는 AWS SDK 로 직접 스크립팅 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - 상위 제품군&lt;/li&gt;
&lt;li&gt;[[aws-athena|Athena]] - SQL 대안&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - 소스/목적지&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - 권장 출력 포맷&lt;/li&gt;
&lt;li&gt;[[etl|ETL / ELT]] - 파이프라인 개념&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - 정제 후 저장&lt;/li&gt;
&lt;li&gt;[[data-lake|Data Lake]] - 원본 소스&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>glue</category><category>databrew</category><category>data-prep</category><category>no-code</category><category>etl</category><author>koa (김신건)</author></item><item><title>[AWS] Glue: 서버리스 ETL + Data Catalog</title><link>https://shinkeonkim.com/wiki/cloud/aws-glue/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-glue/</guid><pubDate>Thu, 30 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 Glue&lt;/strong&gt; 는 &lt;em&gt;서버리스 [[etl|ETL]] + 통합 메타데이터 카탈로그&lt;/em&gt; 플랫폼. Apache Spark 로 데이터 변환을 실행하고, Hive 호환 Data Catalog 로 스키마를 관리. [[aws-athena|Athena]], [[aws-redshift-spectrum|Redshift Spectrum]], EMR 이 모두 같은 카탈로그를 공유.&lt;/p&gt;
&lt;p&gt;세 가지 축:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Data Catalog&lt;/strong&gt; - Hive 호환 메타 저장소 (databases, tables, partitions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crawlers&lt;/strong&gt; - 데이터 스캔 -&gt; 스키마 자동 등록&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jobs&lt;/strong&gt; - Spark / Python Shell 기반 변환 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;glue-version-이라는-개념&quot;&gt;Glue Version 이라는 개념&lt;/h2&gt;
&lt;p&gt;Glue Job 을 만들 때 &lt;strong&gt;Glue version&lt;/strong&gt; (릴리스 라벨) 을 선택한다. Glue version 은 그 안에서 사용할 &lt;strong&gt;Spark, Python, Java, 오픈 테이블 포맷 (Iceberg / Hudi / Delta)&lt;/strong&gt; 조합을 고정한다. AWS 가 조합을 사전 검증해 제공하므로 사용자는 개별 버전 호환성을 신경 쓸 필요 없다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;의미&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Job 스크립트는 특정 Glue version 위에서 실행됨&lt;/li&gt;
&lt;li&gt;상위 version 은 최신 Spark / Python / 최적화 포함&lt;/li&gt;
&lt;li&gt;하위 version 은 레거시 코드 호환&lt;/li&gt;
&lt;/ul&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; -&gt; &lt;strong&gt;최신 안정 version&lt;/strong&gt; (Iceberg 완전 지원 등 최신 features)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;기존 프로덕션&lt;/strong&gt; -&gt; 검증된 version 유지 (마이그레이션 계획 후 상승)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;매우 오래된 version (2.x 이하)&lt;/strong&gt; -&gt; EOL 대비 마이그레이션&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;각 version 의 정확한 Spark/Python/Java 조합은 &lt;a href=&quot;https://docs.aws.amazon.com/glue/latest/dg/release-notes.html&quot;&gt;AWS Glue Release Notes&lt;/a&gt; 참조.&lt;/p&gt;
&lt;h2 id=&quot;data-catalog&quot;&gt;Data Catalog&lt;/h2&gt;
&lt;p&gt;Hive Metastore 호환의 서버리스 메타 저장소. Region 스코프.&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;Catalog (Region)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Database &quot;sales_db&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── Table &quot;orders&quot;          → S3 위치, 스키마, 파티션, SerDe&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   │   ├── Partition (year=2026, month=07)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   │   ├── Partition (year=2026, month=08)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── Table &quot;customers&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Database &quot;logs_db&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── Table &quot;access_logs&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;소비자&lt;/strong&gt;: [[aws-athena|Athena]], [[aws-redshift-spectrum|Spectrum]], EMR, Lake Formation, SageMaker&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;저장 요금&lt;/strong&gt;: 첫 100만 오브젝트 무료, 초과 시 100k 당 $1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;요청 요금&lt;/strong&gt;: 첫 100만 requests/월 무료, 초과 시 100만 당 $1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Partition 관리 전략&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Crawler 등록&lt;/strong&gt;: 배치로 파티션 발견 및 등록&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Athena &lt;code&gt;MSCK REPAIR TABLE&lt;/code&gt;&lt;/strong&gt;: Hive 스타일 파티션 자동 발견&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ALTER TABLE ADD PARTITION&lt;/code&gt;&lt;/strong&gt;: 파이프라인이 직접 등록 (권장)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partition Projection&lt;/strong&gt; ([[aws-athena|Athena]] 전용): 카탈로그 등록 없이 규칙으로 유추&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;crawlers&quot;&gt;Crawlers&lt;/h2&gt;
&lt;p&gt;S3 / JDBC / [[dynamodb|DynamoDB]] / MongoDB 를 스캔해서 스키마와 파티션을 자동 발견.&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;Crawler 대상:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- S3 (Parquet, ORC, JSON, CSV, Avro, XML, Delta, Iceberg, Hudi)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- JDBC (RDS, Aurora, Redshift, on-prem)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- DynamoDB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- MongoDB / DocumentDB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Glue Catalog (cross-region 카탈로그 복제)&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;code&gt;CRAWL_EVERYTHING&lt;/code&gt;&lt;/strong&gt; - 매번 전체&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CRAWL_NEW_FOLDERS_ONLY&lt;/code&gt;&lt;/strong&gt; - 새 파티션만&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CRAWL_EVENT_MODE&lt;/code&gt;&lt;/strong&gt; - S3 event 기반 증분&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Schema Change Policy&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update: &lt;code&gt;LOG&lt;/code&gt; / &lt;code&gt;UPDATE_IN_DATABASE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Delete: &lt;code&gt;LOG&lt;/code&gt; / &lt;code&gt;DELETE_FROM_DATABASE&lt;/code&gt; / &lt;code&gt;DEPRECATE_IN_DATABASE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;과금&lt;/strong&gt;: &lt;code&gt;$0.44 / DPU-hour&lt;/code&gt; (ETL job 과 동일). 2 DPU 반시간 = $0.44.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Crawler 를 스케줄로 매시간 돌리는 관행&lt;/strong&gt; 은 비용 유출. 새 파티션만 필요하면 &lt;code&gt;CRAWL_NEW_FOLDERS_ONLY&lt;/code&gt; 또는 파이프라인이 파티션을 직접 등록.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;job-유형&quot;&gt;Job 유형&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;Spark ETL&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Apache Spark&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;대규모 변환, join, aggregate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Spark Streaming&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Spark Structured Streaming&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kinesis/Kafka 실시간 인제스션&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Python Shell&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Python (Spark 없음)&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;Ray&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Ray.io&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;분산 Python (&lt;strong&gt;2026-04-30 신규 고객 접수 중단&lt;/strong&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;worker-types--dpu&quot;&gt;Worker Types &amp;#x26; DPU&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;DPU&lt;/strong&gt; (Data Processing Unit) = &lt;em&gt;Glue 컴퓨트의 표준 단위&lt;/em&gt;. 대략 4 vCPU + 16 GB 메모리 조합에 해당하며, Glue 요금은 사실상 “DPU × 실행 시간” 으로 결정된다.&lt;/p&gt;
&lt;h3 id=&quot;worker-계열-두-축&quot;&gt;Worker 계열 두 축&lt;/h3&gt;
&lt;p&gt;Glue 는 워커 타입을 두 축으로 제공한다.&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 TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Job[&quot;Spark ETL Job&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;    Job --&gt; G[&quot;G-series&amp;#x3C;br/&gt;(균형형: CPU + Memory)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Job --&gt; R[&quot;R-series&amp;#x3C;br/&gt;(메모리 최적화)&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;    G --&gt; G1[&quot;작은 워커&amp;#x3C;br/&gt;(0.25 - 2 DPU)&amp;#x3C;br/&gt;스트리밍, 일반 ETL&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    G --&gt; G2[&quot;큰 워커&amp;#x3C;br/&gt;(4 - 16 DPU)&amp;#x3C;br/&gt;무거운 aggregation, join&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;    R --&gt; R1[&quot;메모리 대비 CPU 낮음&amp;#x3C;br/&gt;OOM 자주 발생하는&amp;#x3C;br/&gt;워크로드&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;g-series-대부분의-워크로드&quot;&gt;G-series: 대부분의 워크로드&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;CPU 와 메모리가 균형 잡힌&lt;/em&gt; 표준 워커. 대부분 여기.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;작은 워커 (&amp;#x3C; 1 DPU)&lt;/strong&gt; = 스트리밍이나 소규모 ETL. cost-efficient.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;표준 워커 (1-2 DPU)&lt;/strong&gt; = 일반 ETL / join / 집계 대부분&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;큰 워커 (4-16 DPU)&lt;/strong&gt; = 매우 무거운 aggregation, GC 오버헤드 우려 있는 워크로드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한 워커의 DPU 가 커질수록&lt;/strong&gt; disk (임시 shuffle 저장) 도 함께 커짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;r-series-oom-방지용&quot;&gt;R-series: OOM 방지용&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;같은 DPU 대비 메모리 비중이 큰&lt;/em&gt; 워커. Spark job 이 자주 OutOfMemory 로 실패하거나, 매우 큰 shuffle / broadcast join / cache 를 다룰 때.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선택 기준&lt;/strong&gt;: 로그에 &lt;code&gt;java.lang.OutOfMemoryError&lt;/code&gt; / &lt;code&gt;spark.executor.memoryOverhead&lt;/code&gt; 관련 실패가 반복 -&gt; R-series 검토.&lt;/p&gt;
&lt;h3 id=&quot;worker-선택의-원칙&quot;&gt;Worker 선택의 원칙&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;처음엔 G.1X 로 시작&lt;/strong&gt; - 대부분 워크로드 커버&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;profile 후 조정&lt;/strong&gt; - Spark UI 로 GC / shuffle spill 관찰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;큰 워커 소수 vs 작은 워커 다수&lt;/strong&gt; - 각각 트레이드오프. 큰 워커 = shuffle 오버헤드 감소, 작은 워커 = 병렬성 향상&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OOM 잦음 -&gt; R-series 또는 워커 크기 증가&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;큰 워커 타입은 일부 리전 제약&lt;/strong&gt; 있음 (신규 계열은 특정 리전만)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;정확한 DPU × vCPU × 메모리 × 디스크 값은 &lt;a href=&quot;https://docs.aws.amazon.com/glue/latest/dg/add-job.html&quot;&gt;AWS Glue 워커 문서&lt;/a&gt; 참조.&lt;/p&gt;
&lt;h2 id=&quot;가격&quot;&gt;가격&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Standard&lt;/strong&gt;: &lt;code&gt;$0.44 / DPU-hour&lt;/code&gt;, 초 단위 과금, 최소 1초 (Glue 3.0+) / 1분 (Glue 0.9/1.0).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flex&lt;/strong&gt; (비시간-민감 워크로드): &lt;code&gt;$0.29 / DPU-hour&lt;/code&gt; (약 34% 절감).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Glue 3.0+ 만&lt;/li&gt;
&lt;li&gt;G.1X / G.2X 만 (G.4X 이상 미지원)&lt;/li&gt;
&lt;li&gt;예: 야간 배치, 재처리, 실험&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Data Catalog&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;스토리지: 첫 100만 오브젝트 무료, 초과 100k 당 $1/월&lt;/li&gt;
&lt;li&gt;요청: 첫 100만 requests/월 무료, 초과 100만 당 $1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Interactive Sessions&lt;/strong&gt; (Jupyter): &lt;code&gt;$0.44 / DPU-hour&lt;/code&gt;, idle 자동 종료.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data Quality&lt;/strong&gt;: &lt;code&gt;$0.44 / DPU-hour&lt;/code&gt;, 최소 2 DPU × 1분.&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;Spark ETL job:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  G.2X × 10 workers = 20 DPU&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  30분 실행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  = 20 × 0.5 × $0.44 = $4.40&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;Flex 로 실행 시:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  = 20 × 0.5 × $0.29 = $2.90&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;job-스크립트-예제&quot;&gt;Job 스크립트 예제&lt;/h2&gt;
&lt;h3 id=&quot;pyspark-glue-5x&quot;&gt;PySpark (Glue 5.x)&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; sys&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; awsglue.transforms &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&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:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; awsglue.utils &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; getResolvedOptions&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; pyspark.context &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; SparkContext&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; awsglue.context &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; GlueContext&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; awsglue.job &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Job&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;args &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; getResolvedOptions(sys.argv, [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;JOB_NAME&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;sc &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; SparkContext()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;glueContext &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; GlueContext(sc)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;spark &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; glueContext.spark_session&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;job &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Job(glueContext)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;job.init(args[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;JOB_NAME&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;], args)&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;# Catalog 에서 읽기 (테이블 = 카탈로그 등록되어 있어야 함)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;orders &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; glueContext.create_dynamic_frame.from_catalog(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    database&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sales_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:#FFAB70&quot;&gt;    table_name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;orders_raw&quot;&lt;/span&gt;&lt;span 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;    push_down_predicate&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;year=&apos;2026&apos; AND month=&apos;07&apos;&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:#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;transformed &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; orders.apply_mapping([&lt;/span&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;&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;long&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_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;long&quot;&lt;/span&gt;&lt;span style=&quot;color:#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;&quot;customer_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;long&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;customer_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;long&quot;&lt;/span&gt;&lt;span style=&quot;color:#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;&quot;amount&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 style=&quot;color:#9ECBFF&quot;&gt;&quot;amount&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;decimal(10,2)&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:#E1E4E8&quot;&gt;    (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;created_at&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 style=&quot;color:#9ECBFF&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span style=&quot;color:#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;# Parquet + ZSTD 로 S3 에 저장, 카탈로그도 갱신&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;glueContext.write_dynamic_frame.from_options(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    frame&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;transformed,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    connection_type&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 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;    connection_options&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;        &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;s3://my-lake/orders_curated/&quot;&lt;/span&gt;&lt;span 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;partitionKeys&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;year&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;month&quot;&lt;/span&gt;&lt;span style=&quot;color:#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:#FFAB70&quot;&gt;    format&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;parquet&quot;&lt;/span&gt;&lt;span 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;    format_options&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;compression&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;zstd&quot;&lt;/span&gt;&lt;span style=&quot;color:#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:#E1E4E8&quot;&gt;job.commit()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;job-bookmarks-증분-처리&quot;&gt;Job Bookmarks (증분 처리)&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:#6A737D&quot;&gt;# 활성화 시 이미 처리한 파일/파티션은 건너뜀&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;orders &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; glueContext.create_dynamic_frame.from_catalog(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    database&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sales_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:#FFAB70&quot;&gt;    table_name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;orders_raw&quot;&lt;/span&gt;&lt;span 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;    transformation_ctx&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;orders_source&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# bookmark key&lt;/span&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;Job 설정에서 Bookmark: &lt;code&gt;Enable&lt;/code&gt; -&gt; 재실행 시 새 데이터만.&lt;/p&gt;
&lt;h2 id=&quot;triggers--workflows&quot;&gt;Triggers &amp;#x26; Workflows&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;Trigger&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수동 / 스케줄 (cron) / 이벤트 기반 실행&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Workflow&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;여러 job/crawler 의존성 그래프&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Blueprint&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;재사용 가능한 workflow 템플릿&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;Workflow 예:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Trigger (schedule daily 02:00)&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;  Crawler (S3 raw)&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;  Job (raw → staged Parquet)&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;  Job (staged → curated with joins)&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;  Crawler (curated 카탈로그 갱신)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;큰 오케스트레이션은 [[aws-step-functions|Step Functions]] 또는 MWAA (Managed Airflow) 로.&lt;/p&gt;
&lt;h2 id=&quot;glue-studio&quot;&gt;Glue Studio&lt;/h2&gt;
&lt;p&gt;Visual drag-and-drop ETL 편집기. Source -&gt; Transform -&gt; Target 노드를 잇고 Scala/Python 코드가 자동 생성.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notebook 지원 (Jupyter)&lt;/li&gt;
&lt;li&gt;Git 통합 (GitHub, CodeCommit)&lt;/li&gt;
&lt;li&gt;시각 lineage&lt;/li&gt;
&lt;li&gt;초보자용 + PoC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;한계&lt;/strong&gt;: 실전 프로덕션은 결국 코드로 관리. Studio 는 프로토타입 → 코드 export 흐름.&lt;/p&gt;
&lt;h2 id=&quot;glue-databrew&quot;&gt;Glue DataBrew&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;코드 없는&lt;/em&gt; 데이터 준비 UI. 250+ 사전 정의 변환 (정규화, cleansing, ML feature engineering).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interactive: $1.00 / 30분 세션&lt;/li&gt;
&lt;li&gt;Job: $0.48 / node-hour&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;glue-data-quality&quot;&gt;Glue Data Quality&lt;/h2&gt;
&lt;p&gt;DQDL (Data Quality Definition Language) 로 규칙 정의. 자동 anomaly detection 도 지원 (Glue 3.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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Rules = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ColumnCount = 10,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  RowCount between 1000 and 10000000,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  IsComplete &quot;user_id&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Uniqueness &quot;order_id&quot; &gt; 0.99,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ColumnValues &quot;status&quot; in [&quot;pending&quot;, &quot;paid&quot;, &quot;shipped&quot;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ColumnValues &quot;amount&quot; &gt;= 0&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;&lt;strong&gt;과금&lt;/strong&gt;: &lt;code&gt;$0.44 / DPU-hour&lt;/code&gt;, 최소 2 DPU × 1분.&lt;/p&gt;
&lt;h2 id=&quot;zero-etl-integrations&quot;&gt;Zero-ETL Integrations&lt;/h2&gt;
&lt;p&gt;관리형 CDC 로 [[aws-rds|RDS]]/Aurora/[[dynamodb|DynamoDB]] -&gt; [[aws-redshift|Redshift]] / SageMaker Lakehouse.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;설정 자체는 무과금&lt;/li&gt;
&lt;li&gt;인제스션: 데이터 볼륨 (1 MB 최소 per request)&lt;/li&gt;
&lt;li&gt;Target 컴퓨트: 별도 청구&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자세히: [[aws-redshift#zero-etl-integrations|Redshift Zero-ETL]].&lt;/p&gt;
&lt;h2 id=&quot;glue-elastic-views-deprecated&quot;&gt;Glue Elastic Views (deprecated)&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;사실상 폐지&lt;/em&gt;. Iceberg materialized view (Glue Catalog) 또는 Lake Formation view / [[aws-athena|Athena]] view 로 대체.&lt;/p&gt;
&lt;h2 id=&quot;ray-지원-종료-2026-04-30&quot;&gt;Ray 지원 종료 (2026-04-30)&lt;/h2&gt;
&lt;p&gt;Glue for Ray 는 신규 고객 접수 중단. 기존 고객은 계속 사용 가능. 대체:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;표준 Spark job&lt;/li&gt;
&lt;li&gt;EMR Serverless&lt;/li&gt;
&lt;li&gt;Databricks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;성능--비용-최적화&quot;&gt;성능 &amp;#x26; 비용 최적화&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Flex execution&lt;/strong&gt;: 야간/재처리 배치는 Flex 로 34% 절감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto Scaling&lt;/strong&gt;: 워크로드에 따라 워커 자동 조정 (Glue 3.0+)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Job Bookmark&lt;/strong&gt;: 증분 처리로 재스캔 방지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파티션 프루닝&lt;/strong&gt;: &lt;code&gt;push_down_predicate&lt;/code&gt; 로 필요한 파티션만 read&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파일 포맷&lt;/strong&gt;: [[apache-parquet|Parquet]] / ORC + ZSTD (CSV 대비 10배 이상 절감)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small files compaction&lt;/strong&gt;: [[aws-athena|Athena]] CTAS / Iceberg auto-compact&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;적절한 worker type&lt;/strong&gt;: 대부분 G.1X/G.2X 로 충분. G.8X+ 는 실제 profile 후&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temp directory 정리&lt;/strong&gt;: S3 lifecycle 로 자동 삭제&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;glue-관용-워크플로우&quot;&gt;Glue 관용 워크플로우&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;    subgraph Source&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&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;        S3Raw[(&quot;S3 raw/&quot;)]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Glue[&quot;AWS Glue&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Crawl[&quot;Crawler&amp;#x3C;br/&gt;(schema 자동)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Job[&quot;Spark Job&amp;#x3C;br/&gt;(raw → Parquet)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Cat[(&quot;Data Catalog&quot;)]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Consume[&quot;소비&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Athena[&quot;Athena SQL&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        RS[&quot;Redshift Spectrum&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        SM[&quot;SageMaker&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        BI[&quot;QuickSight&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RDS --&gt; Crawl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3Raw --&gt; Crawl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Crawl --&gt; Cat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3Raw --&gt; Job&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Job --&gt;|&quot;S3 curated Parquet&quot;| S3C[(&quot;S3 curated/&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Job --&gt;|&quot;파티션 등록&quot;| Cat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cat --&gt; Athena&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cat --&gt; RS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cat --&gt; SM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3C --&gt; Athena&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3C --&gt; RS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Athena --&gt; BI&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;DPU 과잉 프로비저닝&lt;/strong&gt;. 큰 워커 (G.8X+) 를 기본으로 잡으면 비용 급증. Auto Scaling 또는 profile 후 조정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Crawler 를 매시간 전체 스캔&lt;/strong&gt; = 파티션이 수천/수만 개인 데이터 레이크에서 요금 폭탄. &lt;code&gt;CRAWL_NEW_FOLDERS_ONLY&lt;/code&gt; 또는 파이프라인이 파티션 직접 등록.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;CSV/JSON 을 Parquet 으로 변환 안 함&lt;/strong&gt; = 다운스트림 ([[aws-athena|Athena]], [[aws-redshift-spectrum|Spectrum]]) 이 매 쿼리마다 10-100배 스캔량. Bronze → Silver → Gold 계층에서 Parquet 로 변환은 사실상 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Job Bookmark 잊음&lt;/strong&gt; = 매 실행마다 전체 데이터 재처리. 증분 처리는 명시적으로 활성화.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Small Files&lt;/strong&gt; 를 그대로 카탈로그에 등록 = [[aws-athena|Athena]]/[[aws-redshift-spectrum|Spectrum]] 성능 붕괴. Job 마지막 단계에서 &lt;code&gt;coalesce()&lt;/code&gt; 또는 Iceberg auto-compact.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Ray job 신규 개발&lt;/strong&gt; = 2026-04-30 이후 접수 안 됨. 신규는 표준 Spark ETL 로.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Glue 2.0 이하 사용&lt;/strong&gt; = 2026-04-01 EOL. Glue 4.0/5.x 로 마이그레이션 (Python 버전, Spark 버전 호환성 사전 검증).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Interactive Session idle&lt;/strong&gt; = DPU 계속 청구. 자동 타임아웃 짧게 (기본 30분 -&gt; 필요 시 조정).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Data Catalog 파티션 수백만 개&lt;/strong&gt; = 요청 요금 + 쿼리 planning 지연. [[aws-athena|Athena]] Partition Projection 로 대체 가능한 경우 고려.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-athena|Athena]] - Glue Catalog 의 최대 소비자&lt;/li&gt;
&lt;li&gt;[[aws-redshift|Redshift]] - Zero-ETL, COPY 소스&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - Glue Catalog external schema&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - 원본/타깃 데이터 저장&lt;/li&gt;
&lt;li&gt;[[aws-s3-glacier|S3 Glacier]] - Glue 처리 후 원본 아카이빙&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - Glue 의 표준 출력 포맷&lt;/li&gt;
&lt;li&gt;[[etl|ETL / ELT]] - Glue 가 담당하는 파이프라인 개념&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - Glue 의 타깃&lt;/li&gt;
&lt;li&gt;[[aws-lambda|Lambda]] - 소규모/이벤트 변환 (Glue 대안)&lt;/li&gt;
&lt;li&gt;[[aws-step-functions|Step Functions]] - Glue 오케스트레이션&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - Glue 실행 role&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>glue</category><category>etl</category><category>data-catalog</category><category>spark</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, 30 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 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;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;AWS Managed&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;User/Group/Role&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS 가 관리 (&lt;code&gt;AmazonS3ReadOnlyAccess&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Customer Managed&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;User/Group/Role&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&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;Inline&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;User/Group/Role&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;직접 임베드 (재사용 X)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Resource-based Policy&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;S3/SQS/KMS/Lambda 등&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&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;Permission Boundary&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;User/Role&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;X (상한만)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Role 이 가질 수 있는 최대&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Service Control Policy (SCP)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Org / OU / Account&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;X (상한만)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;계정 내 principal 최대 권한&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Resource Control Policy (RCP, 2024+)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Org / OU / Account&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;X (상한만)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;계정 내 resource 최대 권한&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Session Policy&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AssumeRole 세션&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;X (상한만)&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;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
권한을 &lt;strong&gt;부여&lt;/strong&gt; 하는 것은 &lt;strong&gt;자격 증명 기반 + 리소스 기반&lt;/strong&gt; 정책뿐. 나머지 (&lt;strong&gt;경계 / SCP / RCP / 세션&lt;/strong&gt;) 는 &lt;strong&gt;상한만&lt;/strong&gt; 정하고 권한을 주지 않음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;권한-평가-알고리즘&quot;&gt;권한 평가 알고리즘&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;① 명시적 Deny 확인 → 있으면 즉시 거부 (short-circuit)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;② RCP (조직 리소스 상한) → 통과해야 함&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;③ SCP (조직 계정 상한) → 통과해야 함&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;⑥ 권한 경계 (Boundary) → 통과해야 함&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;→ 최종: Deny 없고 + 최소 하나의 Allow + 모든 상한 통과 → 허용&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 TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Start[요청] --&gt; Q1{&quot;명시적 Deny?&quot;}&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{&quot;RCP 허용?&quot;}&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{&quot;SCP 허용?&quot;}&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{&quot;리소스/자격 Allow?&quot;}&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;|예| Q5{&quot;Boundary 안?&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q5 --&gt;|아니오| Deny&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q5 --&gt;|예| Q6{&quot;Session 정책 통과?&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q6 --&gt;|아니오| Deny&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q6 --&gt;|예| Allow[ALLOW]&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;명시적 Deny &gt; 명시적 Allow &gt; 암묵적 Deny&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;부여 정책끼리는 합집합 (∪)&lt;/strong&gt;: 자격 증명 + 리소스 기반은 둘 중 하나라도 Allow 면 허용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;상한 정책은 교집합 (∩)&lt;/strong&gt;: SCP · 권한 경계 · 자격 증명 정책 모두 통과해야 실제 허용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;명시적 Deny 는 무엇으로도 못 뒤집는다&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;union-vs-intersection-직관&quot;&gt;Union vs Intersection (직관)&lt;/h2&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;어디든 명시적 Deny 하나면 결과 = Deny&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자세히: [[aws-organizations|AWS Organizations]] SCP/RCP.&lt;/p&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;[[aws-organizations|AWS Organizations]] - SCP/RCP, 다중 계정&lt;/li&gt;
&lt;li&gt;[[aws-sts-assume-role|STS AssumeRole]] - 임시 자격 증명&lt;/li&gt;
&lt;li&gt;[[aws-secrets-manager|Secrets Manager]] - 비밀 관리&lt;/li&gt;
&lt;li&gt;[[aws-systems-manager|Systems Manager]] - Parameter Store, Session Manager&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail|CloudTrail]] - IAM 감사 로그&lt;/li&gt;
&lt;li&gt;[[aws-lake-formation|Lake Formation]] - 데이터 레이크 세분화 권한&lt;/li&gt;
&lt;li&gt;[[aws-kms|KMS]] - 암호화 키 정책&lt;/li&gt;
&lt;li&gt;[[aws-eks|EKS]] (IRSA)&lt;/li&gt;
&lt;li&gt;[[OAuth2]] (비교)&lt;/li&gt;
&lt;li&gt;[[k8s-rbac]] (대조)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>iam</category><category>security</category><category>auth</category><category>cloud</category><category>governance</category><author>koa (김신건)</author></item><item><title>[AWS] Kinesis Data Streams: 실시간 스트리밍 수집</title><link>https://shinkeonkim.com/wiki/cloud/aws-kinesis-data-streams/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-kinesis-data-streams/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Kinesis Data Streams&lt;/strong&gt; (KDS) 는 &lt;em&gt;실시간 스트리밍 데이터를 대규모로 수집/저장하고, 여러 소비자가 각자 실시간 처리/재처리&lt;/em&gt; 할 수 있는 관리형 스트리밍 플랫폼. Apache Kafka 대응 서비스.&lt;/p&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; (레코드 수집 후 ms ~ 수백 ms 소비 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재처리 (replay)&lt;/strong&gt; 가능 (24시간 ~ 365일 보존)&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;kds-vs-data-firehose-큰-그림&quot;&gt;KDS vs Data Firehose 큰 그림&lt;/h2&gt;
&lt;p&gt;한 줄 감각:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KDS&lt;/strong&gt; = “데이터를 강물처럼 흘려두고 여러 앱이 떠서 쓴다” (저장/재처리 O)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[[aws-data-firehose|Firehose]]&lt;/strong&gt; = “데이터를 목적지까지 배달하는 트럭” (저장 X, 배달만)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자세히: [[aws-data-firehose|Amazon Data Firehose]].&lt;/p&gt;
&lt;h2 id=&quot;핵심-개념&quot;&gt;핵심 개념&lt;/h2&gt;
&lt;h3 id=&quot;stream&quot;&gt;Stream&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;이름이 붙은 논리적 채널&lt;/em&gt;. 여러 프로듀서가 write, 여러 컨슈머가 read.&lt;/p&gt;
&lt;h3 id=&quot;shard-프로비저닝-모드&quot;&gt;Shard (프로비저닝 모드)&lt;/h3&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;입력 (Ingress)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1 MB/s 또는 1,000 records/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;출력 (Egress, 클래식)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2 MB/s (모든 소비자 공유)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;출력 (Enhanced Fan-Out)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;소비자마다 전용 2 MB/s&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;record&quot;&gt;Record&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; (최대 1 MiB)&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Producer -&gt; put_records(partition_key=&quot;user_42&quot;, data=b&quot;...&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ↓ hash(partition_key)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;샤드 결정 -&gt; 시퀀스 번호 부여 -&gt; 저장&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;partition-key&quot;&gt;Partition Key&lt;/h3&gt;
&lt;p&gt;같은 파티션 키 = 같은 샤드 = 순서 보장. 잘못 설계하면 &lt;strong&gt;hot shard&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;/li&gt;
&lt;li&gt;균등 분포 (일부 값만 뜨면 hot)&lt;/li&gt;
&lt;li&gt;도메인상 순서가 의미 있는 단위 (user_id, device_id)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;나쁜 예&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;US&quot;&lt;/code&gt; 같은 저카디널리티 (한 샤드에 몰림)&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;provisioned-전통&quot;&gt;Provisioned (전통)&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;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; kinesis&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-stream&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;  --stream-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-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;  --shard-count&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 4&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;&lt;strong&gt;샤드 관리 부담&lt;/strong&gt; (급증 시 수동 resharding)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;on-demand-2021-권장-기본&quot;&gt;On-Demand (2021+, 권장 기본)&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:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kinesis&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-stream&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;  --stream-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-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;  --stream-mode-details&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; StreamMode=ON_DEMAND&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;최대 200 MB/s 자동 확장 (기본), 상한 상향 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;트래픽 예측 불가&lt;/strong&gt; / 급변 시 유리&lt;/li&gt;
&lt;li&gt;비용: 시간 + 데이터당 (예측 가능한 최대치는 provisioned 가 저렴)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;소비자-consumer-방식&quot;&gt;소비자 (Consumer) 방식&lt;/h2&gt;
&lt;h3 id=&quot;classic-shared-throughput&quot;&gt;Classic (Shared Throughput)&lt;/h3&gt;
&lt;p&gt;샤드당 &lt;strong&gt;2 MB/s 를 모든 소비자가 공유&lt;/strong&gt;. &lt;code&gt;GetRecords&lt;/code&gt; 폴링 (기본 1초 간격).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;지연: ~200 ms&lt;/li&gt;
&lt;li&gt;비용: 무료 (샤드 요금에 포함)&lt;/li&gt;
&lt;li&gt;소비자 5개까지 권장 (그 이상은 처리량 부족)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;enhanced-fan-out-efo&quot;&gt;Enhanced Fan-Out (EFO)&lt;/h3&gt;
&lt;p&gt;소비자마다 &lt;strong&gt;전용 2 MB/s + HTTP/2 push&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:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kinesis&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; register-stream-consumer&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;  --stream-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:kinesis:...:stream/my-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;  --consumer-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-consumer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;지연: ~70 ms&lt;/li&gt;
&lt;li&gt;비용: 소비자당 시간 + 데이터당&lt;/li&gt;
&lt;li&gt;소비자 20개까지 (기본)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;적합&lt;/strong&gt;: 소비자 다수 (5개 이상), 저지연 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;보존--재처리&quot;&gt;보존 &amp;#x26; 재처리&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; kinesis&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; increase-stream-retention-period&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;  --stream-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-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;  --retention-period-hours&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 168&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 7일&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;기본&lt;/strong&gt;: 24 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최대&lt;/strong&gt;: 365 일 (추가 비용)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재처리 (Replay)&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;프로듀서-producer-옵션&quot;&gt;프로듀서 (Producer) 옵션&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;AWS SDK&lt;/strong&gt; (&lt;code&gt;PutRecord&lt;/code&gt;, &lt;code&gt;PutRecords&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;strong&gt;KPL&lt;/strong&gt; (Kinesis Producer Library, Java)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;자동 배치, 재시도, 집계 (aggregation)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Kinesis Agent&lt;/strong&gt; (로그 파일 스트리밍)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;파일 tail&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CloudWatch Logs subscription&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;로그 -&gt; KDS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;DynamoDB Streams / DMS&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CDC 소스&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;IoT Rules&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;IoT 데이터&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;소비자-consumer-옵션&quot;&gt;소비자 (Consumer) 옵션&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;KCL&lt;/strong&gt; (Kinesis Client Library)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;다중 소비자 정족수, 체크포인트, resharding 자동&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AWS SDK&lt;/strong&gt; (&lt;code&gt;GetRecords&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;strong&gt;[[aws-lambda|Lambda]]&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;[[aws-kinesis-data-analytics|Managed Flink]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;실시간 SQL/Flink 처리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-data-firehose|Data Firehose]]&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;[[aws-emr|EMR]] / Spark Streaming&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;    subgraph Producers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Web[웹앱 이벤트]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Mob[모바일 이벤트]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        IoT[IoT 디바이스]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        DB[&quot;DynamoDB Streams / DMS&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Producers --&gt;|&quot;PutRecords&quot;| KDS[&quot;Kinesis Data Streams&amp;#x3C;br/&gt;(4 샤드 or On-demand)&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;    subgraph Consumers[&quot;동시 소비자&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        C1[&quot;Lambda&amp;#x3C;br/&gt;(실시간 alert)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        C2[&quot;Managed Flink&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;        C3[&quot;Data Firehose&amp;#x3C;br/&gt;(S3 적재)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        C4[&quot;KCL 애플리케이션&amp;#x3C;br/&gt;(ML feature)&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    KDS --&gt; C1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    KDS --&gt; C2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    KDS --&gt; C3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    KDS --&gt; C4&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;    C3 --&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;    C2 --&gt; S3&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;Provisioned&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;샤드-시간: ~$0.015 / shard-hour&lt;/li&gt;
&lt;li&gt;PUT payload: $0.014 / 1M units (25 KB 단위)&lt;/li&gt;
&lt;li&gt;확장 보존: $0.020 / shard-hour × extra hours&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;On-Demand&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;스트림-시간: ~$0.04 / stream-hour&lt;/li&gt;
&lt;li&gt;Write: $0.08 / GB&lt;/li&gt;
&lt;li&gt;Read: $0.04 / GB&lt;/li&gt;
&lt;li&gt;보존 확장: 별도&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Enhanced Fan-Out&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;소비자-시간: ~$0.015 / consumer-shard-hour&lt;/li&gt;
&lt;li&gt;Data: $0.013 / GB&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;resharding-샤드-분할병합&quot;&gt;Resharding (샤드 분할/병합)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Split&lt;/strong&gt; (트래픽 증가): 1 샤드 -&gt; 2 샤드
&lt;strong&gt;Merge&lt;/strong&gt; (트래픽 감소): 2 샤드 -&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; kinesis&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; split-shard&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;  --stream-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-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;  --shard-to-split&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; shardId-0001&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;  --new-starting-hash-key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;170141183460469231731687303715884105728&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;프로비저닝 모드만 필요 (on-demand 는 자동)&lt;/li&gt;
&lt;li&gt;24시간 안에 여러 번 하면 API 제한&lt;/li&gt;
&lt;li&gt;KCL 은 자동 감지&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;여러 앱이 실시간 스트림을 각자 처리 + 재처리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;KDS&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;스트림을 S3/Redshift/OpenSearch 에 코드 없이 적재&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-data-firehose|Data Firehose]]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Apache Kafka 그대로 관리형&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Amazon MSK&lt;/strong&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;strong&gt;[[aws-sqs|SQS]]&lt;/strong&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;strong&gt;[[aws-sns|SNS]]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;AWS 이벤트 규칙 라우팅 + cron&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-eventbridge|EventBridge]]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;실시간 SQL / Flink 처리&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-kinesis-data-analytics|Managed Flink]]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;성능-튜닝&quot;&gt;성능 튜닝&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;파티션 키 카디널리티&lt;/strong&gt; - hot shard 방지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PutRecords 배치&lt;/strong&gt; - &lt;code&gt;PutRecord&lt;/code&gt; 대신 batch (최대 500)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KPL aggregation&lt;/strong&gt; - 여러 사용자 레코드를 하나의 Kinesis 레코드로 (14x 처리량)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Fan-Out&lt;/strong&gt; - 소비자 5+ 개면&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KCL 사용&lt;/strong&gt; - resharding 자동, 체크포인트 관리&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;파티션 키 설계 실수&lt;/strong&gt; = hot shard = throttling. 카디널리티 충분 + 균등 분포 확인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Enhanced Fan-Out 없이 소비자 5개 이상&lt;/strong&gt; = 처리량 나눠 갖기 -&gt; 각자 400 KB/s. EFO 로 소비자당 2 MB/s 보장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;&lt;code&gt;GetRecords&lt;/code&gt; 를 초당 5회 초과&lt;/strong&gt; = throttling. 이터레이터 나이 (&lt;code&gt;IteratorAgeMilliseconds&lt;/code&gt;) 지표로 감지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;On-Demand 는 편하지만 비쌈&lt;/strong&gt;. 트래픽이 예측 가능하고 지속적이면 Provisioned 가 저렴.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Kinesis 를 SQS 처럼&lt;/strong&gt; 쓰지 말 것. 순서/재처리 필요 없고 큐 semantics 만 원하면 [[aws-sqs|SQS]] 가 저렴.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;레코드 최대 1 MiB&lt;/strong&gt;. 초과 시 여러 레코드로 분할 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;&lt;code&gt;Kinesis Data Analytics for SQL Applications&lt;/code&gt; 는 2026-01-27 종료&lt;/strong&gt;. 신규는 [[aws-kinesis-data-analytics|Managed Service for Apache Flink]].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-data-firehose|Amazon Data Firehose]] - 자동 적재 (KDS 를 소스로)&lt;/li&gt;
&lt;li&gt;[[aws-kinesis-data-analytics|Managed Service for Apache Flink]] - 실시간 처리&lt;/li&gt;
&lt;li&gt;[[aws-lambda|AWS Lambda]] - 이벤트 소스 매핑 소비자&lt;/li&gt;
&lt;li&gt;[[aws-sqs|SQS]] - 큐 대안&lt;/li&gt;
&lt;li&gt;[[aws-sns|SNS]] - Pub/Sub 대안&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge|EventBridge]] - 이벤트 라우팅&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - 대표 적재 대상&lt;/li&gt;
&lt;li&gt;[[aws-redshift|Redshift]] - Streaming Ingestion 소스&lt;/li&gt;
&lt;li&gt;[[etl|ETL]] - 스트리밍 파이프라인 개념&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>kinesis</category><category>streaming</category><category>real-time</category><category>ingestion</category><author>koa (김신건)</author></item><item><title>[AWS] Lake Formation Data Filter: 행/셀 수준 보안</title><link>https://shinkeonkim.com/wiki/cloud/aws-lake-formation-data-filter/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-lake-formation-data-filter/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lake Formation Data Filter&lt;/strong&gt; 는 &lt;em&gt;[[aws-lake-formation|Lake Formation]] 이 관리하는 테이블에 대해 행 (row) / 셀 (cell) 수준의 접근 제어를 정의하는 리소스&lt;/em&gt;. IAM 정책이나 버킷 정책만으로는 표현 불가능한 &lt;em&gt;“같은 테이블에 대해 사용자별로 다른 row / 다른 column 만 보이게” 하는&lt;/em&gt; 세밀한 제어를 SQL 없이 선언적으로 표현한다.&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-iam|IAM]]&lt;/strong&gt;: 리소스 (버킷/테이블) 단위 접근&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lake Formation 기본 권한&lt;/strong&gt;: 데이터베이스 / 테이블 / 컬럼 단위&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Filter&lt;/strong&gt;: &lt;strong&gt;row + column 조합 (cell)&lt;/strong&gt; 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-단계-보안-계층&quot;&gt;3 단계 보안 계층&lt;/h2&gt;
&lt;p&gt;Lake Formation 의 데이터 필터링은 3 단계로 구성된다.&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 TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Query[&quot;SELECT * FROM sales.orders&amp;#x3C;br/&gt;WHERE order_date &gt; &apos;2026-01-01&apos;&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;    Query --&gt; C[&quot;Column-level&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;    C --&gt; R[&quot;Row-level&amp;#x3C;br/&gt;(RowFilter 표현식으로 조건 필터)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    R --&gt; Cell[&quot;Cell-level&amp;#x3C;br/&gt;(Row + Column 조합)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Cell --&gt; Result[&quot;최종 결과&amp;#x3C;br/&gt;(사용자에게 반환)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;1-column-level-security&quot;&gt;1. Column-level Security&lt;/h3&gt;
&lt;p&gt;특정 컬럼만 SELECT 가능하도록. 나머지는 반환에서 제외.&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;Table orders (order_id, user_id, amount, ssn, credit_card, region)&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;Analyst-Marketing 그룹 :&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  SELECT 가능 컬럼: [order_id, user_id, amount, region]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  숨김: [ssn, credit_card]&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;SELECT * -&gt; SELECT order_id, user_id, amount, region 로 자동 변환&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SELECT ssn FROM orders -&gt; permission denied&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-row-level-security&quot;&gt;2. Row-level Security&lt;/h3&gt;
&lt;p&gt;WHERE 조건과 유사한 필터 표현식으로 특정 row 만 반환.&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;Data Filter &quot;region-korea-only&quot;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Table: orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  RowFilter: &quot;region = &apos;KR&apos;&quot;&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;Analyst-Korea 그룹 :&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  SELECT * FROM orders 실행 시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  실제 실행 = SELECT * FROM orders WHERE region = &apos;KR&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-cell-level-security&quot;&gt;3. Cell-level Security&lt;/h3&gt;
&lt;p&gt;Row filter + Column filter 결합. &lt;strong&gt;다른 row 에 대해 다른 컬럼도 숨김&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;Data Filter &quot;hr-own-region&quot;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  RowFilter: &quot;region = &apos;KR&apos;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ColumnWildcard: ExcludedColumnNames = [&apos;salary&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;Analyst-Korea 그룹 :&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  KR row 는 salary 제외한 모든 컬럼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  다른 region row 는 아예 안 보임&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;data-filter-정의-구조&quot;&gt;Data Filter 정의 구조&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CreateDataCellsFilter&lt;/code&gt; API 또는 콘솔로 정의.&lt;/p&gt;
&lt;h3 id=&quot;json-스펙&quot;&gt;JSON 스펙&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;TableData&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;TableCatalogId&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;111122223333&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;DatabaseName&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sales&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;TableName&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;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;restrict-korea-non-pii&quot;&lt;/span&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;    &quot;RowFilter&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;FilterExpression&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;region = &apos;KR&apos; AND status = &apos;completed&apos;&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:#79B8FF&quot;&gt;    &quot;ColumnWildcard&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;ExcludedColumnNames&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ssn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;credit_card&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;phone&quot;&lt;/span&gt;&lt;span style=&quot;color:#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;strong&gt;&lt;code&gt;Name&lt;/code&gt;&lt;/strong&gt;: 필터 식별자 (테이블당 고유)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;RowFilter.FilterExpression&lt;/code&gt;&lt;/strong&gt;: PartiQL 스타일 WHERE 표현식&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ColumnWildcard&lt;/code&gt;&lt;/strong&gt;: 컬럼 포함/제외 방식&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ColumnNames&lt;/code&gt;&lt;/strong&gt;: 명시적 포함 목록 (없으면 wildcard 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;컬럼-지정-방식-셋-중-하나-선택&quot;&gt;컬럼 지정 방식 (셋 중 하나 선택)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;방식 1: 명시적 포함 (allowlist)&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:#9ECBFF&quot;&gt;&quot;ColumnNames&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_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;amount&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_date&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;p&gt;&lt;strong&gt;방식 2: Wildcard + 제외 (denylist)&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:#9ECBFF&quot;&gt;&quot;ColumnWildcard&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;ExcludedColumnNames&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ssn&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;credit_card&quot;&lt;/span&gt;&lt;span style=&quot;color:#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;/p&gt;
&lt;p&gt;&lt;strong&gt;방식 3: Wildcard 만 (모든 컬럼)&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:#9ECBFF&quot;&gt;&quot;ColumnWildcard&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;모든 컬럼 보임 (row filter 만 적용).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;[[aws-athena|Athena]] / [[aws-redshift-spectrum|Spectrum]] 는 명시적 포함 (&lt;code&gt;ColumnNames&lt;/code&gt;) 만 지원&lt;/strong&gt;. 제외 방식은 [[aws-emr|EMR]] Spark / Trino 에서만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;rowfilter-표현식&quot;&gt;RowFilter 표현식&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PartiQL 기반 WHERE 스타일&lt;/strong&gt; 표현식.&lt;/p&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;strong&gt;비교&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;=&lt;/code&gt;, &lt;code&gt;&amp;#x3C;&gt;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;&lt;/code&gt;, &lt;code&gt;&gt;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;=&lt;/code&gt;, &lt;code&gt;&gt;=&lt;/code&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;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt;, &lt;code&gt;NOT&lt;/code&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;code&gt;IN (...)&lt;/code&gt;, &lt;code&gt;NOT IN (...)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;NULL&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;IS NULL&lt;/code&gt;, &lt;code&gt;IS NOT NULL&lt;/code&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;code&gt;LIKE&lt;/code&gt;, &lt;code&gt;NOT LIKE&lt;/code&gt; (일부 엔진)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;BETWEEN&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;BETWEEN x AND y&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;sql&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:#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; &apos;KR&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;-- AND / OR&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; &apos;KR&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; order_amount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- IN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;country &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;IN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;KR&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;JP&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&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:#6A737D&quot;&gt;-- 복합&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(department &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;HR&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; access_level &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&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:#F97583&quot;&gt;OR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (department &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;Finance&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; CURRENT_USER &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;auditor&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;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; (SUM, COUNT)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JOIN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User-defined function&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉 &lt;strong&gt;행 자체의 값&lt;/strong&gt; 만 참조 가능. 다른 테이블/사용자 정보와 조합은 안 됨.&lt;/p&gt;
&lt;h2 id=&quot;named-data-filter-vs-inline&quot;&gt;Named Data Filter vs Inline&lt;/h2&gt;
&lt;h3 id=&quot;named-재사용-가능-표준&quot;&gt;Named (재사용 가능, 표준)&lt;/h3&gt;
&lt;p&gt;콘솔 / API 로 생성 후, permission grant 시 참조.&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;1. CreateDataCellsFilter(&quot;restrict-korea&quot;, ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. Grant SELECT ON DATA FILTER &quot;restrict-korea&quot; TO ROLE &quot;Korea-Analyst&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;/li&gt;
&lt;li&gt;이름으로 감사 추적 쉬움&lt;/li&gt;
&lt;li&gt;변경 시 한 곳만 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;inline-permission-안에-직접&quot;&gt;Inline (Permission 안에 직접)&lt;/h3&gt;
&lt;p&gt;Permission 생성 시 필터를 직접 정의.&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;Grant SELECT ON TABLE orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  WITH ROW FILTER &quot;region = &apos;KR&apos;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  WITH COLUMN EXCLUDES [&quot;ssn&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  TO ROLE &quot;Korea-Analyst&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;p&gt;&lt;strong&gt;권장&lt;/strong&gt;: &lt;strong&gt;Named data filter&lt;/strong&gt; 사용.&lt;/p&gt;
&lt;h2 id=&quot;grant--revoke-구문&quot;&gt;Grant / Revoke 구문&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- Athena / Lake Formation SQL 스타일 (콘솔에서 관리)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;GRANT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SELECT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ON&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; DATA&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FILTER&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;restrict-korea&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  TO&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; PRINCIPAL &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:iam::111122223333:role/KoreaAnalyst&quot;&lt;/span&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;REVOKE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SELECT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ON&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; DATA&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FILTER&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;restrict-korea&quot;&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; PRINCIPAL &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;arn:aws:iam::111122223333:role/KoreaAnalyst&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;CLI:&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; lakeformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; grant-permissions&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;  --principal&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DataLakePrincipalIdentifier=arn:aws:iam::...:role/KoreaAnalyst&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&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;DataCellsFilter&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;TableCatalogId&quot;: &quot;111122223333&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;DatabaseName&quot;: &quot;sales&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;TableName&quot;: &quot;orders&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;Name&quot;: &quot;restrict-korea&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 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;  --permissions&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; SELECT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cross-account-data-filter&quot;&gt;Cross-Account Data Filter&lt;/h2&gt;
&lt;p&gt;Producer 계정의 테이블을 Consumer 계정에 필터 적용해 공유.&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;    subgraph Producer[&quot;Producer 111122223333&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        T[(&quot;orders 테이블&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        F[&quot;Data Filter&amp;#x3C;br/&gt;&apos;restrict-korea&apos;&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Consumer[&quot;Consumer 555566667777&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        RL[&quot;Resource Link&amp;#x3C;br/&gt;-&gt; orders&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Q[&quot;Athena 쿼리&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    F -.-&gt; T&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    T --&gt;|&quot;Grant + LF-Tag&quot;| RL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    RL --&gt; Q&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;    Note1[&quot;Producer 필터가&amp;#x3C;br/&gt;Consumer 쿼리에도 적용&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Producer 가 Grant → Consumer 가 AWS RAM 초대 수락 → Resource Link 생성&lt;/li&gt;
&lt;li&gt;Consumer 가 쿼리하면 Producer 의 data filter 자동 적용&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;Row Filter&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Column 포함&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Column 제외&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Nested 컬럼&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;[[aws-athena|Athena]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-redshift-spectrum|Redshift Spectrum]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-emr|EMR]] Spark&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-emr|EMR]] Trino&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-glue|Glue]] ETL&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;부분 (엔진에 따름)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&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;QuickSight&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O (엔진 통해서)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&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;Athena / Spectrum 은 컬럼 제외 방식 X&lt;/strong&gt;. &lt;code&gt;ExcludedColumnNames&lt;/code&gt; 를 쓰려면 EMR (Spark / Trino) 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;성능-영향&quot;&gt;성능 영향&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Predicate pushdown&lt;/strong&gt;: 파티션 컬럼이 row filter 에 있으면 파티션 프루닝 유지 -&gt; 성능 영향 미미&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-partition 컬럼 필터&lt;/strong&gt;: 전체 스캔 후 필터 적용 -&gt; 원본 쿼리와 비슷한 비용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Column filter&lt;/strong&gt;: 실제 read 컬럼 감소 -&gt; 오히려 빠를 수 있음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nested 컬럼&lt;/strong&gt;: 필터 평가 오버헤드 발생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파티션 컬럼을 row filter 에 자주 활용&lt;/li&gt;
&lt;li&gt;컬럼 수 감소로 read 최소화 유도&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-예제&quot;&gt;실전 예제&lt;/h2&gt;
&lt;h3 id=&quot;예-1-지역별-데이터-격리&quot;&gt;예 1: 지역별 데이터 격리&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;Filter &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;KR-Analysts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Table: sales.orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  RowFilter: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;country = &apos;KR&apos;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ColumnWildcard: {}   &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:#E1E4E8&quot;&gt;Filter &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;JP-Analysts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Table: sales.orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  RowFilter: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;country = &apos;JP&apos;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ColumnWildcard: {}&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;Grant SELECT ON &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;KR-Analysts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TO Group(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;korea-team&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Grant SELECT ON &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;JP-Analysts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TO Group(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;japan-team&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;각 팀은 자기 지역 order 만 조회.&lt;/p&gt;
&lt;h3 id=&quot;예-2-pii-컬럼-마스킹&quot;&gt;예 2: PII 컬럼 마스킹&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;Filter &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;customers-non-pii&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Table: sales.customers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  RowFilter: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   // 모든 row&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ColumnNames: [&lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;customer_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;country&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;signup_date&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;plan&lt;/span&gt;&lt;span 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;  // ssn, credit_card, phone, email 제외&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;일반 애널리스트는 PII 없는 뷰만 볼 수 있음.&lt;/p&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;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Filter &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;hr-conditional-salary&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Table: hr.employees&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  RowFilter: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;department IN (&apos;engineering&apos;, &apos;sales&apos;)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ColumnWildcard:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ExcludedColumnNames: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;salary&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;bonus&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 일반 접근 시 급여 X&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;Filter &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;hr-full&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  RowFilter: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ColumnWildcard: {}   &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:#E1E4E8&quot;&gt;Grant &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;hr-conditional-salary&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TO Group(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;hr-analyst&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Grant &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;hr-full&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TO Group(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;hr-manager&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;감사--로깅&quot;&gt;감사 &amp;#x26; 로깅&lt;/h2&gt;
&lt;p&gt;Data filter 적용 여부는 [[aws-cloudtrail|CloudTrail]] 이벤트로 기록:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetTemporaryTableCredentials&lt;/code&gt; (엔진이 자격증명 요청)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetDataAccess&lt;/code&gt; (실제 데이터 접근)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Athena / Spectrum 쿼리 로그와 결합해 &lt;em&gt;누가 언제 어떤 필터로 접근했는지&lt;/em&gt; 감사 가능.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;&lt;code&gt;ExcludedColumnNames&lt;/code&gt; 는 Athena/Spectrum 미지원&lt;/strong&gt;. 이 두 엔진 사용 시 필터를 &lt;code&gt;ColumnNames&lt;/code&gt; (allowlist) 로 다시 작성해야 함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;RowFilter 는 서브쿼리 / JOIN 불가&lt;/strong&gt;. 다른 테이블의 사용자 매핑 (&lt;code&gt;WHERE user = current_user&lt;/code&gt;) 은 안 됨. 매핑 테이블을 dimension 으로 join 해서 필터링해야 하면 view 로 우회.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;파티션 컬럼 필터로 pushdown&lt;/strong&gt;. 파티션 아닌 컬럼 필터는 전체 스캔 후 필터라 스캔 비용 그대로. 파티션 설계와 함께 고려.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;테이블당 filter 이름 unique&lt;/strong&gt;. 대량 관리 시 이름 규약 (e.g., &lt;code&gt;{table}-{persona}&lt;/code&gt;) 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;[[aws-iam|IAM]] 정책이 SELECT 를 이미 거부&lt;/strong&gt; 하면 Lake Formation 이 GRANT 해도 접근 불가. IAM 은 통과 + LF grant 둘 다 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Data filter 로 컬럼 숨겨도 [[aws-s3|S3]] 직접 접근은 우회 가능&lt;/strong&gt;. S3 위치를 Lake Formation 에 등록해 임시 자격증명 vending 강제.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;NULL vs empty&lt;/strong&gt;. &lt;code&gt;region = &apos;KR&apos;&lt;/code&gt; 은 region 이 NULL 인 row 도 제외. &lt;code&gt;region IS NULL OR region = &apos;KR&apos;&lt;/code&gt; 로 명시.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Nested (STRUCT) 컬럼 접근&lt;/strong&gt; 은 엔진별 지원 다름. Spark / Trino 는 nested 필드 필터 O, 일부는 X.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-lake-formation|AWS Lake Formation]] - 상위 서비스&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - 상호작용&lt;/li&gt;
&lt;li&gt;[[aws-athena|Amazon Athena]] - 대표 소비 엔진&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - Spectrum 도 준수&lt;/li&gt;
&lt;li&gt;[[aws-emr|EMR]] - Spark/Trino 소비&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - Data Catalog&lt;/li&gt;
&lt;li&gt;[[aws-s3|AWS S3]] - underlying storage&lt;/li&gt;
&lt;li&gt;[[data-lake|Data Lake]] - 상위 개념&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail|CloudTrail]] - 감사&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>lake-formation</category><category>security</category><category>data-lake</category><category>governance</category><author>koa (김신건)</author></item><item><title>[AWS] Lake Formation: Data Lake 거버넌스</title><link>https://shinkeonkim.com/wiki/cloud/aws-lake-formation/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-lake-formation/</guid><pubDate>Thu, 30 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 Lake Formation&lt;/strong&gt; (LF) 은 &lt;em&gt;[[data-lake|데이터 레이크]] 의 세분화된 접근 제어 + 거버넌스를 중앙에서 관리&lt;/em&gt; 하는 서비스. [[aws-glue|Glue Data Catalog]] 위에 얹혀 데이터베이스/테이블/컬럼/row/cell 단위 권한을 [[aws-iam|IAM]] 정책 대신 LF 만의 표준으로 표현.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: [[aws-iam|IAM]] 만으로는 컬럼/row 단위 제어가 어려움 -&gt; LF 로 대체.&lt;/p&gt;
&lt;h2 id=&quot;왜-lake-formation&quot;&gt;왜 Lake Formation&lt;/h2&gt;
&lt;p&gt;[[aws-s3|S3]] + [[aws-glue|Glue]] + [[aws-athena|Athena]] 만으로 데이터 레이크를 구성하면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[[aws-iam|IAM]] 정책&lt;/strong&gt; 이 유일한 접근 제어 -&gt; 버킷/prefix 단위밖에 안 됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컬럼 단위&lt;/strong&gt; 접근 제어 어려움 (PII 컬럼만 숨기기)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;row 단위&lt;/strong&gt; 필터 없음 (지역별 데이터 격리)&lt;/li&gt;
&lt;li&gt;여러 계정에 걸친 공유가 복잡&lt;/li&gt;
&lt;li&gt;감사가 서비스별로 분산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Lake Formation 이 답&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;테이블/컬럼/row/cell&lt;/strong&gt; 단위 권한&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LF-Tags&lt;/strong&gt; 로 태그 기반 액세스 제어 (RBAC 대신 ABAC)&lt;/li&gt;
&lt;li&gt;Cross-account 공유 표준화&lt;/li&gt;
&lt;li&gt;[[aws-athena|Athena]], [[aws-redshift-spectrum|Spectrum]], [[aws-emr|EMR]], Spark 모두 동일 권한&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;    S3[(&quot;S3 Data Lake&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;    subgraph LF[&quot;Lake Formation&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Catalog[(&quot;Glue Data Catalog&amp;#x3C;br/&gt;databases/tables&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Perms[&quot;Permissions&amp;#x3C;br/&gt;(DB/Table/Column/Row/Cell)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Tags[&quot;LF-Tags&amp;#x3C;br/&gt;(Tag-Based Access)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        LFAdmin[&quot;Lake Formation Administrator&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3 -.-&gt;|&quot;위치 등록&quot;| Catalog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    LFAdmin --&gt;|&quot;설정&quot;| Perms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    LFAdmin --&gt; Tags&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Tags -.-&gt; Perms&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;    Perms --&gt; Enforce[&quot;권한 검사 (모든 엔진)&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;    Enforce --&gt; Athena[Athena]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Enforce --&gt; Spectrum[Redshift Spectrum]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Enforce --&gt; EMR[EMR Spark/Presto]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Enforce --&gt; Glue[Glue ETL]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Enforce --&gt; QS[QuickSight]&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;    IAM[IAM Policy] -.-&gt;|&quot;기본 통과 후&amp;#x3C;br/&gt;LF 검사&quot;| Enforce&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;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CREATE_TABLE, ALTER, DROP, DESCRIBE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Table&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SELECT, INSERT, DELETE, ALTER, DROP, DESCRIBE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Column&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SELECT (특정 컬럼만)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Row&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SELECT (filter expression)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Cell&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SELECT (row × column 조합)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Data Location&lt;/strong&gt; (S3 prefix)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DATA_LOCATION_ACCESS&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;lf-tags-tag-based-access-control-tbac&quot;&gt;LF-Tags (Tag-Based Access Control, TBAC)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;RBAC (역할 기반)&lt;/strong&gt; 대신 &lt;strong&gt;ABAC (속성 기반)&lt;/strong&gt;. 태그로 리소스와 사용자를 매칭.&lt;/p&gt;
&lt;h3 id=&quot;예-pii--부서별-접근&quot;&gt;예: PII / 부서별 접근&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;1. LF-Tag 정의&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Key: classification&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Values: [public, internal, pii]&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;   Key: department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Values: [finance, hr, marketing]&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;2. 리소스에 태그&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Database &quot;sales&quot;      -&gt; department=finance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Table   &quot;customers&quot;   -&gt; classification=pii&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Column  &quot;email&quot;       -&gt; classification=pii&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;3. 사용자에 정책&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   Analyst-Finance 그룹:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     GRANT SELECT ON LF-Tags: department=finance AND classification!=pii&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 Analyst-Finance 는 finance DB 의 non-PII 컬럼만 SELECT 가능.&lt;/p&gt;
&lt;h3 id=&quot;왜-lf-tags-인가&quot;&gt;왜 LF-Tags 인가&lt;/h3&gt;
&lt;p&gt;수백 개 테이블 × 수십 개 그룹 = 조합 폭발. 태그 기반이면 &lt;strong&gt;정책 수 = 태그 수&lt;/strong&gt; 로 유지.&lt;/p&gt;
&lt;h2 id=&quot;컬럼--row--cell-필터&quot;&gt;컬럼 / Row / Cell 필터&lt;/h2&gt;
&lt;h3 id=&quot;column-level-filter&quot;&gt;Column-Level Filter&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Table: customers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Grant SELECT on columns: [customer_id, name, country]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     Excluding: [ssn, birthdate, phone]  # PII 은닉&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;row-level-filter-data-cells-filter&quot;&gt;Row-Level Filter (Data Cells Filter)&lt;/h3&gt;
&lt;p&gt;WHERE 조건으로 row 필터.&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;Filter: &quot;region-korea-only&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  DatabaseName: sales&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  TableName: orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  RowFilter: &quot;country = &apos;KR&apos;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ColumnWildcard: [&quot;*&quot;]  # 모든 컬럼&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;Grant SELECT ON DataFilter &quot;region-korea-only&quot; TO group &quot;Korea-Analysts&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Korea-Analysts 는 &lt;code&gt;orders&lt;/code&gt; 를 SELECT 해도 &lt;code&gt;country=&apos;KR&apos;&lt;/code&gt; row 만 보임.&lt;/p&gt;
&lt;h3 id=&quot;cell-level-filter&quot;&gt;Cell-Level Filter&lt;/h3&gt;
&lt;p&gt;Row + Column 결합. 다른 컬럼도 함께 제한.&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;Filter: &quot;hr-own-region&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  RowFilter: &quot;region = current_user_region()&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ColumnWildcard:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ExcludedColumnNames: [&quot;salary&quot;]  # region 이 자기 것이 아니면 salary 안 보임&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;lake-formation-vs-iam&quot;&gt;Lake Formation vs IAM&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;[[aws-iam|IAM]]&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Lake Formation&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;버킷/prefix&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DB/Table/Column/Row/Cell&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;JSON 정책&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;LF-Tags + 관계 모델&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;AWS 서비스 개별&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Athena/Spectrum/EMR/Glue 통일&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;PII 관리&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;CloudTrail 서비스별&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;IAM 통과 후 LF 재검사&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;우선순위&lt;/strong&gt;: LF 가 켜진 리소스는 &lt;strong&gt;LF 권한이 IAM 을 오버라이드&lt;/strong&gt;. IAM 이 SELECT 를 허용해도 LF 에서 안 하면 접근 불가.&lt;/p&gt;
&lt;h2 id=&quot;blueprints-워크플로&quot;&gt;Blueprints (워크플로)&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;deprecated 방향&lt;/em&gt;. 데이터 소스 (JDBC, S3) 를 catalog 로 로드하는 사전 정의 워크플로. 신규는 [[aws-glue|Glue]] 직접 사용 권장.&lt;/p&gt;
&lt;h2 id=&quot;데이터-위치-등록&quot;&gt;데이터 위치 등록&lt;/h2&gt;
&lt;p&gt;Lake Formation 이 관리할 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;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; lakeformation&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; register-resource&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-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:s3:::my-lake/analytics/&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;  --use-service-linked-role&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;등록된 위치의 S3 GET 은 LF 가 vending 하는 임시 자격 증명으로 수행&lt;/li&gt;
&lt;li&gt;사용자가 직접 S3 API 를 호출해도 LF 권한 우회 불가 (프리셋)&lt;/li&gt;
&lt;/ul&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Producer Account (data owner)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   |  GRANT SELECT ON table1 TO Consumer Account&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;Consumer Account (data consumer)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   |  RAM 초대 수락 -&gt; Local resource link 생성&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;   Athena / Spectrum 에서 LOCAL 로 쿼리&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS RAM&lt;/strong&gt; 통합&lt;/li&gt;
&lt;li&gt;LF-Tags 도 cross-account 로 전파&lt;/li&gt;
&lt;li&gt;데이터 복사 없이 논리적 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;관리-역할-administrator&quot;&gt;관리 역할 (Administrator)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lake Formation Admin&lt;/strong&gt;: LF 자체 설정, 다른 사용자에게 권한 부여 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Lake Admin&lt;/strong&gt;: Data catalog / underlying storage 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read-Only Admin&lt;/strong&gt;: 감사 목적&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lf-활성화-절차&quot;&gt;LF 활성화 절차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Lake Formation Administrator 지정&lt;/li&gt;
&lt;li&gt;기존 [[aws-glue|Glue Data Catalog]] 를 LF 로 마이그레이션 (&lt;code&gt;OnlyIAMSettings&lt;/code&gt; -&gt; Mixed 또는 LF 만)&lt;/li&gt;
&lt;li&gt;Data Location 등록&lt;/li&gt;
&lt;li&gt;LF-Tags 정의 및 리소스에 부여&lt;/li&gt;
&lt;li&gt;그룹/사용자에 GRANT&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IAMAllowedPrincipals&lt;/code&gt; (default 우회) 제거&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;중요&lt;/strong&gt;: LF 를 활성화하지 않은 계정에서 기존 IAM 만 사용해도 되지만, 새 프로젝트는 처음부터 LF 로.&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;LF 지원&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;[[aws-athena|Athena]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;완전 지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Column/Row/Cell 필터 자동 적용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-redshift-spectrum|Redshift Spectrum]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;완전 지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;LF-Tags 인식&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-emr|EMR]] Spark/Presto&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EMR 6.7+ (Trino), Spark 3.3+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-glue|Glue Spark]] ETL&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Job role 이 LF 권한 필요&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;QuickSight&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Author 가 LF 권한&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;최근-업데이트-2024-2026&quot;&gt;최근 업데이트 (2024-2026)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nested column filtering&lt;/strong&gt;: struct 안의 필드 단위 컬럼 제어&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iceberg 완전 지원&lt;/strong&gt; (v1.10+)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data cell 확장&lt;/strong&gt;: 복잡한 row filter 표현식&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RCP 통합&lt;/strong&gt; ([[aws-organizations|Organizations]] RCP 와 결합)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lake Formation 자체는 무료&lt;/strong&gt;. 다음이 요금:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-glue|Glue Data Catalog]] (요청, 저장)&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] (저장, 요청)&lt;/li&gt;
&lt;li&gt;엔진 ([[aws-athena|Athena]] 스캔, [[aws-emr|EMR]] 인스턴스 등)&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;LF 활성화 후 &lt;code&gt;IAMAllowedPrincipals&lt;/code&gt; 를 계속 두면&lt;/strong&gt; = IAM 이 계속 오버라이드 = LF 권한 무의미. 반드시 제거.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;테이블 위치 (S3) 를 LF 에 등록 안 하면&lt;/strong&gt; = 사용자가 [[aws-s3|S3]] API 로 직접 접근해 LF 우회. 반드시 등록.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;엔진 버전 확인&lt;/strong&gt;. [[aws-emr|EMR]] / [[aws-athena|Athena]] 가 오래된 버전이면 컬럼/row 필터 미지원.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;[[aws-iam|IAM]] 정책과 LF 는 AND&lt;/strong&gt;. 둘 다 통과해야 접근. IAM 이 이미 DENY 하면 LF 가 GRANT 해도 소용없음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Cross-account share 는 AWS RAM 초대 수락 필요&lt;/strong&gt;. Consumer 가 수락 안 하면 안 보임.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;LF-Tags 조합 폭발&lt;/strong&gt;. 태그 key 개수 × values 개수 x 리소스 = 관리 부담. 4-6개 key 로 절제.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Data Cells Filter 는 성능 영향 있음&lt;/strong&gt;. 매 쿼리마다 필터 평가. 큰 팩트 테이블에는 partitioning + filter 결합.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[data-lake|Data Lake]] - 거버넌스 대상&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - Data Catalog&lt;/li&gt;
&lt;li&gt;[[aws-athena|Athena]] - 주요 소비 엔진&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - Spectrum 도 LF 준수&lt;/li&gt;
&lt;li&gt;[[aws-emr|EMR]] - Spark/Trino 소비&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - underlying storage&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - 상호작용&lt;/li&gt;
&lt;li&gt;AWS RAM - cross-account 공유&lt;/li&gt;
&lt;li&gt;[[aws-organizations|Organizations]] - RCP 결합&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>lake-formation</category><category>governance</category><category>security</category><category>data-lake</category><author>koa (김신건)</author></item><item><title>[AWS] Managed Service for Apache Flink (구 Kinesis Data Analytics)</title><link>https://shinkeonkim.com/wiki/cloud/aws-kinesis-data-analytics/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-kinesis-data-analytics/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Managed Service for Apache Flink&lt;/strong&gt; (구 Amazon Kinesis Data Analytics) 는 &lt;em&gt;스트리밍 데이터를 실시간으로 처리 (aggregate, join, window, ML 추론) 하는 완전 관리형 Apache Flink&lt;/em&gt; 서비스. Java / Python / Scala / SQL 로 스트림 애플리케이션 작성.&lt;/p&gt;
&lt;h2 id=&quot;이름-변경--sql-종료-2025-2026&quot;&gt;이름 변경 &amp;#x26; SQL 종료 (2025-2026)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;&lt;code&gt;Kinesis Data Analytics for SQL Applications&lt;/code&gt; 는 2026-01-27 종료&lt;/strong&gt;. 신규 생성 불가, 기존 앱 모두 삭제. SQL 애플리케이션 사용자는 &lt;strong&gt;Managed Flink Studio (Zeppelin + Flink SQL)&lt;/strong&gt; 로 마이그레이션.&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;~2018&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kinesis Data Analytics for SQL Applications (SQL)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2018-2023&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kinesis Data Analytics for Apache Flink (Java/Python/Scala) 추가&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2023-08&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;Amazon Managed Service for Apache Flink&lt;/em&gt; 로 이름 변경&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2025-09-01&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KDA for SQL - 제한적 지원 시작&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2025-10-15&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KDA for SQL - 신규 생성 차단&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;2026-01-27&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;KDA for SQL 모든 앱 삭제, 서비스 종료&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;지금은 &lt;strong&gt;Managed Service for Apache Flink (MSF)&lt;/strong&gt; 하나만.&lt;/p&gt;
&lt;h2 id=&quot;왜-apache-flink&quot;&gt;왜 Apache Flink&lt;/h2&gt;
&lt;p&gt;스트리밍 처리는 배치 처리보다 어려운 문제들이 있음:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Event time vs Processing time&lt;/strong&gt; - 이벤트가 언제 발생했는지 vs 언제 처리됐는지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Late-arriving events&lt;/strong&gt; - 늦게 도착한 데이터 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watermark&lt;/strong&gt; - “이 시점 이전 이벤트는 다 왔다” 신호&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exactly-once semantics&lt;/strong&gt; - 정확히 한 번 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stateful processing&lt;/strong&gt; - 세션, 집계 상태 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windowing&lt;/strong&gt; - Tumbling / Sliding / Session window&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flink 는 이 모든 것을 first-class 지원. Kafka Streams, Spark Streaming 대비 저지연 + stateful 강함.&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;Java&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;원류, 가장 완전. Flink DataStream API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;PyFlink. Java API wrapper&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Scala&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;사용 감소 (Flink 2.x 부터 core 제거)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Flink SQL. Studio (Zeppelin notebook) 에서&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;지원-버전-2026-시점&quot;&gt;지원 버전 (2026 시점)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flink 1.20.0&lt;/strong&gt; (최신, 2026 기준)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flink 1.19.1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flink 1.18.1&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;LTS 정책&lt;/strong&gt;: 각 버전 GA 시점부터 24개월 지원.&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;    subgraph Sources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        KDS[&quot;Kinesis Data Streams&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        MSK[Amazon MSK]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Kafka[Self-managed Kafka]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S3In[(&quot;S3 파일&quot;)]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Sources --&gt; MSF[&quot;Managed Flink Application&amp;#x3C;br/&gt;(Flink Job)&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;    MSF --&gt; Sinks&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;    subgraph Sinks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        KDSOut[&quot;KDS&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        FH[&quot;Data Firehose&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S3Out[(&quot;S3&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        DDB[(&quot;DynamoDB&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        OS[OpenSearch]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&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;        Custom[Custom HTTP]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    State[&quot;Application State&amp;#x3C;br/&gt;(RocksDB, 자동 체크포인트)&quot;] &amp;#x3C;-.-&gt; MSF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CW[&quot;CloudWatch&amp;#x3C;br/&gt;Logs/Metrics&quot;] &amp;#x3C;-.-&gt; MSF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Application&lt;/strong&gt;: Flink job (JAR 또는 Python)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KPU (Kinesis Processing Unit)&lt;/strong&gt;: 1 vCPU + 4 GB. 병렬성 단위&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State&lt;/strong&gt;: RocksDB 기반, S3 로 자동 체크포인트 / 스냅샷&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-scaling&lt;/strong&gt;: 스트림 트래픽에 따라 KPU 자동 조정&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실행-유형&quot;&gt;실행 유형&lt;/h2&gt;
&lt;h3 id=&quot;1-application-프로덕션&quot;&gt;1. Application (프로덕션)&lt;/h3&gt;
&lt;p&gt;배포된 JAR / Python 을 24/7 실행.&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;Application configuration:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  runtime: FLINK-1_20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  code_location: s3://my-bucket/flink-app.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  parallelism: 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  parallelismPerKPU: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  autoScalingEnabled: true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-studio-zeppelin-notebook&quot;&gt;2. Studio (Zeppelin Notebook)&lt;/h3&gt;
&lt;p&gt;인터랙티브 개발/탐색. Flink SQL, PyFlink, Scala 지원.&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:#6A737D&quot;&gt;-- Flink SQL 예: 5분 tumbling window&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; clicks&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  user_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span 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;  page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; STRING,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  event_time &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TIMESTAMP&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:#E1E4E8&quot;&gt;  WATERMARK &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FOR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event_time &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; event_time &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; INTERVAL &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;10&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SECOND&lt;/span&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;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:#9ECBFF&quot;&gt;  &apos;connector&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;kinesis&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;stream&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;clicks&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;format&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;json&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;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  TUMBLE_START(event_time, INTERVAL &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;5&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; MINUTE&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; window_start,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&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; click_count&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; clicks&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:#F97583&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, TUMBLE(event_time, INTERVAL &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;5&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; MINUTE&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;Studio 는 SQL 사용자의 마이그레이션 답&lt;/strong&gt;. KDA for SQL 을 대체.&lt;/p&gt;
&lt;h2 id=&quot;커넥터-connectors&quot;&gt;커넥터 (Connectors)&lt;/h2&gt;
&lt;p&gt;40+ 개 소스/싱크:&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;strong&gt;AWS&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;[[aws-kinesis-data-streams|Kinesis Data Streams]], MSK, [[aws-data-firehose|Firehose]], [[aws-s3|S3]], [[dynamodb|DynamoDB]], [[aws-rds|RDS]] (JDBC), OpenSearch, CloudWatch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Kafka&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Self-managed Kafka, Confluent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Message Queue&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;RabbitMQ, ActiveMQ&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;DB&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;JDBC (PostgreSQL, MySQL), Iceberg, Hudi, Delta&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Async HTTP sink&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;윈도우-windowing-예제&quot;&gt;윈도우 (Windowing) 예제&lt;/h2&gt;
&lt;h3 id=&quot;tumbling-window&quot;&gt;Tumbling Window&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[--5분--][--5분--][--5분--]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sliding-window&quot;&gt;Sliding Window&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[--5분--]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   [--5분--]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      [--5분--]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;session-window&quot;&gt;Session Window&lt;/h3&gt;
&lt;p&gt;이벤트 간 gap 기반.&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;[event][event] .......gap....... [event][event][event]&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;global-window&quot;&gt;Global Window&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;java&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;DataStream&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;Event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; input &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;input&lt;/span&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:#B392F0&quot;&gt;keyBy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(Event&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;getUserId)&lt;/span&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:#B392F0&quot;&gt;window&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(TumblingEventTimeWindows.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(Time.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;minutes&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:#E1E4E8&quot;&gt;  .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;aggregate&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; SumAggregate&lt;/span&gt;&lt;span style=&quot;color:#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:#B392F0&quot;&gt;print&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;exactly-once&quot;&gt;Exactly-Once&lt;/h2&gt;
&lt;p&gt;Flink 체크포인트 + 커넥터 트랜잭션 지원.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;소스 (KDS, Kafka) offset 저장&lt;/li&gt;
&lt;li&gt;싱크 (S3, Kafka) transactional write&lt;/li&gt;
&lt;li&gt;실패 시 마지막 체크포인트에서 재실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KPU-hour&lt;/strong&gt;: ~$0.11 / KPU-hour (Application)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Studio&lt;/strong&gt;: ~$0.14 / KPU-hour&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running Application Storage&lt;/strong&gt;: ~$0.10 / GB-월 (state)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durable Application Backups&lt;/strong&gt;: ~$0.023 / GB-월 (스냅샷)&lt;/li&gt;
&lt;/ul&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;Application 4 KPU × 730 시간 = 2920 KPU-hour&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2920 × $0.11 = $321.20 /월&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;실시간 이상 감지 (fraud detection)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Managed Flink DataStream (Java)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;5분 tumbling aggregation&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Managed Flink SQL (Studio)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;CDC 로 KDS -&gt; Iceberg 실시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Managed Flink + Iceberg connector&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;세션 window 분석&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Managed Flink Session Windows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;배치 aggregation&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;[[aws-athena|Athena]] / [[aws-emr|EMR]] (Flink 아님)&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-data-firehose|Data Firehose]] (Flink 필요 X)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;flink-vs-다른-스트리밍-엔진&quot;&gt;Flink 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;Flink&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;저지연, exactly-once, stateful 강함&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;Spark Structured Streaming&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;배치와 통합, 익숙&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;이미 Spark 스택&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Kafka Streams&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kafka 안에서만, 경량&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kafka 전용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;KSQL / ksqlDB&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SQL only, 단순&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Confluent 환경&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-data-firehose|Firehose]]&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;KDA for SQL 은 2026-01-27 종료&lt;/strong&gt;. 신규 개발 금지. 기존 SQL 앱은 Managed Flink Studio (Zeppelin) 로 마이그레이션 계획 수립.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Flink 학습 곡선 급함&lt;/strong&gt;. Event time / watermark / windowing 개념 이해 없이 도입하면 실패. 배치 사고 방식 X.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;KPU 과잉 프로비저닝&lt;/strong&gt; = 비용 폭탄. Auto-scaling + 실측 후 조정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;State 크기 증가&lt;/strong&gt; = 체크포인트 지연 + 비용. Session window state TTL 설정, keyed state 크기 모니터링.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Late event handling 미설정&lt;/strong&gt; = 데이터 조용히 drop. Watermark 전략 + &lt;code&gt;allowedLateness&lt;/code&gt; 정의.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Studio 는 개발/탐색용&lt;/strong&gt;. 24/7 프로덕션은 Application 배포로. Studio 는 노트북 종료 시 앱도 중단.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Flink 2.x 는 Scala 제거&lt;/strong&gt;. 새 프로젝트는 Java / Python.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-kinesis-data-streams|Kinesis Data Streams]] - 대표 스트림 소스&lt;/li&gt;
&lt;li&gt;[[aws-data-firehose|Amazon Data Firehose]] - 코드 없이 적재&lt;/li&gt;
&lt;li&gt;[[aws-lambda|AWS Lambda]] - 저지연 소규모 소비자 대안&lt;/li&gt;
&lt;li&gt;[[aws-emr|Amazon EMR]] - EMR 위에서도 Flink 실행 가능&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - Streaming ETL 대안 (Spark Streaming)&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - 자주 쓰는 sink&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - S3 sink 포맷&lt;/li&gt;
&lt;li&gt;[[etl|ETL / ELT]] - 스트리밍 파이프라인 개념&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>kinesis</category><category>flink</category><category>streaming</category><category>real-time</category><category>analytics</category><author>koa (김신건)</author></item><item><title>[AWS] Network Firewall</title><link>https://shinkeonkim.com/wiki/cloud/aws-network-firewall/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-network-firewall/</guid><pubDate>Thu, 30 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 Network Firewall (ANF)&lt;/strong&gt; 은 VPC 를 위한 &lt;strong&gt;관리형 네트워크 방화벽 + 침입 방지 (IDS/IPS)&lt;/strong&gt; 서비스입니다. Stateful + Stateless 규칙 엔진, Suricata 호환 규칙, TLS SNI 검사, 관리형 위협 인텔리전스 피드를 제공.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: SG/NACL 로 부족한 딥 인스펙션 (Layer 7 검사, 도메인 필터, 시그니처 기반 IPS) 담당.&lt;/p&gt;
&lt;h2 id=&quot;왜-필요한가&quot;&gt;왜 필요한가&lt;/h2&gt;
&lt;h3 id=&quot;sgnacl-의-한계&quot;&gt;SG/NACL 의 한계&lt;/h3&gt;
&lt;p&gt;[[aws-sg-vs-nacl|Security Group / NACL]] 은 5-tuple (src IP, port, protocol, dst IP, port) 만 봄:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;도메인 기반 차단 불가&lt;/strong&gt; (example.com/malicious 만 막고 example.com/api 허용?)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패킷 내용 검사 X&lt;/strong&gt; (SQL injection payload 감지?)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;알려진 공격 시그니처 X&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;위협 인텔리전스 자동 연동 X&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;network-firewall-의-접근&quot;&gt;Network Firewall 의 접근&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suricata 규칙&lt;/strong&gt;: DPI (Deep Packet Inspection)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS SNI&lt;/strong&gt;: HTTPS 도메인 필터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;관리형 규칙 그룹&lt;/strong&gt;: AWS 유지 (&lt;code&gt;AttackVector&lt;/code&gt;, &lt;code&gt;ThreatSignatures&lt;/code&gt;, &lt;code&gt;BotNetCommandAndControlDomains&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;로그&lt;/strong&gt;: alert/flow/TLS&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 LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  IGW[Internet Gateway] --&gt; FW[Network Firewall&amp;#x3C;br/&gt;Endpoint]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  FW --&gt;|allowed| Private[Private Subnet]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Private --&gt;|outbound| FW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  FW --&gt; IGW&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;중요&lt;/strong&gt;: 서브넷 사이에 방화벽 endpoint 를 두고 route table 을 조정해 트래픽이 방화벽을 통과하도록.&lt;/p&gt;
&lt;h2 id=&quot;구성-요소&quot;&gt;구성 요소&lt;/h2&gt;
&lt;h3 id=&quot;firewall&quot;&gt;Firewall&lt;/h3&gt;
&lt;p&gt;전체 배포 단위. 하나의 VPC 에 연결.&lt;/p&gt;
&lt;h3 id=&quot;firewall-policy&quot;&gt;Firewall Policy&lt;/h3&gt;
&lt;p&gt;Firewall 이 사용할 규칙 그룹 모음. Stateless + Stateful 규칙 그룹, default action.&lt;/p&gt;
&lt;h3 id=&quot;rule-group&quot;&gt;Rule Group&lt;/h3&gt;
&lt;p&gt;실제 규칙 컨테이너. 두 유형:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stateless&lt;/strong&gt;: 5-tuple 매칭 (Suricata 없음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stateful&lt;/strong&gt;: Suricata 규칙 (DPI, 도메인 필터, 시그니처)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;firewall-endpoint&quot;&gt;Firewall Endpoint&lt;/h3&gt;
&lt;p&gt;각 AZ 에 하나. Route table 이 이 endpoint 로 트래픽 라우팅.&lt;/p&gt;
&lt;h2 id=&quot;stateful-rules-suricata&quot;&gt;Stateful Rules (Suricata)&lt;/h2&gt;
&lt;p&gt;Suricata 규칙 문법:&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;drop tcp any any -&gt; any 443 (msg:&quot;Block bad.example.com&quot;; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  tls.sni; content:&quot;bad.example.com&quot;; nocase; sid:1000001;)&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;alert http any any -&gt; any any (msg:&quot;SQL Injection&quot;; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  content:&quot;UNION SELECT&quot;; http_uri; sid:1000002;)&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;drop ip any any -&gt; [$MALICIOUS_IPS] any (msg:&quot;Known bad IP&quot;; sid:1000003;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;action&lt;/strong&gt;: &lt;code&gt;alert&lt;/code&gt;, &lt;code&gt;drop&lt;/code&gt;, &lt;code&gt;pass&lt;/code&gt;, &lt;code&gt;reject&lt;/code&gt;.
&lt;strong&gt;direction&lt;/strong&gt;: &lt;code&gt;-&gt;&lt;/code&gt; (단방향), &lt;code&gt;&amp;#x3C;&gt;&lt;/code&gt; (양방향).&lt;/p&gt;
&lt;h2 id=&quot;fqdn-기반-필터링-deep-dive&quot;&gt;FQDN 기반 필터링 (Deep Dive)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FQDN (Fully Qualified Domain Name)&lt;/strong&gt; 필터링은 &lt;em&gt;IP 대신 도메인 이름으로&lt;/em&gt; 트래픽을 허용/차단하는 능력. &lt;code&gt;example.com&lt;/code&gt;, &lt;code&gt;*.malicious.net&lt;/code&gt;, &lt;code&gt;internal.corp.local&lt;/code&gt; 같은 규칙을 쓸 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;왜 중요한가&lt;/strong&gt;: IP 만으로는 부족한 이유들.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CDN / 클라우드 서비스&lt;/strong&gt;: &lt;code&gt;github.com&lt;/code&gt;, &lt;code&gt;s3.amazonaws.com&lt;/code&gt; 등은 수천 IP → CIDR 로는 불가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동적 IP&lt;/strong&gt;: 서비스가 IP 를 자주 바꿈&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정책의 표현력&lt;/strong&gt;: “우리 회사는 github 만 허용” 이 IP 대역 스캔보다 명확&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;감사&lt;/strong&gt;: “어느 도메인으로 나갔는지” 가 IP 보다 이해하기 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;도메인-리스트-domain-list-규칙&quot;&gt;도메인 리스트 (Domain List) 규칙&lt;/h3&gt;
&lt;p&gt;Suricata 문법 없이 관리자 친화적 방식.&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;RulesSourceList&lt;/span&gt;&lt;span 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;  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:#9ECBFF&quot;&gt;&apos;example.com&apos;&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:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;.github.com&apos;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;          # 서브도메인 포함 (github.com + *.github.com)&lt;/span&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;api.stripe.com&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  TargetTypes&lt;/span&gt;&lt;span style=&quot;color:#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;HTTPS&apos;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                # TLS SNI 기반&lt;/span&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;HTTP&apos;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                 # HTTP Host header 기반&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  GeneratedRulesType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ALLOWLIST&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 또는 DENYLIST&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;ALLOWLIST&lt;/strong&gt;: 리스트의 도메인만 허용, 나머지 차단&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DENYLIST&lt;/strong&gt;: 리스트의 도메인만 차단, 나머지 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Wildcard&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.github.com&lt;/code&gt; = &lt;code&gt;github.com&lt;/code&gt; + &lt;code&gt;*.github.com&lt;/code&gt; (모든 서브도메인)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com&lt;/code&gt; = 정확히 이 도메인만&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;어떻게-도메인을-감지하는가-프로토콜별&quot;&gt;어떻게 도메인을 감지하는가 (프로토콜별)&lt;/h3&gt;
&lt;p&gt;Network Firewall 은 트래픽의 &lt;strong&gt;평문 부분&lt;/strong&gt; 에서 도메인 정보를 추출.&lt;/p&gt;
&lt;h4 id=&quot;http-평문-80&quot;&gt;HTTP (평문 80)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;HTTP Host 헤더&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;GET /api/data HTTP/1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Host: api.example.com          ← 여기 매칭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;User-Agent: ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;각 HTTP 요청마다 Host 확인&lt;/li&gt;
&lt;li&gt;명확하고 확실 (평문이므로)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;https-tls-443&quot;&gt;HTTPS (TLS 443)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;TLS ClientHello 안의 SNI (Server Name Indication) 확장&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;Client → Server: TCP SYN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Server → Client: TCP SYN-ACK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Client → Server: TCP ACK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Client → Server: TLS ClientHello&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├─ Cipher suites&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├─ Extensions:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  │   └─ server_name: &quot;api.example.com&quot;  ← SNI (평문 노출!)&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;Server → Client: TLS ServerHello + Certificate&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;&lt;strong&gt;핵심&lt;/strong&gt;: SNI 는 TLS handshake 초반 (평문) 에 노출됨. 브라우저가 어느 사이트에 접속하려는지 서버가 알아야 (multi-tenant hosting) 하기 때문. Network Firewall 은 이 SNI 만 보고 결정.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;중요한 함의&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;실제 응답 데이터는 여전히 암호화. Network Firewall 은 &lt;strong&gt;못 봄&lt;/strong&gt; (TLS Inspection 옵션 없이는)&lt;/li&gt;
&lt;li&gt;SNI 필터링은 &lt;strong&gt;connection 초기&lt;/strong&gt; 에 결정 → 이후 데이터는 통과&lt;/li&gt;
&lt;li&gt;하나의 도메인 (예: github.com) 이 여러 IP 로 서빙되어도 SNI 하나로 감지&lt;/li&gt;
&lt;/ul&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;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant C as Client (VPC)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant NF as Network Firewall&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant S as bad.example.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:#E1E4E8&quot;&gt;    Note over NF: Domain List DENYLIST:&amp;#x3C;br/&gt;[&quot;.bad.example.com&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;    C-&gt;&gt;NF: DNS 조회 (bad.example.com → 1.2.3.4)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over NF: DNS 는 통과 (별도 필터)&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;    C-&gt;&gt;NF: TCP SYN → 1.2.3.4:443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NF-&gt;&gt;NF: 5-tuple 매칭, connection 시작&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;    C-&gt;&gt;NF: TLS ClientHello (SNI = bad.example.com)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NF-&gt;&gt;NF: SNI 파싱 → DENYLIST 매칭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NF--&gt;&gt;C: RST (drop, msg logged)&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 C,S: 연결 성립 실패&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;wildcard-패턴-예제&quot;&gt;Wildcard 패턴 예제&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;example.com&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;example.com&lt;/code&gt; 정확히 (서브도메인 X)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;.example.com&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;example.com&lt;/code&gt; + &lt;code&gt;www.example.com&lt;/code&gt; + &lt;code&gt;api.example.com&lt;/code&gt; + …&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;api.example.com&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;.&lt;/code&gt; (dot only)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;모든 도메인 (사실상 all)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;주의&lt;/strong&gt;: &lt;code&gt;*.example.com&lt;/code&gt; 형식은 지원 X. 리딩 dot (&lt;code&gt;.&lt;/code&gt;) 이 표준.&lt;/p&gt;
&lt;h3 id=&quot;fqdn-필터링의-근본적-한계&quot;&gt;FQDN 필터링의 근본적 한계&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;우회 가능한 경우들&lt;/strong&gt;:&lt;/p&gt;
&lt;h4 id=&quot;1-encrypted-dns-doh--dot&quot;&gt;1. Encrypted DNS (DoH / DoT)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;DoH (DNS over HTTPS, &lt;code&gt;443&lt;/code&gt; 위), DoT (DNS over TLS, &lt;code&gt;853&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;클라이언트가 DNS 조회를 암호화된 채로 external resolver (Cloudflare 1.1.1.1, Google 8.8.8.8) 에 보냄&lt;/li&gt;
&lt;li&gt;Network Firewall 은 도메인 결정 자체를 못 봄&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;완화&lt;/strong&gt;: 조직 정책으로 DoH/DoT 를 차단 (특정 IP/포트) + 사내 DNS 강제&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-encrypted-client-hello-ech&quot;&gt;2. Encrypted Client Hello (ECH)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;TLS 1.3 확장. SNI 를 암호화해서 전송&lt;/li&gt;
&lt;li&gt;Network Firewall 이 도메인을 못 알아냄&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;완화&lt;/strong&gt;: ECH 사용 트래픽 차단 (미묘, 미래에 확산될 것)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-ip-직접-접근&quot;&gt;3. IP 직접 접근&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 도메인 없이 IP 로 접근 (&lt;code&gt;https://1.2.3.4/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;SNI 없음 (SNI 는 선택적 확장이지만, 대부분 있음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;완화&lt;/strong&gt;: SNI 없는 TLS 를 차단하는 stateful 규칙&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-fronting-도메인-위장&quot;&gt;4. Fronting (도메인 위장)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;공격자가 SNI 에 &lt;code&gt;legit.example.com&lt;/code&gt; 을 쓰고 실제로는 &lt;code&gt;bad.example.com&lt;/code&gt; 로 요청 (CDN 뒤에서)&lt;/li&gt;
&lt;li&gt;Legit CDN 은 실제 Host 헤더 기반 라우팅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;완화&lt;/strong&gt;: TLS Inspection 으로 실제 Host 확인 (성능/프라이버시 트레이드오프)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tls-inspection-도메인-이상의-검사&quot;&gt;TLS Inspection (도메인 이상의 검사)&lt;/h3&gt;
&lt;p&gt;TLS 를 복호화해 내부 콘텐츠까지 검사. Network Firewall 이 관리형으로 지원 (2023+).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;동작&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Network Firewall 이 자체 CA 인증서로 TLS 종단 (MITM)&lt;/li&gt;
&lt;li&gt;클라이언트 → Firewall (Firewall CA 신뢰 필요)&lt;/li&gt;
&lt;li&gt;Firewall → Server (기존 TLS)&lt;/li&gt;
&lt;li&gt;사이에서 평문 검사&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;요구&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 Firewall CA 신뢰&lt;/li&gt;
&lt;li&gt;인증서 관리 부담&lt;/li&gt;
&lt;li&gt;SSL Pinning 하는 앱은 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;의미&lt;/strong&gt;: FQDN 필터링을 넘어 &lt;strong&gt;실제 페이로드까지&lt;/strong&gt; 검사. 하지만 프라이버시/성능/관리 비용 증가.&lt;/p&gt;
&lt;h3 id=&quot;fqdn-필터링-vs-route-53-resolver-dns-firewall&quot;&gt;FQDN 필터링 vs Route 53 Resolver DNS Firewall&lt;/h3&gt;
&lt;p&gt;AWS 는 두 가지 도메인 기반 방화벽을 제공. 원리가 다름.&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;Network Firewall FQDN&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Route 53 Resolver DNS Firewall&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;TCP/TLS 트래픽 (연결 시도 시점)&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;&lt;strong&gt;감지 방법&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;HTTP Host / TLS SNI&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DNS query 도메인&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;RST / drop packet&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DNS 응답 조작 (NXDOMAIN)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;암호화 DNS 우회&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우회 가능&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;&lt;strong&gt;적용 대상&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPC 를 지나는 모든 트래픽&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPC 안 DNS 요청&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;각 세션 SNI 파싱&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DNS 조회당&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;Route 53 DNS Firewall → 조회 자체 차단 (빠름, 근본적)&lt;/li&gt;
&lt;li&gt;Network Firewall FQDN → DNS 로 해결된 후 실제 연결 시도 차단 (이중 방어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;managed-domain-list-aws-제공&quot;&gt;Managed Domain List (AWS 제공)&lt;/h3&gt;
&lt;p&gt;AWS 가 유지하는 도메인 리스트 subscribe 가능:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MalwareDomainsActionOrder&lt;/strong&gt;: 알려진 malware 배포 도메인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BotNetCommandAndControlDomainsActionOrder&lt;/strong&gt;: C2 서버&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AbusedLegitDomainsActionOrder&lt;/strong&gt;: 남용되는 정상 도메인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자동 업데이트. 자체 관리 부담 감소.&lt;/p&gt;
&lt;h2 id=&quot;suricata-로-fqdn-규칙-직접-작성&quot;&gt;Suricata 로 FQDN 규칙 직접 작성&lt;/h2&gt;
&lt;p&gt;Domain List 대신 Suricata 규칙으로 더 세밀한 제어.&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;# TLS SNI 정확 매칭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;drop tls any any -&gt; any 443 (msg:&quot;Block bad site&quot;; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  tls.sni; content:&quot;bad.example.com&quot;; nocase; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  sid:2001; rev:1;)&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;# HTTP Host 헤더 매칭 (서브도메인 포함)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;drop http any any -&gt; any 80 (msg:&quot;Block subdomain&quot;; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  http.host; content:&quot;.malware.net&quot;; endswith; nocase; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  sid:2002; rev:1;)&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;drop tls $INTERNAL_NET any -&gt; any 443 (msg:&quot;Internal client blocked&quot;; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  tls.sni; content:&quot;gambling.site&quot;; nocase; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  sid:2003;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;관리형-rule-groups-aws&quot;&gt;관리형 Rule Groups (AWS)&lt;/h2&gt;
&lt;p&gt;AWS 제공, 자동 업데이트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ThreatSignatures&lt;/strong&gt;: 알려진 공격 시그니처&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AttackVectors&lt;/strong&gt;: OWASP Top 10 등&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BotNetCommandAndControlDomains&lt;/strong&gt;: C2 서버 도메인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MalwareDomains&lt;/strong&gt;: 알려진 malware 배포 도메인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AbusedLegitDomains&lt;/strong&gt;: 남용되는 정상 도메인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;subscription 형식으로 정책에 포함.&lt;/p&gt;
&lt;h2 id=&quot;관용-배포-패턴&quot;&gt;관용 배포 패턴&lt;/h2&gt;
&lt;h3 id=&quot;centralized-egress&quot;&gt;Centralized Egress&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Transit Gateway&lt;/strong&gt; 뒤에 Inspection VPC 하나 두고 모든 VPC 의 인터넷 outbound 를 그 곳 통과:&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;VPC-A ─┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;VPC-B ─┼─→ Transit Gateway ─→ Inspection VPC (Network Firewall) ─→ Internet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;VPC-C ─┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여러 VPC 의 정책 중앙 관리 + 요금 절감.&lt;/p&gt;
&lt;h3 id=&quot;per-vpc-firewall&quot;&gt;Per-VPC Firewall&lt;/h3&gt;
&lt;p&gt;각 VPC 안 subnet 사이에 firewall endpoint. 소규모 조직.&lt;/p&gt;
&lt;h3 id=&quot;east-west-vpc-내부&quot;&gt;East-West (VPC 내부)&lt;/h3&gt;
&lt;p&gt;같은 VPC 안 subnet 간 트래픽을 firewall 통과. Zero-trust 네트워크.&lt;/p&gt;
&lt;h2 id=&quot;로깅&quot;&gt;로깅&lt;/h2&gt;
&lt;p&gt;Firewall 이 생성하는 로그:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alert logs&lt;/strong&gt;: 규칙 alert 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flow logs&lt;/strong&gt;: 모든 flow 요약 (source, dest, action)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS logs&lt;/strong&gt;: TLS handshake 정보 (SNI 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CloudWatch Logs / Kinesis / S3 로.&lt;/p&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Endpoint 시간당&lt;/strong&gt;: AZ 마다 (~0.395 USD/hour)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;트래픽 처리&lt;/strong&gt;: GB 당 (~0.065 USD/GB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;관리형 규칙 그룹&lt;/strong&gt;: 일부 무료, 일부 subscription&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;주의&lt;/strong&gt;: 여러 AZ 배포 시 endpoint 요금 곱하기.&lt;/p&gt;
&lt;h2 id=&quot;network-firewall-vs-대안&quot;&gt;Network Firewall 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;[[aws-sg-vs-nacl|SG/NACL]]&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;Network Firewall&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Layer 7, IPS, 도메인 필터&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;[[aws-waf|WAF]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;HTTP 특화 (URL, header)&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;[[aws-shield|Shield]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DDoS&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;3rd-party (Palo Alto, Fortinet)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;종합 NGFW&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;기존 firewall 팀&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;결정&lt;/strong&gt;: SG/NACL 로 부족 + DPI 필요 → Network Firewall.&lt;/p&gt;
&lt;h2 id=&quot;stateless-rules-상세&quot;&gt;Stateless Rules 상세&lt;/h2&gt;
&lt;p&gt;Stateful 보다 먼저 평가. 5-tuple 만 사용, 빠르고 저렴함.&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;# Stateless rule group 예시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;StatelessRules&lt;/span&gt;&lt;span style=&quot;color:#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;Priority&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;    RuleDefinition&lt;/span&gt;&lt;span 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;      MatchAttributes&lt;/span&gt;&lt;span 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;        Protocols&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]       &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# TCP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        DestinationPorts&lt;/span&gt;&lt;span style=&quot;color:#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;FromPort&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;            ToPort&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;      Actions&lt;/span&gt;&lt;span style=&quot;color:#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;aws:forward_to_sfe&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # Stateful engine 으로 전달&lt;/span&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;Priority&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &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 style=&quot;color:#85E89D&quot;&gt;    RuleDefinition&lt;/span&gt;&lt;span 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;      MatchAttributes&lt;/span&gt;&lt;span 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;        Sources&lt;/span&gt;&lt;span style=&quot;color:#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;AddressDefinition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10.0.1.0/24&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;        DestinationPorts&lt;/span&gt;&lt;span style=&quot;color:#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;FromPort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;            ToPort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        Protocols&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span 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;      Actions&lt;/span&gt;&lt;span style=&quot;color:#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;aws:pass&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;전략: &lt;em&gt;간단 허용/차단 = Stateless&lt;/em&gt; 로 먼저 처리, &lt;em&gt;DPI 필요 = &lt;code&gt;aws:forward_to_sfe&lt;/code&gt;&lt;/em&gt; 로 Stateful 에 전달.&lt;/p&gt;
&lt;h2 id=&quot;centralized-egress-상세-아키텍처&quot;&gt;Centralized Egress 상세 아키텍처&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;    A[&quot;VPC-A 워크로드&quot;] --&gt; TGW[&quot;Transit Gateway&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    B[&quot;VPC-B 워크로드&quot;] --&gt; TGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    C[&quot;VPC-C 워크로드&quot;] --&gt; TGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    TGW --&gt; INS[&quot;Inspection VPC&amp;#x3C;br/&gt;Network Firewall&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    INS --&gt;|&quot;허용 트래픽&quot;| 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;    INS --&gt;|&quot;차단 트래픽&quot;| DROP[&quot;Drop&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Route Table 핵심:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspection VPC &lt;code&gt;firewall-subnet&lt;/code&gt;: IGW 로 가는 경로 → firewall endpoint&lt;/li&gt;
&lt;li&gt;Inspection VPC &lt;code&gt;public-subnet&lt;/code&gt;: 외부 → firewall endpoint&lt;/li&gt;
&lt;li&gt;TGW attachment route: 스포크 VPC 트래픽 → Inspection VPC&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cloudwatch-logs-쿼리&quot;&gt;CloudWatch 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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 상위 차단 시그니처 (Alert 로그)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;fields @timestamp, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;alert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;signature&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, src_ip, dest_ip&lt;/span&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; event_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;alert&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 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;*&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 style=&quot;color:#F97583&quot;&gt;by&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; alert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;signature&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;| sort 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:#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; 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:#6A737D&quot;&gt;-- 내부에서 외부로 나가는 차단 트래픽 (Flow 로그)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;fields @timestamp, src_ip, dest_ip, dest_port, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;action&lt;/span&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:#F97583&quot;&gt; action&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;blocked&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 style=&quot;color:#F97583&quot;&gt;limit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;terraform-예시&quot;&gt;Terraform 예시&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;hcl&quot;&gt;&lt;code&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_networkfirewall_rule_group&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;domain_denylist&quot;&lt;/span&gt;&lt;span style=&quot;color:#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:#F97583&quot;&gt;     =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;domain-denylist&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;     =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;STATEFUL&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  capacity&lt;/span&gt;&lt;span style=&quot;color:#F97583&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  rule_group&lt;/span&gt;&lt;span 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;    rules_source&lt;/span&gt;&lt;span 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;      rules_source_list&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        generated_rules_type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;DENYLIST&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        target_types&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;HTTP_HOST&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;TLS_SNI&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        targets&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;bad.example.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;.malware.net&quot;&lt;/span&gt;&lt;span style=&quot;color:#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:#B392F0&quot;&gt;resource&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; &quot;aws_networkfirewall_firewall_policy&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:#E1E4E8&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;main-policy&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  firewall_policy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    stateless_default_actions&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;aws:forward_to_sfe&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    stateless_fragment_default_actions&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;aws:forward_to_sfe&quot;&lt;/span&gt;&lt;span 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;    stateful_rule_group_reference&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      resource_arn&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; aws_networkfirewall_rule_group&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;domain_denylist&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;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;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;Route table 설정 실수&lt;/strong&gt;. Firewall endpoint 로 라우팅 안 되면 방화벽 우회.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;양방향 (return traffic)&lt;/strong&gt;. Stateful 이면 자동, stateless 는 규칙 명시.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;비용 폭발 가능&lt;/strong&gt;. GB 당 요금 + 다중 AZ endpoint. 필요한 트래픽만 필터.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;TLS SNI 만 검사, decrypt 안 함&lt;/strong&gt;. TLS 안 payload 는 안 보임. TLS inspection 은 별도 (3rd-party appliance).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Suricata 규칙 성능&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-vpc|VPC]]&lt;/li&gt;
&lt;li&gt;[[aws-sg-vs-nacl|SG vs NACL]]&lt;/li&gt;
&lt;li&gt;[[stateful-vs-stateless-firewall|Stateful vs Stateless Firewall]]&lt;/li&gt;
&lt;li&gt;[[aws-shield|Shield]]&lt;/li&gt;
&lt;li&gt;[[aws-waf|WAF]] - 웹 특화&lt;/li&gt;
&lt;li&gt;[[aws-guardduty|GuardDuty]] - 위협 탐지 (짝)&lt;/li&gt;
&lt;li&gt;[[aws-privatelink|PrivateLink]]&lt;/li&gt;
&lt;li&gt;[[aws-direct-connect|Direct Connect]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>security</category><category>firewall</category><category>network</category><category>vpc</category><author>koa (김신건)</author></item><item><title>[AWS] Organizations: 다중 계정 거버넌스</title><link>https://shinkeonkim.com/wiki/cloud/aws-organizations/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-organizations/</guid><pubDate>Thu, 30 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 Organizations&lt;/strong&gt; 는 &lt;em&gt;여러 AWS 계정을 하나의 조직으로 통합 관리&lt;/em&gt; 하는 서비스. 계정을 계층 (OU) 으로 묶고, 정책 (SCP, RCP, Tag, Backup, AI opt-out) 으로 가드레일을 부여하며, 통합 결제로 비용을 합산.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 3가지&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;통합 결제 (Consolidated Billing)&lt;/strong&gt; - 볼륨 할인 합산, RI/Savings Plans 공유&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OU (Organizational Unit)&lt;/strong&gt; - 계층적 계정 그룹&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정책 가드레일&lt;/strong&gt; - SCP (권한 상한), RCP (리소스 상한) 등&lt;/li&gt;
&lt;/ol&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;Organization Root&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── Management Account (관리 계정, root user 소유)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── (모든 정책 관리, SCP 적용 안 됨)&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;├── OU: Security&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── LogArchive Account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── Audit Account&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;├── OU: Prod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── prod-app-a Account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── prod-app-b Account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── OU: Prod-Sandbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│       └── prod-sandbox Account&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;└── OU: Dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── dev-team-a Account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── dev-team-b Account&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Management Account&lt;/strong&gt;: 조직 생성/정책 관리. &lt;strong&gt;SCP 미적용&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Member Account&lt;/strong&gt;: SCP/RCP 등 정책 적용 대상.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OU&lt;/strong&gt;: 최대 5단계 중첩 가능. 계정은 정확히 하나의 OU 에 속함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;scp-service-control-policy&quot;&gt;SCP (Service Control Policy)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;주체 (principal)&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:#6A737D&quot;&gt;// 특정 리전만 허용 (Deny list 전략)&lt;/span&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;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;DenyAllOutsideAllowedRegions&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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;NotAction&quot;&lt;/span&gt;&lt;span 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;iam:*&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:*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;organizations:*&quot;&lt;/span&gt;&lt;span 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;cloudfront:*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;route53:*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;waf:*&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:#9ECBFF&quot;&gt;        &quot;support:*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;trustedadvisor:*&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;*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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;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 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:#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;&lt;strong&gt;중요 특성&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;권한을 부여하지 않는다&lt;/strong&gt; - 허용해도 [[aws-iam|IAM]] 허용이 별도로 필요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;관리 계정에는 적용 안 됨&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;부착 대상: Root / OU / 계정&lt;/li&gt;
&lt;li&gt;두 전략:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deny list&lt;/strong&gt; (기본): &lt;code&gt;FullAWSAccess&lt;/code&gt; + 특정 Deny&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow list&lt;/strong&gt;: 명시 허용만&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대표 시나리오&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;특정 리전 사용 원천 차단 (&lt;code&gt;aws:RequestedRegion&lt;/code&gt;)&lt;/li&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;rcp-resource-control-policy&quot;&gt;RCP (Resource Control Policy)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;리소스 (resource)&lt;/strong&gt; 의 최대 권한을 정의하는 조직 정책 (2024 도입).&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:#6A737D&quot;&gt;// 특정 계정 이외의 principal 이 버킷 정책으로 접근 못 하도록&lt;/span&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;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;EnforceOrgIdentities&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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;Principal&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;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:*&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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;StringNotEqualsIfExists&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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:PrincipalOrgID&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-xxx&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;SCP vs RCP&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SCP&lt;/strong&gt; = 계정 안의 IAM principal (누가) 의 상한&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RCP&lt;/strong&gt; = 계정 안의 resource (무엇에) 의 상한&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대표 시나리오&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OU 전체 S3 버킷이 실수로 퍼블릭 되지 않도록&lt;/li&gt;
&lt;li&gt;조직 밖 principal 의 KMS 키 사용 차단&lt;/li&gt;
&lt;li&gt;특정 리소스 태그 없이 접근 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;정책-평가-로직-핵심&quot;&gt;정책 평가 로직 (핵심)&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;① 명시적 Deny 확인 → 있으면 즉시 거부 (short-circuit)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;② RCP (조직 리소스 상한) → 통과해야 함&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;③ SCP (조직 계정 상한) → 통과해야 함&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;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;→ 최종: Deny 없고 + 최소 하나의 Allow + 모든 상한 통과 → 허용&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;명시적 Deny &gt; 명시적 Allow &gt; 암묵적 Deny&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;부여 정책&lt;/strong&gt; (identity + resource-based) = &lt;strong&gt;합집합&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;상한 정책&lt;/strong&gt; (SCP, RCP, boundary, session) = &lt;strong&gt;교집합&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자세히: [[aws-iam|IAM]] 정책 평가.&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;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;사용자/그룹/역할&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&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;S3, SQS, KMS 등&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O + 교차 계정&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;X (상한만)&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;SCP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Root/OU/계정&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X (상한만)&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;RCP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Root/OU/계정&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X (상한만)&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;X (상한만)&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;부여&lt;/strong&gt; 하는 것은 자격 증명/리소스 기반 정책뿐. 나머지는 &lt;strong&gt;상한만&lt;/strong&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;strong&gt;SCP&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;RCP&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;리소스 정책 상한 (2024+)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Tag Policy&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;Backup Policy&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS Backup 정책 중앙 관리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AI Services Opt-out&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AI 서비스가 데이터를 학습에 사용 못하게&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Chatbot Policy&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS Chatbot 사용 제어 (2024+)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Declarative&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2 IMDSv2 강제 등 서비스별 선언 (2024+)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;통합-결제-consolidated-billing&quot;&gt;통합 결제 (Consolidated Billing)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;모든 멤버 계정 청구서 통합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;볼륨 할인 자동 합산&lt;/strong&gt; ([[aws-s3|S3]] 등 계층 할인)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RI (Reserved Instance)&lt;/strong&gt; 와 &lt;strong&gt;Savings Plans&lt;/strong&gt; 자동 공유&lt;/li&gt;
&lt;li&gt;세금 목적 개별 계정 청구서도 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;aws-control-tower&quot;&gt;AWS Control Tower&lt;/h2&gt;
&lt;p&gt;Organizations 기반으로 &lt;em&gt;랜딩 존 (landing zone)&lt;/em&gt; 을 모범 사례대로 자동 구성.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;포함&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organizations + OU 계층 (Security, Prod, Sandbox 등)&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail|CloudTrail]] 조직 전체 활성화&lt;/li&gt;
&lt;li&gt;[[aws-config|AWS Config]] 규칙 배포&lt;/li&gt;
&lt;li&gt;LogArchive 계정 + Audit 계정 자동 프로비저닝&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가드레일&lt;/strong&gt; (Preventive = SCP / Detective = Config Rule) 세트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;: 신규 계정 (Account Factory) 을 요청하면 자동으로 표준 규칙 적용된 상태로 생성.&lt;/p&gt;
&lt;h2 id=&quot;서비스-활성화-trusted-access&quot;&gt;서비스 활성화 (Trusted Access)&lt;/h2&gt;
&lt;p&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;[[aws-cloudtrail|CloudTrail]]&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;조직 전체 trail 생성 (모든 계정 이벤트 수집)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-config|Config]]&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;조직 전체 규칙/aggregator&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;AWS Backup&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;GuardDuty&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Delegated Admin 이 조직 전체 관리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Security Hub&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-iam|IAM]] Identity Center&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중앙 SSO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;AWS RAM&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;Service Catalog&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;delegated-administrator-위임-관리&quot;&gt;Delegated Administrator (위임 관리)&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;Management Account (관리 계정)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └── Delegated Admin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       ├── Security Hub → Audit Account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       ├── GuardDuty → Audit Account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       ├── Config Aggregator → Audit Account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       └── Cost &amp;#x26; Usage → Finance Account&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;h2 id=&quot;계정-라이프사이클&quot;&gt;계정 라이프사이클&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account Factory&lt;/strong&gt; (Control Tower) / &lt;strong&gt;CreateAccount&lt;/strong&gt; API 로 프로비저닝&lt;/li&gt;
&lt;li&gt;Root 이메일/이름 지정&lt;/li&gt;
&lt;li&gt;자동으로 조직 가입, 지정된 OU 로 이동&lt;/li&gt;
&lt;li&gt;SCP/RCP 자동 상속&lt;/li&gt;
&lt;li&gt;삭제/이관은 별도 API + 이관 절차&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;SCP 는 관리 계정에 적용 안 됨&lt;/strong&gt;. 관리 계정에서 위험한 작업이 가능. 관리 계정은 최소 사용, 위임 관리자 활용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;SCP 는 권한을 부여하지 않는다&lt;/strong&gt;. &lt;code&gt;Allow&lt;/code&gt; 만 있는 SCP 는 아무 일도 안 일어남 (가드레일일 뿐, IAM Allow 별도 필요).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;명시적 Deny 는 무엇으로도 못 뒤집는다&lt;/strong&gt;. SCP/RCP/경계/리소스/자격 증명 어디든 Deny 가 있으면 그대로 거부.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;전역 서비스 (IAM, CloudFront, Route53) 는 리전 제약 SCP 에서 예외 처리&lt;/strong&gt; 필요. 안 하면 IAM 조작 자체가 막힐 수 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;OU 최대 5단계 중첩&lt;/strong&gt;. 지나치게 깊은 계층은 관리 부담. 보통 2-3 단계 (Environment / Business Unit).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;RCP 는 신규 (2024+)&lt;/strong&gt;. 지원 서비스 목록 확인 필수 ([[aws-s3|S3]], [[aws-sqs|SQS]], KMS, Secrets Manager, STS 부터 확장 중).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Control Tower 로 만든 랜딩 존을 임의 수정&lt;/strong&gt; = 다음 업데이트에서 롤백. 커스터마이징은 Account Factory Customization Framework (AFT) 로.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-iam|AWS IAM]] - 계정 내 권한 관리&lt;/li&gt;
&lt;li&gt;[[aws-sts-assume-role|STS AssumeRole]] - 교차 계정 접근&lt;/li&gt;
&lt;li&gt;[[aws-cloudtrail|CloudTrail]] - 조직 전체 감사&lt;/li&gt;
&lt;li&gt;[[aws-config|AWS Config]] - 규정 준수 규칙&lt;/li&gt;
&lt;li&gt;[[aws-kms|KMS]] - RCP 로 조직 밖 접근 차단&lt;/li&gt;
&lt;li&gt;[[aws-s3|S3]] - RCP 로 퍼블릭 방지&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>organizations</category><category>governance</category><category>iam</category><category>multi-account</category><author>koa (김신건)</author></item><item><title>[AWS] Public Subnet vs Private Subnet</title><link>https://shinkeonkim.com/wiki/cloud/aws-subnet-public-private/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-subnet-public-private/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Public Subnet&lt;/strong&gt; 과 &lt;strong&gt;Private Subnet&lt;/strong&gt; 은 [[aws-vpc|VPC]] 의 서브넷 유형 이름 같지만, 사실은 &lt;em&gt;서브넷 자체의 속성이 아니라 라우트 테이블 (Route Table) 구성에 따른 결과적 분류&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public Subnet&lt;/strong&gt;: 라우트 테이블에 &lt;strong&gt;&lt;code&gt;0.0.0.0/0 → Internet Gateway&lt;/code&gt;&lt;/strong&gt; 라우트가 있는 서브넷&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private Subnet&lt;/strong&gt;: 그런 라우트가 &lt;strong&gt;없는&lt;/strong&gt; 서브넷 (인터넷 직접 접근 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: &lt;em&gt;“Public / Private” 은 AWS API 나 서브넷 속성이 아니라, 라우트 테이블 설정으로 결정되는 관습적 분류&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;왜-이-분류가-관습이-되었나&quot;&gt;왜 이 분류가 관습이 되었나&lt;/h2&gt;
&lt;p&gt;전통 3-tier 웹 아키텍처의 보안 원칙:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인터넷에 노출되는 것은 최소한만 (ALB, bastion 등)&lt;/li&gt;
&lt;li&gt;실제 앱 서버, DB 는 인터넷에서 직접 접근 불가&lt;/li&gt;
&lt;li&gt;앱 서버가 필요할 때만 outbound 로 인터넷 접근 (패키지 설치 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 요구를 만족하려면 서브넷을 &lt;strong&gt;인터넷 접근 가능 / 불가능&lt;/strong&gt; 두 그룹으로 나눠 다르게 라우팅. AWS 커뮤니티가 각각 “public subnet”, “private subnet” 이라고 부르기 시작한 것.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;중요&lt;/strong&gt;: AWS 콘솔의 서브넷 리소스에는 “public” / “private” 이라는 필드가 &lt;strong&gt;없다&lt;/strong&gt;. 라우트 테이블 확인이 유일한 판별 방법.&lt;/p&gt;
&lt;h2 id=&quot;public-subnet-조건-모두-만족해야&quot;&gt;Public Subnet 조건 (모두 만족해야)&lt;/h2&gt;
&lt;p&gt;인스턴스가 실제로 인터넷과 통신하려면:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VPC 에 Internet Gateway 부착&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;서브넷의 라우트 테이블에 &lt;code&gt;0.0.0.0/0 → IGW&lt;/code&gt; 라우트&lt;/strong&gt; 존재&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스에 Public IPv4 또는 Elastic IP&lt;/strong&gt; 부여&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Group 이 인바운드/아웃바운드 허용&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NACL 도 허용&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이 5가지 중 하나라도 빠지면 인터넷 통신 안 됨. 흔한 실수: IGW 붙이고 라우트도 넣었지만 EC2 에 Public IP 가 없어서 접근 실패.&lt;/p&gt;
&lt;h3 id=&quot;auto-assign-public-ip&quot;&gt;Auto-assign Public IP&lt;/h3&gt;
&lt;p&gt;서브넷 속성 &lt;code&gt;MapPublicIpOnLaunch&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;True&lt;/strong&gt;: 이 서브넷에서 시작한 EC2 는 자동으로 Public IPv4 할당&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;False&lt;/strong&gt;: 명시적 지정 필요 (또는 EIP 부착)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Default VPC 의 기본 서브넷&lt;/strong&gt;: &lt;code&gt;MapPublicIpOnLaunch = True&lt;/code&gt; (편의)
&lt;strong&gt;신규 커스텀 VPC 의 서브넷&lt;/strong&gt;: &lt;code&gt;False&lt;/code&gt; (안전)&lt;/p&gt;
&lt;h2 id=&quot;private-subnet-의-인터넷-접근&quot;&gt;Private Subnet 의 인터넷 접근&lt;/h2&gt;
&lt;p&gt;Private subnet 안 EC2 도 outbound 로 인터넷 접근이 필요한 경우 흔함:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OS 패키지 업데이트 (&lt;code&gt;apt update&lt;/code&gt;, &lt;code&gt;yum update&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Docker 이미지 pull&lt;/li&gt;
&lt;li&gt;외부 API 호출 (Stripe, SendGrid 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;해결책 4가지&lt;/strong&gt; (트레이드오프 있음):&lt;/p&gt;
&lt;h3 id=&quot;1-nat-gateway-표준&quot;&gt;1. NAT 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;Private Subnet 라우트 테이블:&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 Gateway (public subnet 안)&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;NAT Gateway 라우트 테이블 (자기가 있는 public subnet):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  0.0.0.0/0 → IGW&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Public subnet 안에 NAT Gateway 배치&lt;/li&gt;
&lt;li&gt;Private subnet → NAT Gateway → IGW → 인터넷&lt;/li&gt;
&lt;li&gt;인터넷 → private subnet 은 여전히 불가 (unsolicited inbound 차단)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;요금&lt;/strong&gt;: 시간당 + GB 처리 (누적 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-nat-instance-레거시&quot;&gt;2. NAT Instance (레거시)&lt;/h3&gt;
&lt;p&gt;EC2 인스턴스 하나를 NAT 역할로 (source/dest check 비활성). 옛 방식. 신규는 NAT Gateway 사용.&lt;/p&gt;
&lt;h3 id=&quot;3-vpc-endpoint-인터넷-우회&quot;&gt;3. VPC Endpoint (인터넷 우회)&lt;/h3&gt;
&lt;p&gt;AWS 서비스 접근만 필요하면 인터넷 대신 [[aws-vpc-endpoints|VPC Endpoint]]:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3, DynamoDB → Gateway Endpoint (무료)&lt;/li&gt;
&lt;li&gt;KMS, ECR, SSM 등 → Interface Endpoint&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-egress-only-internet-gateway-ipv6-전용&quot;&gt;4. Egress-only Internet Gateway (IPv6 전용)&lt;/h3&gt;
&lt;p&gt;IPv6 에는 NAT 개념이 없음. 대신 “egress-only IGW” 로 outbound 만 허용.&lt;/p&gt;
&lt;h2 id=&quot;아키텍처-표준-3-tier&quot;&gt;아키텍처 (표준 3-tier)&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;    Internet[인터넷]&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;    subgraph 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;        IGW[&quot;Internet Gateway&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;        subgraph AZa[&quot;AZ-a&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            subgraph PubA[&quot;Public Subnet A&amp;#x3C;br/&gt;10.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;                ALB1[&quot;ALB Node&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                NAT[&quot;NAT Gateway&quot;]&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;            subgraph PrivAppA[&quot;Private App Subnet A&amp;#x3C;br/&gt;10.0.11.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                App1[&quot;App EC2&quot;]&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;            subgraph PrivDBA[&quot;Private DB Subnet A&amp;#x3C;br/&gt;10.0.21.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                DB1[&quot;RDS Primary&quot;]&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;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        subgraph AZb[&quot;AZ-b&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            subgraph PubB[&quot;Public Subnet B&amp;#x3C;br/&gt;10.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;                ALB2[&quot;ALB Node&quot;]&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;            subgraph PrivAppB[&quot;Private App Subnet B&amp;#x3C;br/&gt;10.0.12.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                App2[&quot;App EC2&quot;]&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;            subgraph PrivDBB[&quot;Private DB Subnet B&amp;#x3C;br/&gt;10.0.22.0/24&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                DB2[&quot;RDS Standby&quot;]&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;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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Internet &amp;#x3C;--&gt; IGW&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IGW &amp;#x3C;--&gt; ALB1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    IGW &amp;#x3C;--&gt; ALB2&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;    ALB1 --&gt; App1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ALB2 --&gt; App2&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;    App1 --&gt; DB1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App2 --&gt; DB1&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;    App1 -.-&gt;|&quot;outbound&amp;#x3C;br/&gt;인터넷&quot;| NAT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App2 -.-&gt; NAT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NAT --&gt; IGW&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;Public Subnet (ALB, NAT Gateway, bastion)&lt;/strong&gt;: 인터넷과 직접 통신. 최소 리소스만.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private App Subnet (EC2, ECS, Lambda)&lt;/strong&gt;: ALB 뒤 애플리케이션. Outbound 인터넷은 NAT 로.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private DB Subnet (RDS, ElastiCache)&lt;/strong&gt;: 앱 서버만 접근. Outbound 도 대개 불필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;라우트-테이블의-차이-핵심&quot;&gt;라우트 테이블의 차이 (핵심)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Public Subnet 라우트 테이블&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;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          igw-abc123      ← Internet Gateway&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Private Subnet 라우트 테이블 (NAT 있음)&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;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-xyz789      ← NAT Gateway (public subnet 안)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Private Subnet 라우트 테이블 (NAT 없음)&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;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 라우트 없음)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;private-subnet-은-정말-격리인가&quot;&gt;Private Subnet 은 정말 격리인가&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;주의&lt;/strong&gt;: “Private Subnet 이면 안전하다” 는 오해.&lt;/p&gt;
&lt;p&gt;Private subnet 안 EC2 도 다음이면 접근 가능:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;다른 VPC&lt;/strong&gt; ([[aws-vpc|VPC]] Peering / Transit Gateway 로 연결됨)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;온프레미스&lt;/strong&gt; (Direct Connect / VPN 으로 연결됨)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPC 내부 다른 서브넷&lt;/strong&gt; (라우트 + SG 가 허용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;격리는 Security Group / NACL 로 명시적 통제&lt;/strong&gt;. Private subnet 만으로는 보안 완결 X.&lt;/p&gt;
&lt;h2 id=&quot;서브넷-크기-계획&quot;&gt;서브넷 크기 계획&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AWS 는 서브넷 앞 4개 + 마지막 1개 IP 를 예약&lt;/strong&gt;:&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;서브넷 IP&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;.0&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;.1&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPC router&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;.2&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS DNS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;.3&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;.255&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;code&gt;10.0.1.0/24&lt;/code&gt; (256 IP) → 실제 사용 가능 251 IP&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;/28&lt;/code&gt; (16 IP) - 매우 작음, 실 사용 11개. VPC endpoint 서브넷 등&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/24&lt;/code&gt; (256 IP) - 작은 서브넷. 소규모 앱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/22&lt;/code&gt; (1024 IP) - 중간. 대부분 워크로드&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/20&lt;/code&gt; (4096 IP) - Default VPC 서브넷 크기&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/16&lt;/code&gt; - VPC CIDR 상한 (서브넷은 /16 불가, 최대 /16 은 VPC 자체)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes / EKS&lt;/strong&gt;: Pod 마다 IP 소비 → 큰 서브넷 (&lt;code&gt;/22&lt;/code&gt; 이상) 권장.&lt;/p&gt;
&lt;h2 id=&quot;명명-관례&quot;&gt;명명 관례&lt;/h2&gt;
&lt;p&gt;AWS 공식 이름은 없지만 관용:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;#x3C;env&gt;-public-&amp;#x3C;az&gt;&lt;/code&gt; (예: &lt;code&gt;prod-public-1a&lt;/code&gt;, &lt;code&gt;prod-public-1b&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;#x3C;env&gt;-private-app-&amp;#x3C;az&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;#x3C;env&gt;-private-db-&amp;#x3C;az&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Terraform / CloudFormation 에서 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;yaml&quot;&gt;&lt;code&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&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;Tier&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:#9ECBFF&quot;&gt;public / private-app / private-db&lt;/span&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;Name&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:#9ECBFF&quot;&gt;prod-private-app-1a&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;“Public / Private” 은 서브넷 속성이 아님&lt;/strong&gt;. 라우트 테이블만이 진실. 헷갈리면 서브넷의 route table 을 실제 확인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Public IP 없이 Internet Gateway 있는 서브넷&lt;/strong&gt; = 인터넷 통신 안 됨. IGW 라우트만으로는 부족, Public IPv4 / EIP 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;NAT Gateway 는 public subnet 에 배치&lt;/strong&gt;. Private subnet 에 NAT 를 놓으면 자기가 인터넷 접근 못함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;NAT Gateway 는 AZ 단위&lt;/strong&gt;. HA 를 위해 각 AZ 마다 별도 NAT 배치. 하나에 몰면 그 AZ 장애 시 전체 outbound 마비 + 크로스 AZ 요금.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Private subnet 만으로 격리 완결 아님&lt;/strong&gt;. 다른 VPC / 온프렘 / 같은 VPC 접근 가능성. SG / NACL 로 명시적 통제.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;AWS 예약 5개 IP&lt;/strong&gt; 를 잊고 &lt;code&gt;/28&lt;/code&gt; 로 만들면 실 사용 11개. 큰 서브넷 필요 시 &lt;code&gt;/28&lt;/code&gt; 지양.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;VPC Endpoint 로 상당 부분 NAT 대체 가능&lt;/strong&gt;. S3 / DynamoDB / KMS / ECR 등이 주 outbound 이면 endpoint 로 NAT 요금 절감.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-vpc|AWS VPC]] - 상위 컨텍스트&lt;/li&gt;
&lt;li&gt;[[aws-vpc-endpoints|VPC Endpoints]] - NAT 대안&lt;/li&gt;
&lt;li&gt;[[aws-eni|ENI]] - Public IP 부여 대상&lt;/li&gt;
&lt;li&gt;[[aws-sg|Security Group]] - 접근 제어&lt;/li&gt;
&lt;li&gt;[[aws-sg-vs-nacl|SG vs NACL]] - subnet 레벨 제어 (NACL)&lt;/li&gt;
&lt;li&gt;[[network-cidr-subnetting|CIDR / Subnetting]] - IP 계산&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>vpc</category><category>network</category><category>subnet</category><author>koa (김신건)</author></item><item><title>[AWS] Redshift ML</title><link>https://shinkeonkim.com/wiki/cloud/aws-redshift-ml/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-redshift-ml/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Redshift ML&lt;/strong&gt; 은 &lt;em&gt;SQL 문 (&lt;code&gt;CREATE MODEL&lt;/code&gt;) 만으로 머신러닝 모델을 학습, 배포, 추론&lt;/em&gt; 하는 기능. 데이터를 Redshift 밖으로 옮기지 않고 학습이 가능하며, 내부적으로 &lt;strong&gt;SageMaker Autopilot&lt;/strong&gt; 이 최적 알고리즘 선택과 하이퍼파라미터 튜닝을 자동 수행. 학습된 모델은 Redshift 안에서 &lt;strong&gt;SQL 함수&lt;/strong&gt; 로 등록되어 &lt;code&gt;SELECT&lt;/code&gt; 안에서 그대로 호출된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 통찰&lt;/strong&gt;: &lt;em&gt;데이터 사이언티스트가 없어도, SQL 만 아는 애널리스트가 ML 을 사용할 수 있다&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;왜-redshift-ml&quot;&gt;왜 Redshift ML&lt;/h2&gt;
&lt;p&gt;전통적 ML 흐름의 문제:&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;1. 데이터를 [[aws-redshift|Redshift]] 에서 export&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. [[aws-s3|S3]] 에 저장&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. SageMaker notebook 에서 데이터 로드&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4. 특징 엔지니어링 (Python, pandas)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5. 알고리즘 선택 + 학습&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;6. 모델 배포 (endpoint or Lambda)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;7. 예측 결과를 다시 Redshift 로 가져오기&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;strong&gt;7 단계, 여러 팀 걸침&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 이동 시 지연 + 보안 문제&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;애널리스트가 SQL 이외 접근 어려움&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결과 다시 저장하는 파이프라인&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Redshift ML 의 답:&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;1. CREATE MODEL FROM (SELECT ... FROM warehouse) TARGET churned&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   → 자동 학습 + 배포 (SQL 한 번)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. SELECT predict_churn(...) FROM customers  → 즉시 예측&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;    subgraph Redshift[&quot;Redshift Cluster / Serverless&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        User[SQL 사용자]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        CM[&quot;CREATE MODEL&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        UDF[&quot;ML 함수&amp;#x3C;br/&gt;(predict_churn 등)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Data[(&quot;데이터 테이블&quot;)]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph AWS_ML[&quot;AWS ML 백엔드&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        S3[(&quot;S3 (training data)&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Autopilot[SageMaker Autopilot]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Deploy[&quot;모델 artifact&amp;#x3C;br/&gt;(로컬 or endpoint)&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    User --&gt;|&quot;SQL&quot;| CM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CM --&gt;|&quot;export&quot;| S3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3 --&gt; Autopilot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Autopilot --&gt;|&quot;학습 + 최적 알고리즘 선택&quot;| Deploy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Deploy --&gt;|&quot;UDF 로 등록&quot;| UDF&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;|&quot;SELECT predict_churn(row)&quot;| UDF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    UDF --&gt; Data&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;ol&gt;
&lt;li&gt;&lt;code&gt;CREATE MODEL&lt;/code&gt; 실행 → 학습 데이터를 [[aws-s3|S3]] 로 export&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SageMaker Autopilot&lt;/strong&gt; 이 알고리즘 선택 + 하이퍼파라미터 튜닝&lt;/li&gt;
&lt;li&gt;학습 완료 → 모델 artifact 저장&lt;/li&gt;
&lt;li&gt;Redshift 안에 &lt;strong&gt;SQL UDF&lt;/strong&gt; 로 등록&lt;/li&gt;
&lt;li&gt;이후 사용자가 &lt;code&gt;SELECT predict_xxx(cols)&lt;/code&gt; 로 그대로 호출&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;모델-유형&quot;&gt;모델 유형&lt;/h2&gt;
&lt;h3 id=&quot;1-auto-autopilot-완전-자동&quot;&gt;1. AUTO (Autopilot 완전 자동)&lt;/h3&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL customer_churn&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; (&lt;/span&gt;&lt;/span&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; age, tenure, monthly_charges, total_charges, ..., churned&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; customers&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:#E1E4E8&quot;&gt; churn_flag_known &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&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:#F97583&quot;&gt;TARGET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churned&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FUNCTION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; predict_churn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SETTINGS (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  S3_BUCKET &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;my-redshift-ml&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;  MAX_RUNTIME &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;/li&gt;
&lt;li&gt;자동 선택: XGBoost, MLP, Linear Learner&lt;/li&gt;
&lt;li&gt;자동 튜닝: HyperParameter Optimization&lt;/li&gt;
&lt;li&gt;자동 검증: hold-out 셋으로 성능 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-user-guided-알고리즘-지정&quot;&gt;2. User-guided (알고리즘 지정)&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL customer_churn_xgb&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; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ... &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; customers)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TARGET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churned&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FUNCTION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; predict_churn_xgb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;MODEL_TYPE XGBOOST&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;OBJECTIVE &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;binary:logistic&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;HYPERPARAMETERS &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DEFAULT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXCEPT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    NUM_ROUND &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;200&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;    ETA &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;0.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;    MAX_DEPTH &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;6&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;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SETTINGS (S3_BUCKET &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&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;지원 알고리즘: XGBoost, MLP, Linear Learner, K-means (클러스터링).&lt;/p&gt;
&lt;h3 id=&quot;3-byom-bring-your-own-model&quot;&gt;3. BYOM (Bring Your Own Model)&lt;/h3&gt;
&lt;p&gt;외부에서 이미 학습한 SageMaker 모델을 Redshift 에서 호출.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Local Inference&lt;/strong&gt; (Redshift 안에서):&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL my_own_model&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:#9ECBFF&quot;&gt; &apos;arn:aws:sagemaker:us-east-1:123:model/my-trained-xgb&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FUNCTION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; my_predict&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&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;XGBoost, MLP, Linear Learner 만 로컬 추론 가능&lt;/li&gt;
&lt;li&gt;Redshift 컴퓨트에서 직접 실행 -&gt; 저지연&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Remote Inference&lt;/strong&gt; (SageMaker 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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL remote_model&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FUNCTION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; predict_remote(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bigint&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, double)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RETURNS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; double&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SAGEMAKER &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;my-sagemaker-endpoint&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SETTINGS (MAX_BATCH_ROWS &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;ul&gt;
&lt;li&gt;임의 알고리즘 (Python, PyTorch, TF 등) 사용 가능&lt;/li&gt;
&lt;li&gt;호출당 SageMaker endpoint 요금 + 지연 (~ms-100ms)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-llm--foundation-model-bedrock-연동&quot;&gt;4. LLM / Foundation Model (Bedrock 연동)&lt;/h3&gt;
&lt;p&gt;Amazon Bedrock 의 LLM 을 SQL 로 호출.&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL llm_summarizer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FUNCTION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; summarize_text(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar&lt;/span&gt;&lt;span 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;RETURNS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;MODEL_TYPE BEDROCK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SETTINGS (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  MODEL_ID &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;anthropic.claude-v2: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;  PROMPT &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Summarize the following text in one sentence: &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;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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; article_id, summarize_text(body) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; summary&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; articles;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;RESPONSE_TYPE&lt;/strong&gt;: &lt;code&gt;VARCHAR&lt;/code&gt; (단순 텍스트) 또는 &lt;code&gt;SUPER&lt;/code&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;감정 분석&lt;/li&gt;
&lt;li&gt;임베딩 생성 (Bedrock Titan Embeddings)&lt;/li&gt;
&lt;li&gt;RAG 파이프라인 (Redshift 데이터를 프롬프트 컨텍스트로)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;super-데이터-타입-활용&quot;&gt;SUPER 데이터 타입 활용&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SUPER&lt;/strong&gt; 는 Redshift 의 반정형 데이터 타입 (JSON-like). LLM 응답이나 복잡한 predict 입력에 유용.&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:#6A737D&quot;&gt;-- LLM 응답을 SUPER 로 받아 구조화 필드 추출&lt;/span&gt;&lt;/span&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; article_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       llm_analyze(body).sentiment  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sentiment,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       llm_analyze(body).topics     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; topics,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       llm_analyze(body).confidence &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; confidence&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; articles;&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;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;Local (AUTO / XGBoost 등)&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;Remote (SageMaker endpoint)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수십 - 수백 ms&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;Bedrock (LLM)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수백 ms - 초&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;LLM 태스크&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;배치 vs 단건&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SELECT predict(...) FROM huge_table&lt;/code&gt; -&gt; 각 행마다 함수 호출, 병렬 실행&lt;/li&gt;
&lt;li&gt;로컬 추론이면 매우 빠름 (Redshift 컴퓨트에서 직접)&lt;/li&gt;
&lt;li&gt;원격 추론이면 batch 조율 필요 (&lt;code&gt;MAX_BATCH_ROWS&lt;/code&gt;)&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;sql&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:#E1E4E8&quot;&gt;SHOW MODEL 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;-- 특정 모델 상세&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SHOW MODEL customer_churn;&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;DROP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL customer_churn;&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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; model_name, model_state, function_name, training_start_time&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; SVV_ML_MODEL_INFO;&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;&lt;strong&gt;이탈 예측 (Churn Prediction)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AUTO (이진 분류)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;매출 예측 (Forecasting)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AUTO (회귀)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;고객 세분화 (Segmentation)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;User-guided (K-means)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;부정 거래 감지 (Fraud)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AUTO 또는 BYOM (unbalanced 클래스)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;추천 (LTV, Next best action)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;User-guided (XGBoost regression)&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;Bedrock (LLM)&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;Bedrock 또는 SageMaker 커스텀&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;BYOM Remote (SageMaker endpoint)&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&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:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MODEL customer_churn&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; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    age, tenure_months, monthly_charges,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    contract_type, payment_method,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    total_gb_used, support_tickets_count,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    churned  &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;  FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; analytics&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;churn_training_data&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:#E1E4E8&quot;&gt; observation_date &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;2025-01-01&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;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TARGET&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churned&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FUNCTION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; predict_churn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SETTINGS (S3_BUCKET &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;my-ml&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, MAX_RUNTIME &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;7200&lt;/span&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;-- 2. 학습 완료 확인 (Autopilot 30분 - 몇 시간)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;SHOW MODEL customer_churn;&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. 예측 (매일 실행 가능)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; churn_scores&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  customer_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  predict_churn(age, tenure_months, monthly_charges,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                contract_type, payment_method,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                total_gb_used, support_tickets_count) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churn_probability&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; customers&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:#E1E4E8&quot;&gt; is_active &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TRUE;&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;-- 4. 하위 시스템으로 전달 (예: 마케팅)&lt;/span&gt;&lt;/span&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; customer_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; churn_scores&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:#E1E4E8&quot;&gt; churn_probability &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&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;7&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; churn_probability &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DESC&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;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;학습&lt;/strong&gt;: SageMaker Autopilot 학습 시간 (수 분 - 수 시간) × SageMaker 요금&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;로컬 추론&lt;/strong&gt;: Redshift 컴퓨트 (기존 쿼리 비용에 포함)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;원격 추론&lt;/strong&gt;: SageMaker endpoint 시간 + 호출당 요금&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bedrock LLM&lt;/strong&gt;: Bedrock 요금 (토큰당)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;저장&lt;/strong&gt;: S3 (모델 artifact)&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;AUTO 모드 학습 시간 예측 어려움&lt;/strong&gt;. &lt;code&gt;MAX_RUNTIME&lt;/code&gt; 을 설정해 폭주 방지 (기본 5400 초).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;원격 추론 (SageMaker endpoint)&lt;/strong&gt; 은 매 예측마다 endpoint 호출. 대량 배치에는 로컬 추론 가능한 알고리즘 (XGBoost 등) 이 훨씬 저렴/빠름.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;불균형 라벨 (예: 이탈 5%)&lt;/strong&gt; 은 AUTO 가 자동 처리하지만, 검증 지표 (F1, AUC) 확인 필수. Accuracy 만 보면 오해.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Feature engineering 은 사전 SQL 로&lt;/strong&gt;. Redshift ML 은 raw 데이터 -&gt; 예측이 목적이므로, 복잡한 특징은 &lt;code&gt;WITH&lt;/code&gt; / view 로 미리 만들어 놓기.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Bedrock LLM 은 토큰당 과금&lt;/strong&gt;. 대량 처리 시 비용 폭탄. 샘플링 / 결과 캐시 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;모델 재학습 자동 아님&lt;/strong&gt;. 데이터 drift 시 수동 &lt;code&gt;CREATE MODEL&lt;/code&gt; 재실행. Airflow 등으로 스케줄링.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;BYOM 로컬 추론은 지원 알고리즘 제한&lt;/strong&gt; (XGBoost, MLP, Linear Learner). 그 외는 원격 추론.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-redshift|Amazon Redshift]] - 상위 서비스&lt;/li&gt;
&lt;li&gt;[[aws-redshift-serverless|Redshift Serverless]] - Serverless 에서도 사용 가능&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - 개념&lt;/li&gt;
&lt;li&gt;[[aws-s3|AWS S3]] - 모델 artifact 저장&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - default 역할&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>redshift</category><category>ml</category><category>machine-learning</category><category>sagemaker</category><category>bedrock</category><author>koa (김신건)</author></item><item><title>[AWS] Redshift Serverless</title><link>https://shinkeonkim.com/wiki/cloud/aws-redshift-serverless/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-redshift-serverless/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon Redshift Serverless&lt;/strong&gt; 는 &lt;em&gt;[[aws-redshift|Redshift]] 를 클러스터 프로비저닝 없이 사용&lt;/em&gt; 하는 방식. 컴퓨트 (RPU) 가 워크로드에 맞춰 자동 확장/축소되며, 유휴 시 요금이 없다. 스토리지는 [[data-warehouse|DW]] 를 위한 관리형 계층 (RMS, Redshift Managed Storage) 이 [[aws-s3|S3]] 위에 별도로 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: &lt;em&gt;워크로드 예측 불가 / 스파이키 / 개발 및 애드혹&lt;/em&gt; 상황에서 클러스터 관리 부담 없이 [[mpp|MPP]] 를 이용.&lt;/p&gt;
&lt;h2 id=&quot;왜-serverless-인가&quot;&gt;왜 Serverless 인가&lt;/h2&gt;
&lt;p&gt;전통 Provisioned Redshift 의 문제:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;유휴 시에도 인스턴스-시간 요금&lt;/strong&gt; (24 시간 켜져 있으면 그만큼)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;트래픽 급증&lt;/strong&gt; 시 수동으로 노드 추가 필요 (수 분 프로비저닝)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;워크로드 관리 (WLM) 튜닝&lt;/strong&gt; 부담&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cluster resize 는 read-only 시간 발생&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Serverless 의 해결:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;초 단위 과금&lt;/strong&gt; (RPU-hour, 실제 실행 시간만)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자동 확장&lt;/strong&gt; (RPU 상한 안에서)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WLM 자동&lt;/strong&gt; (수동 튜닝 불필요)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유휴 시 0 원&lt;/strong&gt;&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;    Client[&quot;BI / JDBC / redshift-data API&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;    subgraph Namespace[&quot;Namespace&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;        DB1[(&quot;dev DB&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        DB2[(&quot;analytics DB&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Users[&quot;Users / Roles&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Workgroups[&quot;Workgroups (컴퓨트)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        WG1[&quot;Workgroup &apos;etl&apos;&amp;#x3C;br/&gt;Base 32 RPU, Max 512&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        WG2[&quot;Workgroup &apos;bi&apos;&amp;#x3C;br/&gt;Base 16 RPU, Max 256&quot;]&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client --&gt;|&quot;endpoint 접속&quot;| WG1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Client --&gt;|&quot;endpoint 접속&quot;| WG2&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;    WG1 -.-&gt;|&quot;쿼리 대상&quot;| Namespace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    WG2 -.-&gt;|&quot;쿼리 대상&quot;| Namespace&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;    Namespace --&gt; RMS[(&quot;Redshift Managed Storage&amp;#x3C;br/&gt;(S3 위에 구축, SSD 캐시)&quot;)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;namespace-논리적-저장--사용자&quot;&gt;Namespace (논리적 저장 + 사용자)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;데이터베이스 / 스키마 / 테이블 / 사용자 / 권한&lt;/em&gt; 의 논리 그룹.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Snapshot / 복원 / KMS 암호화 / [[aws-iam|IAM]] role 이 여기에 붙음&lt;/li&gt;
&lt;li&gt;하나의 namespace 는 여러 workgroup 이 공유 가능&lt;/li&gt;
&lt;li&gt;삭제 시 데이터 손실 (백업 별도)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;workgroup-컴퓨트-설정&quot;&gt;Workgroup (컴퓨트 설정)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;RPU 용량 + 네트워크 (VPC/보안 그룹) + 엔드포인트 설정&lt;/em&gt; 등 컴퓨트 관련 설정.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하나의 namespace 에 여러 workgroup (ETL 용 / BI 용 분리)&lt;/li&gt;
&lt;li&gt;workgroup 마다 base capacity, max capacity, 사용량 한도 별도&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;분리 이유&lt;/strong&gt;: 같은 데이터에 대해 워크로드별로 다른 컴퓨트 정책 적용.&lt;/p&gt;
&lt;h2 id=&quot;rpu-redshift-processing-unit&quot;&gt;RPU (Redshift Processing Unit)&lt;/h2&gt;
&lt;p&gt;Redshift Serverless 요금의 기본 단위.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 RPU&lt;/strong&gt; ≈ 소량의 CPU + 메모리 + 네트워크 조합 (구체 스펙 비공개, AWS 관리)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Base capacity&lt;/strong&gt;: 워크그룹의 최소 RPU (기본 8, 최소 8, 최대 512)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Max capacity&lt;/strong&gt;: 자동 확장 상한&lt;/li&gt;
&lt;li&gt;실제 실행 초 단위로 과금&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;base-capacity-선택-감각&quot;&gt;Base capacity 선택 감각&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Base RPU&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;8&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;16-32&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;64-128&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중대형 (concurrent 사용자 다수)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;팀 BI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;256-512&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;Base 가 너무 낮으면 첫 쿼리 지연&lt;/strong&gt; (급격한 스케일 업 필요). 프로덕션은 최소 16-32 부터 시작 후 사용 패턴 관찰.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;자동-확장-auto-scaling&quot;&gt;자동 확장 (Auto-Scaling)&lt;/h2&gt;
&lt;p&gt;Serverless 는 두 가지 방향으로 자동 확장.&lt;/p&gt;
&lt;h3 id=&quot;1-base-넘어서-위로-concurrency-scaling&quot;&gt;1. Base 넘어서 위로 (concurrency scaling)&lt;/h3&gt;
&lt;p&gt;동시 쿼리 부하가 base capacity 를 초과하면 자동으로 추가 RPU 할당 (max capacity 까지).&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;: 유휴 감지 후 자동으로 base 로 복귀&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-ai-driven-scaling-2024&quot;&gt;2. AI-driven Scaling (2024+)&lt;/h3&gt;
&lt;p&gt;과거 워크로드 패턴을 학습해 &lt;em&gt;쿼리 시작 전에 미리&lt;/em&gt; 확장. Cold query 지연 감소.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;: 사용자는 base/max 만 정하고, 실제 확장은 완전 자동.&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;    (실행된 RPU 초당 요금)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  + (RMS 저장 요금, GB-월)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  + (Concurrency Scaling / Spectrum / Zero-ETL 등 별도)&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;초 단위 (최소 60 초)&lt;/strong&gt;: 짧은 쿼리 여러 개도 정확히&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;base RPU × 실행 시간&lt;/strong&gt;: 유휴는 청구 X&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;compute 와 storage 분리 청구&lt;/strong&gt;: 저장 요금은 실행 여부 무관&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;계산 예 (us-east-1, 2026 대략)&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;Base 16 RPU × $0.375/RPU-hour × 하루 8 시간 실행 × 30일&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;= 16 × 0.375 × 8 × 30 = $1,440 /월&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;+ RMS 스토리지 500 GB × $0.024/GB-월 = $12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;= 총 ~$1,452 /월&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Provisioned RA3 대비&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하루 24 시간 균등 부하 -&gt; Provisioned 저렴할 수 있음&lt;/li&gt;
&lt;li&gt;하루 8 시간 스파이키 -&gt; Serverless 저렴&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rms-redshift-managed-storage&quot;&gt;RMS (Redshift Managed Storage)&lt;/h2&gt;
&lt;p&gt;Serverless / RA3 의 공통 스토리지 계층. &lt;em&gt;[[aws-s3|S3]] 위에 구축된 컬럼형 저장소&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;동작&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hot&lt;/strong&gt; 데이터: 로컬 SSD 캐시&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cold&lt;/strong&gt; 데이터: S3 tiered&lt;/li&gt;
&lt;li&gt;사용자는 계층 관리 불필요 (자동)&lt;/li&gt;
&lt;li&gt;저장 요금은 실제 GB 사용량 기반&lt;/li&gt;
&lt;/ul&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;&lt;/li&gt;
&lt;li&gt;스토리지 사실상 무제한&lt;/li&gt;
&lt;li&gt;유휴 컴퓨트에도 데이터 유지 (Serverless 유휴 = 저장만 청구)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;자세히: [[mpp|MPP]] “현대 MPP: Compute-Storage 분리”.&lt;/p&gt;
&lt;h2 id=&quot;데이터-공유-data-sharing&quot;&gt;데이터 공유 (Data Sharing)&lt;/h2&gt;
&lt;p&gt;Serverless 도 &lt;strong&gt;Data Sharing 완전 지원&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;다른 namespace / 다른 계정 / 다른 리전과 데이터 공유 (복사 없음)&lt;/li&gt;
&lt;li&gt;Producer + Consumer 모델&lt;/li&gt;
&lt;li&gt;각자 자기 컴퓨트로 쿼리, 데이터는 물리적으로 한 곳&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;활용&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;팀 A 는 ETL workgroup, 팀 B 는 BI workgroup 이 같은 데이터 공유&lt;/li&gt;
&lt;li&gt;개발 계정과 프로덕션 계정 간 데이터 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;provisioned-ra3-vs-serverless&quot;&gt;Provisioned RA3 vs Serverless&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;RA3 Provisioned&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Serverless&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;예측 가능한 지속 부하&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;Reserved Instance 로 저렴&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;Cluster 관리 필요&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;WLM&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Manual + Auto&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Auto only&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;0 (base 는 실행 시만)&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;수 분 (resize)&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;Concurrency Scaling 별도&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;8 RPU&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;&lt;strong&gt;새 프로젝트, 워크로드 미지수&lt;/strong&gt; -&gt; &lt;strong&gt;Serverless 부터&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;하루 24 시간 균등 heavy 부하&lt;/strong&gt; -&gt; Provisioned RA3 + RI (비용 30-70% 절감)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;개발 / 테스트 / 애드혹&lt;/strong&gt; -&gt; Serverless&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;사용-사례&quot;&gt;사용 사례&lt;/h2&gt;
&lt;h3 id=&quot;1-ad-hoc--정기-배치-혼재&quot;&gt;1. Ad-hoc + 정기 배치 혼재&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;낮 (BI 대시보드) : ~30 개 동시 쿼리&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;저녁 (ETL 배치) : 대용량 스캔 4시간&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;Serverless 가 각 상황에 맞춰 자동 확장 + 유휴 절약.&lt;/p&gt;
&lt;h3 id=&quot;2-data-sharing-consumer&quot;&gt;2. Data Sharing consumer&lt;/h3&gt;
&lt;p&gt;프로듀서가 Provisioned, 컨슈머는 Serverless. 컨슈머는 저장 비용 없이 컴퓨트만.&lt;/p&gt;
&lt;h3 id=&quot;3-개발--테스트&quot;&gt;3. 개발 / 테스트&lt;/h3&gt;
&lt;p&gt;프로덕션은 Provisioned 로 저렴하게, 개발 팀은 각자 Serverless workgroup.&lt;/p&gt;
&lt;h2 id=&quot;성능--요금-관리&quot;&gt;성능 / 요금 관리&lt;/h2&gt;
&lt;h3 id=&quot;사용량-한도-usage-limits&quot;&gt;사용량 한도 (Usage Limits)&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; redshift-serverless&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create-usage-limit&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-arn&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arn:aws:redshift-serverless:...:workgroup/bi&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;  --usage-type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; serverless-compute&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;  --amount&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 500&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:#9ECBFF&quot;&gt; monthly&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;  --breach-action&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; log&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # log / emit-metric / deactivate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;월/주/일 RPU-hour 한도&lt;/li&gt;
&lt;li&gt;초과 시 알림 / 워크그룹 비활성화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비용 폭탄 방지 필수&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 최근 쿼리와 사용된 RPU&lt;/span&gt;&lt;/span&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; query_id, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;database_name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, query_text,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       compute_seconds, compute_capacity&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; SYS_QUERY_HISTORY&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:#E1E4E8&quot;&gt; start_time &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SYSDATE&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&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; compute_seconds &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DESC&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; LIMIT&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&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;SELECT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; SYS_SERVERLESS_USAGE&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:#E1E4E8&quot;&gt; start_time &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SYSDATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 7&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;통합&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;Serverless 지원&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-redshift-spectrum|Spectrum]] (S3 외부 테이블)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-redshift|Redshift]] Streaming Ingestion&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Data Sharing&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O (producer + consumer)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Zero-ETL (Aurora / RDS / DynamoDB)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-redshift-ml|Redshift ML]]&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Federated Query ([[postgresql|Postgres]], MySQL)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;VPC-only&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;[[aws-lake-formation|Lake Formation]]&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&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;Base RPU 너무 낮음&lt;/strong&gt; = 첫 쿼리 지연 + 스케일 업 오버헤드. 프로덕션은 최소 16-32 부터.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Max capacity 무제한 설정&lt;/strong&gt; = 예상 밖 비용. Usage Limit 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Namespace 삭제 시 데이터 손실&lt;/strong&gt;. 삭제 전 최종 snapshot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Serverless 는 시간 균등 heavy 워크로드에 오히려 비쌈&lt;/strong&gt;. RI 를 활용한 Provisioned RA3 가 30-70% 저렴할 수 있음. 예측 후 선택.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Cold query 지연&lt;/strong&gt;. 오래 유휴 후 첫 쿼리는 스케일 업 시간 (수 초). AI-driven scaling 이 완화 중.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Workgroup / Namespace 개념 혼동&lt;/strong&gt;. Namespace = 저장 + 사용자, Workgroup = 컴퓨트 설정. 하나의 namespace 를 여러 workgroup 이 공유.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-redshift|Amazon Redshift]] - 상위 서비스&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - S3 데이터 쿼리&lt;/li&gt;
&lt;li&gt;[[aws-redshift-ml|Redshift ML]] - SQL ML&lt;/li&gt;
&lt;li&gt;[[mpp|MPP]] - 아키텍처 원리&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - 개념&lt;/li&gt;
&lt;li&gt;[[aws-s3|AWS S3]] - RMS 백엔드&lt;/li&gt;
&lt;li&gt;[[aws-lake-formation|Lake Formation]] - 세분화 권한&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>redshift</category><category>serverless</category><category>data-warehouse</category><category>analytics</category><author>koa (김신건)</author></item><item><title>[AWS] Redshift Spectrum: S3 데이터 직접 쿼리</title><link>https://shinkeonkim.com/wiki/cloud/aws-redshift-spectrum/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-redshift-spectrum/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Redshift Spectrum&lt;/strong&gt; 은 [[aws-redshift|Redshift]] 에서 &lt;em&gt;S3 에 있는 데이터를 로드하지 않고 직접 SQL 로 쿼리&lt;/em&gt; 하는 기능. 별도 Spectrum 실행 계층 (Spectrum layer) 이 S3 스캔/필터를 수행하고, 결과를 Redshift 컴퓨트로 넘겨 aggregation/join.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 이점&lt;/strong&gt;: 페타바이트 S3 데이터에 대해 Redshift 를 확장하지 않고도 쿼리. Cold 데이터는 S3 에, hot 데이터는 Redshift 내부에 두는 [[data-warehouse|lakehouse]] 패턴을 가능하게 함.&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;SQL Client&amp;#x3C;br/&gt;(psql, BI)&quot;] --&gt; Leader[&quot;Redshift Leader Node&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;    Leader --&gt; RedshiftLayer[&quot;Redshift Compute Nodes&amp;#x3C;br/&gt;(내부 테이블 스캔 + JOIN)&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;    Leader --&gt; SpectrumLayer[&quot;Spectrum Layer&amp;#x3C;br/&gt;(수천 노드 auto-scale)&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;    RedshiftLayer --&gt; RMS[(&quot;Redshift Managed Storage&quot;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SpectrumLayer --&gt; S3[(&quot;S3&amp;#x3C;br/&gt;Parquet/ORC/JSON/CSV&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;    SpectrumLayer --&gt;|&quot;필터된 rows&quot;| RedshiftLayer&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;    Glue[(&quot;Glue Data Catalog&quot;)] -.-&gt;|&quot;external schema&quot;| Leader&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redshift 클러스터&lt;/strong&gt;: 필요 (RA3, DC2, Serverless)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spectrum layer&lt;/strong&gt;: AWS 관리, 자동 확장 (사용자 프로비저닝 X)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메타 저장&lt;/strong&gt;: [[aws-glue|Glue Data Catalog]] (또는 Hive Metastore)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터&lt;/strong&gt;: [[aws-s3|S3]] 그대로&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;데이터 레이크 (수 PB S3) + Redshift 조인&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;Cold historical 데이터를 Redshift RMS 에 넣기 아까움&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;ETL 전 raw 데이터 탐색&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;여러 소스 (S3 + Redshift 내부) 통합 쿼리&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;Redshift 로드 없이 애드혹 리포팅&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;짧은 반복 API 백엔드&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;부적합&lt;/em&gt; (Redshift 내부 테이블)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Redshift 없는 순수 애드혹&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;부적합&lt;/em&gt; ([[aws-athena|Athena]])&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;external-schema--table&quot;&gt;External Schema &amp;#x26; Table&lt;/h2&gt;
&lt;h3 id=&quot;external-schema&quot;&gt;External Schema&lt;/h3&gt;
&lt;p&gt;Glue Catalog 의 database 를 Redshift 에 mount.&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SCHEMA&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; spectrum&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:#F97583&quot;&gt; DATA&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; CATALOG&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DATABASE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;my_lake_db&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;IAM_ROLE &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;arn:aws:iam::123456789012:role/RedshiftSpectrumRole&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; DATABASE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; IF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; NOT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXISTS&lt;/span&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;IAM_ROLE&lt;/code&gt;: &lt;code&gt;glue:GetTable*&lt;/code&gt; + &lt;code&gt;s3:GetObject&lt;/code&gt; + &lt;code&gt;s3:ListBucket&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATE EXTERNAL DATABASE&lt;/code&gt;: Glue DB 가 없으면 자동 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;external-table-redshift-자체-등록&quot;&gt;External Table (Redshift 자체 등록)&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:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; EXTERNAL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  sales_id   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  user_id    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BIGINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  product_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  amount     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DECIMAL&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 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:#E1E4E8&quot;&gt;  sale_ts    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TIMESTAMP&lt;/span&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;PARTITIONED &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;year&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;month&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; INT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;STORED &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; PARQUET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LOCATION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://my-lake/sales_parquet/&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;TABLE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; PROPERTIES (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;numRows&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;500000000&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:#6A737D&quot;&gt;-- 파티션 등록&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ALTER&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  ADD&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; PARTITION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;year=&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:#F97583&quot;&gt;month=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;7&lt;/span&gt;&lt;span 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;      LOCATION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;s3://my-lake/sales_parquet/year=2026/month=7/&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;p&gt;또는 [[aws-glue|Glue Crawler]] 로 등록된 테이블을 external schema 로 자동 노출.&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;Predicate Pushdown&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Partitioning&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;[[apache-parquet|Parquet]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SNAPPY / GZIP / ZSTD&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;ORC&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SNAPPY / GZIP / ZSTD&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GZIP&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CSV / TSV&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GZIP&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Avro&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SNAPPY / GZIP / DEFLATE&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;RegexSerDe&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;-&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apache Hudi&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;(Parquet 기반)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Delta Lake&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;(Parquet 기반)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apache Iceberg&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;(Parquet 기반)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Parquet + ZSTD + partitioning&lt;/strong&gt; 이 사실상 표준. CSV 대비 10-100배 요금 절감 + 10-100배 성능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Spectrum layer&lt;/strong&gt;: &lt;code&gt;$5.00 / TB scanned&lt;/code&gt; (us-east-1, 2026).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10 MB 최소 per query&lt;/li&gt;
&lt;li&gt;성공/실패 모두 청구&lt;/li&gt;
&lt;li&gt;DDL 은 무료&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;추가 비용&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redshift 컴퓨트 (RPU-hour or node-hour)&lt;/li&gt;
&lt;li&gt;S3 저장, S3 GET/LIST&lt;/li&gt;
&lt;li&gt;[[aws-glue|Glue Data Catalog]] 요청/저장&lt;/li&gt;
&lt;li&gt;Cross-region 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시 (Parquet + 파티션 프루닝 + 컬럼 프로젝션)&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;raw S3 데이터: 4 TB CSV (uncompressed)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;동일 데이터 Parquet + ZSTD + 파티션: ~1 TB, 컬럼 100개 중 1개 쿼리&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;CSV 전체 스캔:  $5 × 4 TB = $20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Parquet + 프루닝 + 프로젝션:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  실 스캔 = 1 TB × (1/100) × (year 파티션 스킵) ≈ 5 GB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  $5 × 5/1024 TB = $0.024&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  → 800배 절감&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;code&gt;WHERE&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 파티션 프루닝 O (year=2026, month=7 파티션만 스캔)&lt;/span&gt;&lt;/span&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:#79B8FF&quot;&gt; SUM&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:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&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; year&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2026&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; month&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 7&lt;/span&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;-- 파티션 프루닝 X (모든 파티션 스캔)&lt;/span&gt;&lt;/span&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:#79B8FF&quot;&gt; SUM&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:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&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:#E1E4E8&quot;&gt; sale_ts &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-01&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sale_ts &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;2026-08-01&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:#6A737D&quot;&gt;-- 파티션 프루닝 X (함수 적용)&lt;/span&gt;&lt;/span&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:#79B8FF&quot;&gt; SUM&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:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&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:#79B8FF&quot;&gt; YEAR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(sale_ts) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&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&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;교훈&lt;/strong&gt;: 파티션 컬럼은 원본 그대로 (&lt;code&gt;year = 2026&lt;/code&gt;), 함수 wrap 금지.&lt;/p&gt;
&lt;h2 id=&quot;predicate-pushdown&quot;&gt;Predicate Pushdown&lt;/h2&gt;
&lt;p&gt;Parquet/ORC 의 min/max 통계로 row group 을 스킵. Spectrum layer 가 S3 에서 read 하는 단계에서 필터.&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:#6A737D&quot;&gt;-- Parquet row group min/max 로 대부분 스킵&lt;/span&gt;&lt;/span&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:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&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:#E1E4E8&quot;&gt; amount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1000000&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;: 통계가 없으면 스킵 불가. Glue Crawler 는 통계를 생성하지 않음 -&gt; Spark job 으로 write 시 통계 포함해야 함 (&lt;code&gt;write_statistics=True&lt;/code&gt;, 기본).&lt;/p&gt;
&lt;h2 id=&quot;redshift-내부-테이블과의-join&quot;&gt;Redshift 내부 테이블과의 JOIN&lt;/h2&gt;
&lt;p&gt;Spectrum 의 진짜 강점: &lt;em&gt;S3 데이터를 Redshift 내부 dimension 과 조인&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- Fact (S3, Spectrum) x Dimension (Redshift 내부)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  d&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;category&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  SUM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;amount&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; revenue&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:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f      &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- S3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;JOIN&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; internal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;products&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d           &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- Redshift RMS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  ON&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;product_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;product_id&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:#79B8FF&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;year&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2026&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;month&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 7&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; d&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;category&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;Fact 데이터가 큰 경우 (10 TB+), Redshift 에 로드하지 않고 S3 에 두는 것이 저장/관리 비용 이득.&lt;/p&gt;
&lt;h2 id=&quot;concurrency-scaling&quot;&gt;Concurrency Scaling&lt;/h2&gt;
&lt;p&gt;동시 쿼리 부하 시 &lt;em&gt;추가 Spectrum 컴퓨트 자동 프로비저닝&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Serverless: 자동&lt;/li&gt;
&lt;li&gt;Provisioned RA3: 매일 1시간 무료, 이후 초당 노드 요금&lt;/li&gt;
&lt;li&gt;별도 설정 없이 Spectrum 쿼리에도 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;materialized-view-spectrum-위에&quot;&gt;Materialized View (Spectrum 위에)&lt;/h2&gt;
&lt;p&gt;자주 쓰는 Spectrum 쿼리를 Redshift 내부에 pre-compute.&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;CREATE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MATERIALIZED VIEW mv_sales_daily &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  year&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;month&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, product_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  SUM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(amount) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; revenue,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&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; n_sales&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:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sales_parquet&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; year&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2025&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 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;-- 주기적 refresh 또는 auto refresh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;REFRESH MATERIALIZED VIEW mv_sales_daily;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이후 쿼리는 Redshift 내부 MV 를 스캔 (Spectrum 요금 0).&lt;/p&gt;
&lt;h2 id=&quot;aws-athenaathena-vs-spectrum&quot;&gt;[[aws-athena|Athena]] vs Spectrum&lt;/h2&gt;
&lt;p&gt;같은 S3 데이터를 쿼리하는 두 가지 옵션. 근본적으로 다른 아키텍처.&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;Athena&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Redshift Spectrum&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;Trino (Engine v3)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redshift 자체&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;SQL 방언&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Trino/Presto&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;PostgreSQL 계열 (Redshift)&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;X&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O (Redshift)&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;$5/TB scanned&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$5/TB scanned + Redshift 컴퓨트&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;사실상 무제한 (serverless)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;클러스터 한도 (concurrency scaling)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Redshift 내부 데이터와 JOIN&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X (federated 필요)&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;ETL / CTAS&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;제한 (external table 은 read 중심)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;JOIN 성능&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수 (RA3 로컬 shuffle)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Iceberg 트랜잭션&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;애드혹, BI, S3-only&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redshift 기존 자산 + S3 확장&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;이미 Redshift 를 쓰고 S3 데이터를 조인해야 함 -&gt; &lt;strong&gt;Spectrum&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Redshift 없이 S3 만 쿼리 -&gt; &lt;strong&gt;Athena&lt;/strong&gt;&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;콜드-데이터-아카이빙-후-쿼리&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2년 이상 지난 주문 → S3 Parquet (파티션: year/month)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                   → Glue Catalog 등록&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                   → Redshift Spectrum external table&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;Redshift 내부: 최근 2년&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Spectrum:       2년+ 이전&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;UNION ALL 로 통합 뷰&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; VIEW&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; analytics&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.orders_all &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;/span&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:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; internal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders_recent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;UNION ALL&lt;/span&gt;&lt;/span&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:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; FROM&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;orders_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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 애널리스트는 orders_all 만 쿼리, 위치 신경 X&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;nested-parquet-structlist-쿼리&quot;&gt;Nested Parquet (struct/list) 쿼리&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:#6A737D&quot;&gt;-- 중첩 필드 접근&lt;/span&gt;&lt;/span&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:#79B8FF&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;address&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.city, &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&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:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;customers&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c&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&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;-- List 를 UNNEST&lt;/span&gt;&lt;/span&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:#79B8FF&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;customer_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, tag&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:#79B8FF&quot;&gt; spectrum&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;customers&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tag;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Parquet 의 struct/list 를 그대로 SQL 로. Redshift 내부는 flat 이라 이 부분은 Spectrum 만 가능한 워크로드.&lt;/p&gt;
&lt;h2 id=&quot;성능-튜닝-체크리스트&quot;&gt;성능 튜닝 체크리스트&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;[[apache-parquet|Parquet]] / ORC + 압축&lt;/strong&gt; (ZSTD 우선)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파티션 컬럼&lt;/strong&gt; 을 &lt;code&gt;WHERE&lt;/code&gt; 절에 그대로 (함수 wrap X)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파일 크기&lt;/strong&gt; 256 MB - 1 GB (small files 회피)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컬럼 프로젝션&lt;/strong&gt; (SELECT * 금지)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;통계 생성&lt;/strong&gt; (Spark write 시 자동, Crawler 는 안 함)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Materialized View&lt;/strong&gt; 로 반복 쿼리 캐시&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrency Scaling&lt;/strong&gt; 활성화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SVL_S3QUERY_SUMMARY&lt;/code&gt;&lt;/strong&gt; 로 스캔량 모니터링&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;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 실행된 Spectrum 쿼리와 스캔량&lt;/span&gt;&lt;/span&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; userid, query, s3_scanned_bytes, s3_scanned_rows,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       elapsed &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1000000&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:#F97583&quot;&gt; AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; elapsed_sec&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; SVL_S3QUERY_SUMMARY&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:#E1E4E8&quot;&gt; starttime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; SYSDATE&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&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; s3_scanned_bytes &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DESC&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; LIMIT&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&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;&lt;code&gt;SELECT *&lt;/code&gt; on unpartitioned CSV&lt;/strong&gt; = 페타바이트 스캔 = 수천 달러. Workgroup 이 아니라 [[aws-redshift|Redshift]] usage limit 로 제한.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;파티션 컬럼에 함수 적용&lt;/strong&gt; = 파티션 프루닝 실패. &lt;code&gt;WHERE year = 2026&lt;/code&gt; 그대로. &lt;code&gt;WHERE CAST(year AS VARCHAR) = &apos;2026&apos;&lt;/code&gt; 금지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;작은 파일 (수천 개 × &amp;#x3C; 10 MB)&lt;/strong&gt; = Spectrum 노드가 파일마다 GET/파싱 = 성능 붕괴. Compact 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;[[aws-glue|Glue Crawler]] 는 통계 미생성&lt;/strong&gt; -&gt; Predicate pushdown 효과 감소. Spark write 시 &lt;code&gt;write_statistics=True&lt;/code&gt; (기본) 확인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Glacier 오브젝트 는 쿼리 실패&lt;/strong&gt;. Lifecycle 로 Glacier 로 옮긴 파일을 external table 이 참조 -&gt; “InvalidObjectState”. [[aws-s3-glacier|Restore]] 후에만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Cross-region S3&lt;/strong&gt; = 데이터 전송 요금 + 지연. Redshift 와 같은 region S3 유지.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Athena 와 Spectrum 을 오해&lt;/strong&gt;: 이름은 같은 개념이지만 엔진과 SQL 방언이 다름. 쿼리를 서로 그대로 옮기면 안 됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;External Table 스키마 변경 안 반영&lt;/strong&gt; = Redshift 캐시된 스키마와 실제 파일 스키마가 다르면 오류. &lt;code&gt;ALTER TABLE ... SET LOCATION&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-redshift|AWS Redshift]] - Spectrum 을 실행하는 엔진&lt;/li&gt;
&lt;li&gt;[[aws-athena|Amazon Athena]] - 대안 엔진&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - Data Catalog 제공자&lt;/li&gt;
&lt;li&gt;[[aws-s3|AWS S3]] - 데이터 저장소&lt;/li&gt;
&lt;li&gt;[[aws-s3-glacier|S3 Glacier]] - 아카이빙 (Spectrum 쿼리 X)&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - 권장 파일 포맷&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - lakehouse 확장&lt;/li&gt;
&lt;li&gt;[[etl|ETL / ELT]] - S3 데이터 전처리&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - Spectrum role&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>redshift</category><category>spectrum</category><category>s3</category><category>external-table</category><category>analytics</category><author>koa (김신건)</author></item><item><title>[AWS] Region / Availability Zone / Data Center</title><link>https://shinkeonkim.com/wiki/cloud/aws-region-az/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-region-az/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;AWS 인프라의 물리 계층은 &lt;em&gt;“Region → Availability Zone → Data Center”&lt;/em&gt; 3 단계 계층. 각 계층이 격리 (isolation), 지연 (latency), 가용성 (availability) 을 다른 방식으로 제공.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: 지리적으로 분리된 물리 위치 그룹 (예: 서울 &lt;code&gt;ap-northeast-2&lt;/code&gt;, 도쿄 &lt;code&gt;ap-northeast-1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Availability Zone (AZ)&lt;/strong&gt;: 한 리전 안의 &lt;em&gt;물리적으로 분리된&lt;/em&gt; 하나 이상의 데이터센터 클러스터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Center&lt;/strong&gt;: 실제 물리 시설 (건물). AWS 는 이 계층을 사용자에게 노출하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: &lt;em&gt;Region 은 지리, AZ 는 리전 안의 물리적 격리 단위, DC 는 AWS 내부 구현 상세&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;왜-이-계층인가&quot;&gt;왜 이 계층인가&lt;/h2&gt;
&lt;p&gt;세 계층은 각각 다른 실패 모드 (failure mode) 에 대응.&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;Data Center&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;한 건물의 정전, 화재&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AZ 안에 여러 DC → 자동 fail-over&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Availability Zone&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AZ 전체 장애 (정전, 자연재해)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;여러 AZ 배포 (Multi-AZ)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Region&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지역 전체 (드물지만: 지진, 정전, 규제)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Multi-region (DR)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Provider (AWS 전체)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;극단적 경우&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Multi-cloud&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;각 계층 방어는 비용과 복잡도가 증가. 대부분 워크로드는 &lt;strong&gt;Multi-AZ 까지&lt;/strong&gt; 로 충분.&lt;/p&gt;
&lt;h2 id=&quot;region-리전&quot;&gt;Region (리전)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;지리적으로 분리된 영역&lt;/strong&gt;. 각 리전은 독립된 물리 인프라 + 지리적 위치.&lt;/p&gt;
&lt;h3 id=&quot;특성&quot;&gt;특성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;완전 격리 (독립성)&lt;/strong&gt;: 한 리전의 서비스가 다른 리전으로 자동 복제 X (S3 Cross-Region Replication 등 명시적 설정 필요)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자체 규제 준수&lt;/strong&gt;: 데이터 sovereignty (예: EU 데이터가 EU 리전 밖으로 안 나감, 한국 개인정보보호법)&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;리전-명명-규칙&quot;&gt;리전 명명 규칙&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;형식&lt;/strong&gt;: &lt;code&gt;&amp;#x3C;대륙&gt;-&amp;#x3C;방향&gt;-&amp;#x3C;번호&gt;&lt;/code&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;us-east-1&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;us-east-2&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;us-west-2&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;ap-northeast-2&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;ap-northeast-1&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;eu-west-1&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;eu-central-1&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;대표-리전-2026-시점-기준&quot;&gt;대표 리전 (2026 시점 기준)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최다 서비스&lt;/strong&gt;: &lt;code&gt;us-east-1&lt;/code&gt; (버지니아 북부) - 신규 서비스 최초 출시, IAM 등 전역 서비스의 primary&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가장 저렴&lt;/strong&gt;: 오래된 리전 (us-east, us-west) 이 보통 저렴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;격리 리전&lt;/strong&gt;: AWS GovCloud (US), China (Beijing, Ningxia) - 별도 계정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;리전-선택-기준&quot;&gt;리전 선택 기준&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;사용자 지리적 위치&lt;/strong&gt; (지연)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 sovereignty&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;DR 파트너 리전&lt;/strong&gt; (활용도 큰 서비스면 최소 2 리전)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;availability-zone-az&quot;&gt;Availability Zone (AZ)&lt;/h2&gt;
&lt;p&gt;리전 안의 &lt;strong&gt;물리적으로 분리된 데이터센터 클러스터&lt;/strong&gt;. 한 리전은 3+ AZ 로 구성.&lt;/p&gt;
&lt;h3 id=&quot;특성-1&quot;&gt;특성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;하나 이상의 데이터센터 로 구성&lt;/strong&gt; (AZ = DC 는 아님, AZ 는 DC 의 상위 집합)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;독립 전력, 냉각, 네트워킹&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;지리적 분리&lt;/strong&gt; (동일 AZ 라도 여러 DC 가 수 km 떨어져 있을 수 있음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AZ 간 저지연 고대역폭 사설 링크&lt;/strong&gt; (일반적으로 &amp;#x3C; 1 ms, 100+ Gbps)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AZ 장애의 독립성&lt;/strong&gt;: 한 AZ 가 죽어도 다른 AZ 는 영향 X (설계 원칙)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;az-개수&quot;&gt;AZ 개수&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;대부분 리전: &lt;strong&gt;3 AZ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;큰 리전 (&lt;code&gt;us-east-1&lt;/code&gt;, &lt;code&gt;us-west-2&lt;/code&gt;): &lt;strong&gt;6 AZ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;신규/소규모: 3 AZ 로 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;az-명명-name-vs-id-중요-개념&quot;&gt;AZ 명명: Name vs ID (중요 개념)&lt;/h3&gt;
&lt;p&gt;같은 물리 AZ 를 여러 방식으로 지칭.&lt;/p&gt;
&lt;h4 id=&quot;az-name-사용자-관점&quot;&gt;AZ Name (사용자 관점)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;형식: &lt;code&gt;&amp;#x3C;region&gt;-&amp;#x3C;az-letter&gt;&lt;/code&gt; (예: &lt;code&gt;ap-northeast-2a&lt;/code&gt;, &lt;code&gt;ap-northeast-2b&lt;/code&gt;, &lt;code&gt;ap-northeast-2c&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;계정마다 무작위 매핑!&lt;/strong&gt; 계정 A 의 &lt;code&gt;ap-northeast-2a&lt;/code&gt; 와 계정 B 의 &lt;code&gt;ap-northeast-2a&lt;/code&gt; 는 &lt;strong&gt;다른 물리 AZ&lt;/strong&gt; 일 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;왜 무작위 매핑인가&lt;/strong&gt;: AWS 가 최초 몇 년간 대부분 사용자가 &lt;code&gt;us-east-1a&lt;/code&gt; 만 쓰는 것을 발견. 리소스 편중 방지 위해 계정별로 AZ 이름을 물리 AZ 에 무작위 매핑.&lt;/p&gt;
&lt;h4 id=&quot;az-id-물리적-고정-식별자&quot;&gt;AZ ID (물리적 고정 식별자)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;형식: &lt;code&gt;&amp;#x3C;region-code&gt;-az&amp;#x3C;N&gt;&lt;/code&gt; (예: &lt;code&gt;apne2-az1&lt;/code&gt;, &lt;code&gt;apne2-az2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모든 계정에서 동일 물리 AZ 를 가리킴&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;크로스 계정 협업 시 AZ ID 로 소통해야 함&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;# AZ Name → ID 매핑 확인&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; describe-availability-zones&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&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; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --query&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;AvailabilityZones[].[ZoneName,ZoneId]&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;  --output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; table&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;# 예 (계정 A):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ap-northeast-2a → apne2-az1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ap-northeast-2b → apne2-az2&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;# 계정 B (다를 수 있음):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ap-northeast-2a → apne2-az3&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;VPC 공유&lt;/strong&gt; (계정 A 의 subnet 을 계정 B 와 [[aws-organizations|RAM]] 공유): AZ Name 이 아닌 AZ ID 로 매칭&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;크로스 계정 데이터 전송 요금 절감&lt;/strong&gt;: 같은 물리 AZ 사이 전송이 저렴 → AZ ID 로 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재난 복구 계획&lt;/strong&gt;: “us-east-1a 장애” 라는 알림은 계정마다 다른 물리 AZ 일 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;data-center-dc&quot;&gt;Data Center (DC)&lt;/h2&gt;
&lt;p&gt;AZ 를 구성하는 &lt;strong&gt;실제 물리 시설&lt;/strong&gt;. AWS 는 이 계층을 사용자 API 로 노출 X.&lt;/p&gt;
&lt;h3 id=&quot;특성-2&quot;&gt;특성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;하나의 AZ 가 여러 DC 로 구성될 수 있음&lt;/li&gt;
&lt;li&gt;각 DC 는 자체 물리 인프라 (전력, 냉각, 소방)&lt;/li&gt;
&lt;li&gt;DC 간 저지연 고속 광케이블&lt;/li&gt;
&lt;li&gt;지리 분산: 같은 AZ 라도 DC 들이 수 km 떨어져서 화재/폭발 상관 관계 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;사용자가-알-필요-없는-이유&quot;&gt;사용자가 알 필요 없는 이유&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS 가 DC 간 부하 분산과 fail-over 를 자동 관리&lt;/li&gt;
&lt;li&gt;사용자는 AZ 만 지정하면 됨&lt;/li&gt;
&lt;li&gt;DC 계층은 SLA 계산과 내부 리던던시 위한 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;region--az--dc-계층-시각화&quot;&gt;Region / AZ / DC 계층 시각화&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;    Global[&quot;AWS Global Infrastructure&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;    Global --&gt; R1[&quot;Region: ap-northeast-2 (Seoul)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Global --&gt; R2[&quot;Region: us-east-1 (N. Virginia)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Global --&gt; R3[&quot;Region: eu-west-1 (Ireland)&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;    R1 --&gt; AZ1[&quot;AZ: apne2-az1&amp;#x3C;br/&gt;(사용자 계정: 2a 또는 2b 등)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    R1 --&gt; AZ2[&quot;AZ: apne2-az2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    R1 --&gt; AZ3[&quot;AZ: apne2-az3&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    R1 --&gt; AZ4[&quot;AZ: apne2-az4&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;    AZ1 --&gt; DC1[&quot;DC 1 (건물 A)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AZ1 --&gt; DC2[&quot;DC 2 (건물 B)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    AZ1 --&gt; DC3[&quot;DC 3 (건물 C)&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;    Note1[&quot;같은 AZ 안 DC 는&amp;#x3C;br/&gt;&amp;#x3C; 1ms 지연&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note2[&quot;다른 AZ 는&amp;#x3C;br/&gt;&amp;#x3C; 2ms 지연&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note3[&quot;같은 리전 안&amp;#x3C;br/&gt;모든 AZ 인터커넥트&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;multi-az-설계&quot;&gt;Multi-AZ 설계&lt;/h2&gt;
&lt;p&gt;프로덕션 워크로드의 최소 요건.&lt;/p&gt;
&lt;h3 id=&quot;원칙&quot;&gt;원칙&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;컴퓨트 (EC2, ECS, EKS) 를 &lt;strong&gt;최소 2 AZ&lt;/strong&gt; 에 분산&lt;/li&gt;
&lt;li&gt;데이터 저장 (RDS, ElastiCache) 는 &lt;strong&gt;Multi-AZ deployment&lt;/strong&gt; 활성화&lt;/li&gt;
&lt;li&gt;로드밸런서 (ALB, NLB) 는 자동 다중 AZ (사용할 AZ 선택)&lt;/li&gt;
&lt;li&gt;Auto Scaling Group 은 여러 AZ 걸침&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;크로스-az-데이터-전송-요금&quot;&gt;크로스 AZ 데이터 전송 요금&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;같은 AZ 안: &lt;strong&gt;무료&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;다른 AZ (같은 리전): &lt;strong&gt;양방향 GB 당 요금&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;다른 리전: 더 비싼 요금&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;실무 팁&lt;/strong&gt;: 같은 flow 를 같은 AZ 안에서 완결하도록 설계 (예: AZ-local ALB → AZ-local EC2 → AZ-local RDS 라도 이상적).&lt;/p&gt;
&lt;h2 id=&quot;multi-region-설계&quot;&gt;Multi-Region 설계&lt;/h2&gt;
&lt;p&gt;DR (Disaster Recovery), 지연 최적화, 데이터 sovereignty.&lt;/p&gt;
&lt;h3 id=&quot;rto--rpo-목표별-전략&quot;&gt;RTO / RPO 목표별 전략&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;RTO&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;RPO&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;Backup &amp;#x26; Restore&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;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;Pilot Light&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;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;Warm Standby&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;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;Multi-Region Active-Active&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;td align=&quot;left&quot;&gt;매우 높음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;크로스-리전-서비스&quot;&gt;크로스 리전 서비스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3 Cross-Region Replication&lt;/li&gt;
&lt;li&gt;DynamoDB Global Tables&lt;/li&gt;
&lt;li&gt;Aurora Global Database&lt;/li&gt;
&lt;li&gt;RDS Cross-Region Read Replica&lt;/li&gt;
&lt;li&gt;Route 53 (Health Check + Failover)&lt;/li&gt;
&lt;li&gt;CloudFront (전 세계 자동)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;특수-위치-regionaz-밖&quot;&gt;특수 위치 (Region/AZ 밖)&lt;/h2&gt;
&lt;h3 id=&quot;local-zones&quot;&gt;Local Zones&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;도시 근처 소규모 컴퓨트 확장&lt;/strong&gt;. 리전에서 멀리 떨어진 도시 (예: LA, 마이애미, 서울) 에 배치.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자 근접 low-latency (&amp;#x3C; 10 ms)&lt;/li&gt;
&lt;li&gt;Parent Region 에 종속 (Local Zone 은 Parent Region 의 확장)&lt;/li&gt;
&lt;li&gt;서비스 제한 (모든 서비스 없음)&lt;/li&gt;
&lt;li&gt;대표 사용: 로컬 media, 게임, live streaming&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;wavelength-zones&quot;&gt;Wavelength Zones&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;5G 통신사 네트워크 안에 배치된 컴퓨트&lt;/strong&gt;. 모바일 사용자에게 초저지연.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;통신사 (Verizon, KDDI, SK Telecom 등) 파트너십&lt;/li&gt;
&lt;li&gt;대표 사용: AR/VR, 자율주행, 산업 IoT&lt;/li&gt;
&lt;li&gt;5G 네트워크 안에서 완결되는 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;outposts&quot;&gt;Outposts&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AWS 하드웨어를 고객 데이터센터에 설치&lt;/strong&gt;. AWS 인프라의 온프레미스 확장.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS 가 하드웨어 (rack) 배송 + 설치 + 유지관리&lt;/li&gt;
&lt;li&gt;AWS 리전과 동일 API (EC2, EBS, S3, RDS 등)&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Region (일반)     → 지리적 분리, 리전 규모 전체 인프라&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Local Zone       → 도시 근접 확장 (Parent Region 종속)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Wavelength Zone  → 5G 통신사 네트워크 안&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Outposts         → 고객 데이터센터 안&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;&lt;strong&gt;Multi-AZ&lt;/strong&gt; = 사실상 프로덕션 필수 (SLA 유지)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Region&lt;/strong&gt; = 정말 필요할 때만 (복잡도 큼)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local Zone&lt;/strong&gt; = 특정 도시 사용자 저지연 필수 (게임, 미디어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wavelength&lt;/strong&gt; = 5G 모바일 앱 저지연&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outposts&lt;/strong&gt; = 규제 or 매우 저지연 or 데이터 sovereignty&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;AZ Name 은 계정별 무작위&lt;/strong&gt;. 두 계정이 같은 물리 AZ 를 다른 이름으로 부를 수 있음. 크로스 계정 협업은 반드시 &lt;strong&gt;AZ ID&lt;/strong&gt; 로.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Single AZ 프로덕션&lt;/strong&gt; = SLA 위반, AZ 장애 시 완전 다운. 최소 2 AZ 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;크로스 AZ 데이터 전송 요금&lt;/strong&gt;. 인기 있지만 관측 안 하면 예상 밖 요금. 같은 AZ 안 flow 완결 우선.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;&lt;code&gt;us-east-1&lt;/code&gt; 은 신규 서비스가 먼저 출시&lt;/strong&gt; 되지만 &lt;strong&gt;가장 많은 장애 이력&lt;/strong&gt;. 크리티컬 워크로드는 다른 리전 검토.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Multi-Region 이 자동 아님&lt;/strong&gt;. Region 간 리소스 복제는 명시적 설정 필요 (S3 CRR, Aurora Global 등).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Local Zone / Wavelength 는 서비스 제한&lt;/strong&gt;. 모든 EC2 인스턴스 타입, 모든 서비스 지원 X. 배포 전 확인 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;IAM, CloudFront, Route 53 등 전역 서비스&lt;/strong&gt; 는 리전 X. 모든 리전에서 같은 상태 (하지만 API 는 &lt;code&gt;us-east-1&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-vpc|AWS VPC]] - 리전 안에 만들어지고 AZ 에 걸침&lt;/li&gt;
&lt;li&gt;[[aws-subnet-public-private|Subnet]] - AZ 안의 IP 대역&lt;/li&gt;
&lt;li&gt;[[aws-ec2|EC2]] - AZ 안에서 실행&lt;/li&gt;
&lt;li&gt;[[aws-organizations|Organizations]] - 여러 계정 관리&lt;/li&gt;
&lt;li&gt;[[aws-rds-multi-az|RDS Multi-AZ]] - Multi-AZ deployment&lt;/li&gt;
&lt;li&gt;[[aws-cloudfront-cdn|CloudFront]] - 전 세계 엣지 (Region 개념 밖)&lt;/li&gt;
&lt;li&gt;[[aws-global-accelerator|Global Accelerator]] - Anycast, 여러 리전&lt;/li&gt;
&lt;li&gt;[[aws-direct-connect|Direct Connect]] - 리전에 온프레미스 사설 연결&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>region</category><category>az</category><category>infrastructure</category><author>koa (김신건)</author></item><item><title>[AWS] S3 Glacier: Instant / Flexible / Deep Archive</title><link>https://shinkeonkim.com/wiki/cloud/aws-s3-glacier/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-s3-glacier/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon S3 Glacier&lt;/strong&gt; 는 [[aws-s3|S3]] 의 &lt;em&gt;장기 아카이빙 스토리지 클래스 3종&lt;/em&gt;. 자주 접근하지 않는 데이터를 극도로 저렴하게 (Standard 대비 최대 95% 절감) 저장. 각 클래스는 검색 지연 (retrieval latency) 과 최소 저장 기간 (minimum storage duration) 이 다름.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주의&lt;/strong&gt;: &lt;em&gt;S3 Glacier storage class&lt;/em&gt; (현재 방식) 와 &lt;em&gt;S3 Glacier Vault&lt;/em&gt; (legacy 별도 서비스) 는 다름. 신규는 storage class 로만.&lt;/p&gt;
&lt;h2 id=&quot;세-가지-클래스-2026-시점&quot;&gt;세 가지 클래스 (2026 시점)&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;th align=&quot;left&quot;&gt;저장 요금 (US East)&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;Glacier Instant Retrieval&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;밀리초&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;90일&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~$0.004 / GB-월&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;Glacier Flexible Retrieval&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;분 ~ 시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;90일&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~$0.0036 / GB-월&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;연 1-2회 접근&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Glacier Deep Archive&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;12 ~ 48 시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;180일&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~$0.00099 / GB-월&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;: 128 KB. 더 작아도 128 KB 로 청구.
&lt;strong&gt;메타데이터 오버헤드&lt;/strong&gt;: 40 KB / object (8 KB @ Standard 요금 + 32 KB @ Glacier 요금).&lt;/p&gt;
&lt;h2 id=&quot;클래스별-상세&quot;&gt;클래스별 상세&lt;/h2&gt;
&lt;h3 id=&quot;s3-glacier-instant-retrieval-ir&quot;&gt;S3 Glacier Instant Retrieval (IR)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;밀리초 검색&lt;/strong&gt;. Standard 와 접근 지연이 사실상 같음.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;검색 = 즉시 (restore 불필요)&lt;/li&gt;
&lt;li&gt;접근 요금이 있음 (&lt;code&gt;$0.03 / GB&lt;/code&gt;), 저장은 매우 저렴&lt;/li&gt;
&lt;li&gt;최소 저장 90일 (조기 삭제 시 pro-rated 요금)&lt;/li&gt;
&lt;li&gt;최소 오브젝트 128 KB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;: 의료 이미지, 미디어 백카탈로그, 컴플라이언스 로그 (분기/반기 조회).&lt;/p&gt;
&lt;h3 id=&quot;s3-glacier-flexible-retrieval-구-s3-glacier&quot;&gt;S3 Glacier Flexible Retrieval (구 “S3 Glacier”)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;3단계 retrieval tier&lt;/strong&gt; 로 지연과 요금 트레이드오프.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Tier&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;Expedited&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1-5 분&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~$0.03 / GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;3-5 시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~$0.01 / GB (기본)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Bulk&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;5-12 시간&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;ul&gt;
&lt;li&gt;검색 = &lt;em&gt;restore 요청 필요&lt;/em&gt; (동기 아님)&lt;/li&gt;
&lt;li&gt;최소 저장 90일&lt;/li&gt;
&lt;li&gt;대용량 벌크 검색 (bulk tier) 이 무료 -&gt; 정기 감사에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;: 백업 (분기/연 검증), 미디어 원본, 규제 데이터 아카이브.&lt;/p&gt;
&lt;h3 id=&quot;s3-glacier-deep-archive&quot;&gt;S3 Glacier Deep Archive&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;최저가 스토리지&lt;/strong&gt;. 12/48 시간 대기 감내 가능한 데이터.&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Tier&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;Standard&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;12 시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~$0.01 / GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Bulk&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;48 시간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~$0.0025 / GB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;최소 저장 180일&lt;/li&gt;
&lt;li&gt;데이터 볼륨 극대: 페타바이트 저장 시 큰 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;: 7년+ 재무/의료/법적 보존, 오프사이트 백업 대체.&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;$/GB-월 (2026, us-east-1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Standard              ████████ ~$0.023&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Standard-IA           ████     ~$0.0125&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;One Zone-IA           ███      ~$0.01&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Glacier Instant       ██        ~$0.004&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Glacier Flexible      █         ~$0.0036&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Glacier Deep Archive  ·         ~$0.00099&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;검색-워크플로우-restore&quot;&gt;검색 워크플로우 (Restore)&lt;/h2&gt;
&lt;p&gt;Flexible / Deep Archive 는 &lt;em&gt;비동기 restore&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 App&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 style=&quot;color:#E1E4E8&quot;&gt;    App-&gt;&gt;S3: RestoreObject(tier=Standard, days=7)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over S3: Glacier 백엔드에서 read (분/시간)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3--&gt;&gt;App: 202 Accepted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over App: 폴링 or S3 이벤트 (Restore Completed)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App-&gt;&gt;S3: GetObject&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    S3--&gt;&gt;App: 데이터 (7일 후 임시 사본 삭제)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over S3: 원본은 Glacier 그대로 유지&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; s3api&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; restore-object&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-archive&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&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logs/2024/data.parquet&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;  --restore-request&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;Days&quot;: 7,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;GlacierJobParameters&quot;: {&quot;Tier&quot;: &quot;Standard&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;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; s3api&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; head-object&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --bucket&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-archive&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logs/2024/data.parquet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# &apos;Restore&apos;: &apos;ongoing-request=&quot;false&quot;, expiry-date=&quot;...&quot;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Days&lt;/code&gt;&lt;/strong&gt;: Standard 클래스로 임시 사본을 유지할 기간&lt;/li&gt;
&lt;li&gt;만료 = 임시 사본 삭제 (원본은 Glacier 에 그대로)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s3:ObjectRestore:Completed&lt;/code&gt; 이벤트로 자동 트리거 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lifecycle-transitions&quot;&gt;Lifecycle Transitions&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;STANDARD -&gt; IA -&gt; Glacier&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:#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&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 style=&quot;color:#6A737D&quot;&gt;              # Flexible&lt;/span&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;365&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;DEEP_ARCHIVE&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;2555&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 7년&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;p&gt;&lt;strong&gt;전이 요금&lt;/strong&gt;: &lt;code&gt;$0.05 / 1000 requests&lt;/code&gt;. 파일 수가 많으면 무시 못 함.&lt;/p&gt;
&lt;h2 id=&quot;컴플라이언스-object-lock-vs-vault-lock&quot;&gt;컴플라이언스: Object Lock vs Vault Lock&lt;/h2&gt;
&lt;h3 id=&quot;s3-object-lock-현재-표준&quot;&gt;S3 Object Lock (현재 표준)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;WORM&lt;/em&gt; (Write Once Read Many) 을 스토리지 클래스와 무관하게 적용.&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;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;2031-07-30T00:00:00Z&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GOVERNANCE&lt;/strong&gt;: 특정 IAM 권한으로 해제 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;COMPLIANCE&lt;/strong&gt;: root 도 삭제 불가 (SEC 17a-4, FINRA, CFTC 등 규제 대응)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legal Hold&lt;/strong&gt;: 날짜 무관 삭제 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Glacier 모든 클래스에 적용 가능. 신규는 Object Lock 만.&lt;/p&gt;
&lt;h3 id=&quot;vault-lock-legacy-glacier-vaults&quot;&gt;Vault Lock (Legacy Glacier Vaults)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;별도 서비스&lt;/em&gt; &lt;code&gt;glacier&lt;/code&gt; API (S3 API 아님). 신규 프로젝트는 사용 안 함. S3 Object Lock 이 완전 대체.&lt;/p&gt;
&lt;h2 id=&quot;small-files-문제&quot;&gt;Small Files 문제&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;40 KB 메타데이터 오버헤드&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;1000만 objects × 40 KB = 400 GB metadata&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 8 KB × 1000만 @ Standard 요금&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 32 KB × 1000만 @ Glacier 요금&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;128 KB 미만&lt;/strong&gt; 은 128 KB 로 청구. 작은 파일들을 &lt;em&gt;묶어서&lt;/em&gt; (tar/zip) 저장하는 것이 압도적으로 저렴.&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;/td&gt;&lt;td align=&quot;left&quot;&gt;Standard&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;주 1회&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Standard-IA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;월 1-2회&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;One Zone-IA (내구성 감수)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;분기 1회 (즉시 필요)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Glacier Instant Retrieval&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;연 1-2회 (몇 시간 감수)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Glacier Flexible Retrieval&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;5년+ 거의 접근 안 함&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Glacier Deep Archive&lt;/strong&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;Intelligent-Tiering (자동)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;intelligent-tiering-과의-관계&quot;&gt;Intelligent-Tiering 과의 관계&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;S3 Intelligent-Tiering&lt;/strong&gt; 은 여러 tier 를 자동 이동. Archive Access / Deep Archive Access tier 를 활성화하면 Glacier 클래스도 자동 관리:&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;IntelligentTieringConfiguration&lt;/span&gt;&lt;span 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;  Tierings&lt;/span&gt;&lt;span style=&quot;color:#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;90&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                       # 90일 미접근&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      AccessTier&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ARCHIVE_ACCESS&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      # Glacier Flexible 상당&lt;/span&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;180&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                       # 180일 미접근&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      AccessTier&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DEEP_ARCHIVE_ACCESS&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; # Deep Archive 상당&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;접근 패턴을 몰라도 됨. 단, Archive tier 에 있는 오브젝트는 restore 가 필요 (즉시 접근 X).&lt;/p&gt;
&lt;h2 id=&quot;요금-계산-예시&quot;&gt;요금 계산 예시&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;시나리오&lt;/strong&gt;: 100 TB 로그, 1년 후 Deep Archive 로 옮김.&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;초기 12개월 (Standard):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  100 TB × 1024 × $0.023 × 12 = ~$28,262&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;Lifecycle 로 12개월 후 Deep Archive:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  전이 요금: 100M objects × $0.05/1000 = $5,000  (한 번)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  이후 저장: 100 TB × 1024 × $0.00099 × 12 = ~$1,216  /년&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;  Standard 계속:  ~$28,262 /년&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Deep Archive:   ~$1,216  /년&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  → 95% 절감&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;h2 id=&quot;aws-athenaathena--aws-redshift-spectrumspectrum-과의-관계&quot;&gt;[[aws-athena|Athena]] / [[aws-redshift-spectrum|Spectrum]] 과의 관계&lt;/h2&gt;
&lt;p&gt;Glacier 클래스 오브젝트는 &lt;strong&gt;Athena / Redshift Spectrum 이 직접 쿼리 불가&lt;/strong&gt;. 이유:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Athena / Spectrum 은 GET 을 즉시 시도, restore 대기 안 함&lt;/li&gt;
&lt;li&gt;Instant Retrieval 도 다른 스토리지 클래스로 인식되어 쿼리 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;해결&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;쿼리 전 &lt;code&gt;RestoreObject&lt;/code&gt; 수행&lt;/li&gt;
&lt;li&gt;Restore 된 임시 사본 (Standard) 이 나오면 쿼리&lt;/li&gt;
&lt;li&gt;만료 후 원본은 Glacier 에 그대로&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;또는 데이터를 미리 Standard 로 옮겨 놓기.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;최소 저장 기간 위반&lt;/strong&gt;: 90일 (IR/Flexible) 또는 180일 (Deep Archive) 이내 삭제 시 남은 기간 pro-rated 요금 청구. 잦은 upload/delete 는 오히려 비쌈.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Expedited retrieval 요금&lt;/strong&gt; = Standard 대비 3배. 정기 감사에 Expedited 를 관행으로 쓰면 예상 밖 요금. Bulk (무료) 로 사전 계획.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;40 KB 메타데이터 오버헤드&lt;/strong&gt; 을 무시 = 파일 1억 개 = 4 TB 오버헤드. 작은 파일은 tar/zip 으로 묶어 저장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;128 KB 최소&lt;/strong&gt; 청구. 100 바이트 파일도 128 KB 로 계산. 작은 오브젝트를 Glacier 로 옮기면 오히려 비용 증가할 수 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Restore 임시 사본 만료&lt;/strong&gt; 후 재접근 시 다시 restore 필요 = 지연 재발. 접근 패턴 파악 후 &lt;code&gt;Days&lt;/code&gt; 를 넉넉히.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Athena / Spectrum 이 Glacier 오브젝트 만나면 쿼리 실패&lt;/strong&gt;. Lifecycle 로 옮기기 전에 다운스트림 쿼리 패턴을 재검증.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Instant Retrieval 은 저장 요금이 Standard-IA 보다 비싸다&lt;/strong&gt; (약 2배). 접근이 정말 드물 때만 유리. 월 1회 이상이면 Standard-IA 가 저렴.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Legacy Glacier Vault 를 신규 프로젝트에&lt;/strong&gt; 사용하지 말 것. S3 storage class 로만 사용. Vault 는 별도 API + Vault Lock 이지만 사용성/통합성이 떨어짐.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Versioning + Lifecycle 조합 실수&lt;/strong&gt; = 이전 버전이 계속 Glacier 에 쌓임. &lt;code&gt;NoncurrentVersionTransition&lt;/code&gt; / &lt;code&gt;NoncurrentVersionExpiration&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-s3|AWS S3]] - 기본 객체 스토리지&lt;/li&gt;
&lt;li&gt;[[aws-s3-files|S3 File Access]] - Mountpoint, File Gateway&lt;/li&gt;
&lt;li&gt;[[aws-athena|Amazon Athena]] - Glacier 직접 쿼리 X (restore 필요)&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - 같은 제약&lt;/li&gt;
&lt;li&gt;[[aws-kms|KMS]] - Glacier 데이터 암호화&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - Restore/GetObject 권한&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - 아카이빙 전 카탈로그 정리&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - cold 계층으로 Glacier 활용&lt;/li&gt;
&lt;li&gt;[[etl|ETL]] - Lifecycle 자동화&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>s3</category><category>storage</category><category>archive</category><category>glacier</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, 30 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;p&gt;세 Glacier 클래스 (Instant / Flexible / Deep Archive) 의 상세는 [[aws-s3-glacier|S3 Glacier]] 참조.&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-s3-glacier|S3 Glacier]] - Cold/archive 스토리지 클래스&lt;/li&gt;
&lt;li&gt;[[aws-s3-files|S3 File Access]] - Mountpoint, File Gateway&lt;/li&gt;
&lt;li&gt;[[aws-s3-vectors|S3 Vectors]] - 벡터 저장 특화&lt;/li&gt;
&lt;li&gt;[[aws-athena|Amazon Athena]] - S3 데이터 SQL 쿼리&lt;/li&gt;
&lt;li&gt;[[aws-glue|AWS Glue]] - ETL + Data Catalog&lt;/li&gt;
&lt;li&gt;[[aws-redshift|Amazon Redshift]] - COPY 로 S3 데이터 로딩&lt;/li&gt;
&lt;li&gt;[[aws-redshift-spectrum|Redshift Spectrum]] - Redshift 에서 S3 직접 쿼리&lt;/li&gt;
&lt;li&gt;[[apache-parquet|Apache Parquet]] - 권장 파일 포맷&lt;/li&gt;
&lt;li&gt;[[data-warehouse|Data Warehouse]] - Data lake 저장소로서 S3&lt;/li&gt;
&lt;li&gt;[[etl|ETL / ELT]] - 데이터 파이프라인 저장소&lt;/li&gt;
&lt;li&gt;[[aws-cloudfront-cdn|CloudFront]] - 정적 자산 CDN&lt;/li&gt;
&lt;li&gt;[[aws-kms|KMS]] - 저장 암호화&lt;/li&gt;
&lt;li&gt;[[aws-lambda|Lambda]] - S3 이벤트 트리거&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge|EventBridge]] - S3 이벤트 라우팅&lt;/li&gt;
&lt;li&gt;[[aws-iam|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] 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>Thu, 30 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] Security Group: ENI 레벨 stateful 방화벽</title><link>https://shinkeonkim.com/wiki/cloud/aws-sg/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-sg/</guid><pubDate>Thu, 30 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 Security Group&lt;/strong&gt; (SG) 은 &lt;em&gt;AWS 리소스 (정확히는 ENI, Elastic Network Interface) 에 붙는 stateful 가상 방화벽&lt;/em&gt;. 인바운드/아웃바운드 트래픽을 IP + 포트 + 프로토콜 조합으로 제어하며, 연결 상태를 추적해 응답 트래픽은 자동으로 허용한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 성질&lt;/strong&gt; 세 가지:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Stateful&lt;/strong&gt; - 요청을 허용하면 응답은 반대 방향 규칙 없이도 통과&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow-only&lt;/strong&gt; - Allow 규칙만. Deny 규칙 없음. 매칭 안 되면 암묵적 deny&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ENI 레벨&lt;/strong&gt; - VPC / 서브넷이 아닌 각 [[aws-eni|ENI]] 에 부착 (인스턴스 × 여러 ENI 가능)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;대비 개념&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[[aws-sg-vs-nacl|NACL]]&lt;/strong&gt;: 서브넷 레벨, stateless, allow/deny 모두&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[[aws-network-firewall|Network Firewall]]&lt;/strong&gt;: VPC 레벨 관리형 방화벽&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[[aws-waf|WAF]]&lt;/strong&gt;: L7 HTTP 애플리케이션 방화벽&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;왜-eni-레벨인가&quot;&gt;왜 ENI 레벨인가&lt;/h2&gt;
&lt;p&gt;전통 방화벽은 네트워크 경계 (subnet, VLAN) 에 배치. 하지만 클라우드에서는:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;micro-segmentation&lt;/strong&gt;: 같은 서브넷 안에서도 인스턴스별 다른 정책&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동적 스케일링&lt;/strong&gt;: 새 인스턴스가 뜨면 자동으로 방화벽 정책 상속&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;application-centric&lt;/strong&gt;: “app 서버 → DB 서버 만 허용” 처럼 IP 대신 논리 그룹&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SG 는 이걸 위해 &lt;strong&gt;ENI 단위&lt;/strong&gt;로 붙는다. 인스턴스가 어느 서브넷에 있든, 몇 개의 ENI 를 갖든, 각 ENI 가 자기 SG 를 소유.&lt;/p&gt;
&lt;h2 id=&quot;stateful-의-의미-핵심&quot;&gt;Stateful 의 의미 (핵심)&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 C as Client&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant SG as SG (Stateful)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant S as Server (EC2)&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 SG: Inbound Rule: TCP 443 from 0.0.0.0/0&amp;#x3C;br/&gt;Outbound Rule: (아무것도 없음)&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;    C-&gt;&gt;SG: SYN → 443 (inbound)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SG-&gt;&gt;SG: &quot;Inbound rule 매칭 → 허용&amp;#x3C;br/&gt;+ connection 상태 기록&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;S: SYN forward&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;    S-&gt;&gt;SG: SYN-ACK ← 443 → ephemeral (outbound)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    SG-&gt;&gt;SG: &quot;기존 connection 의 응답 → 자동 허용&amp;#x3C;br/&gt;(outbound rule 검사 X)&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;C: SYN-ACK forward&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 SG: 이후 이 세션의 모든 패킷은 자동 통과&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;의미&lt;/strong&gt;: outbound 규칙을 아무것도 안 넣어도, inbound 로 허용된 연결의 응답은 자동으로 나감. 반대로 outbound 로 초기 요청한 연결의 응답은 inbound 규칙 없어도 들어옴.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NACL 과의 차이&lt;/strong&gt;: NACL 은 각 패킷을 독립 검사 → response 도 별도 outbound 규칙 필요 → &lt;strong&gt;ephemeral port 범위 (1024-65535) 를 명시적으로 열어야 함&lt;/strong&gt;. SG 는 이 부담이 없다.&lt;/p&gt;
&lt;h2 id=&quot;규칙-구성&quot;&gt;규칙 구성&lt;/h2&gt;
&lt;p&gt;SG 규칙은 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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Inbound / Outbound&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Protocol&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;TCP / UDP / ICMP / All / 특정 프로토콜 번호&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Port Range&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;단일 (&lt;code&gt;80&lt;/code&gt;), 범위 (&lt;code&gt;8000-9000&lt;/code&gt;), All (&lt;code&gt;-1&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Source / Destination&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CIDR (&lt;code&gt;10.0.0.0/16&lt;/code&gt;) / &lt;strong&gt;다른 SG ID&lt;/strong&gt; / &lt;strong&gt;Prefix List&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;중요한 것&lt;/strong&gt;: Source/Destination 에 &lt;strong&gt;다른 SG 를 참조&lt;/strong&gt; 가능. 이게 AWS 만의 강력한 패턴.&lt;/p&gt;
&lt;h2 id=&quot;sg-referencing-sg-체이닝---aws-특화-패턴&quot;&gt;SG Referencing (SG 체이닝) - AWS 특화 패턴&lt;/h2&gt;
&lt;h3 id=&quot;문제-ip-기반의-한계&quot;&gt;문제: IP 기반의 한계&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;web-tier: 10.0.1.0/24 → app-tier: 10.0.2.0/24 → db-tier: 10.0.3.0/24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;방화벽: &quot;10.0.1.0/24 → 10.0.2.0/24 port 8080 허용&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;오토스케일링으로 web-tier 가 다른 IP 대역에 확장되면 방화벽 규칙 수정&lt;/li&gt;
&lt;li&gt;IP 대역 겹치면 실수 위험&lt;/li&gt;
&lt;li&gt;신규 리전 확장 시 매번 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;답-sg-를-source-로-참조&quot;&gt;답: SG 를 Source 로 참조&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;web-sg = &quot;web 서버들이 소속되는 SG&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;app-sg = &quot;app 서버들이 소속되는 SG&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├─ Inbound rule: port 8080, source = web-sg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └─ 의미: &quot;web-sg 를 부착한 어떤 ENI 든 8080 접근 허용&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;db-sg = &quot;DB 서버들이 소속되는 SG&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └─ Inbound rule: port 5432, source = app-sg&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;IP 몰라도 됨 (스케일링/이동에 자동 대응)&lt;/li&gt;
&lt;li&gt;논리적: “web → app → db” 흐름을 명확히 표현&lt;/li&gt;
&lt;li&gt;규칙 수정 없이 새 인스턴스 자동 반영 (SG 만 부착하면 됨)&lt;/li&gt;
&lt;/ul&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 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; ALB[&quot;ALB&amp;#x3C;br/&gt;SG: alb-sg&amp;#x3C;br/&gt;inbound 443 from 0.0.0.0/0&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;    ALB --&gt; Web[&quot;Web tier EC2&amp;#x3C;br/&gt;SG: web-sg&amp;#x3C;br/&gt;inbound 8080 from alb-sg&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;    Web --&gt; App[&quot;App tier EC2&amp;#x3C;br/&gt;SG: app-sg&amp;#x3C;br/&gt;inbound 8080 from web-sg&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;    App --&gt; DB[&quot;RDS&amp;#x3C;br/&gt;SG: db-sg&amp;#x3C;br/&gt;inbound 5432 from app-sg&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 층이 바로 위층의 SG 만 허용. Client IP 나 서브넷 CIDR 을 몰라도 됨. 인스턴스 추가/삭제 자동 반영.&lt;/p&gt;
&lt;h2 id=&quot;default-security-group&quot;&gt;Default Security Group&lt;/h2&gt;
&lt;p&gt;각 VPC 생성 시 자동으로 하나 만들어짐 (&lt;code&gt;default&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;기본 규칙&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inbound&lt;/strong&gt;: 자기 SG 로부터 모든 트래픽 허용 (self-reference)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outbound&lt;/strong&gt;: 모든 트래픽 허용 (&lt;code&gt;0.0.0.0/0&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;의미&lt;/strong&gt;: default SG 를 부착한 EC2 들은 서로 자유롭게 통신, 인터넷으로도 자유롭게 나감. 하지만 외부에서는 못 들어옴.&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;수정은 가능하지만 실무는 default 를 그대로 두고 새 SG 를 만듦&lt;/li&gt;
&lt;li&gt;여러 인스턴스가 실수로 default 만 갖고 있으면 서로 다 통신됨 = micro-segmentation 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;신규-sg-의-기본값&quot;&gt;신규 SG 의 기본값&lt;/h2&gt;
&lt;p&gt;새로 만든 SG (default 아닌 것):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inbound&lt;/strong&gt;: 규칙 없음 = deny all&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outbound&lt;/strong&gt;: &lt;code&gt;0.0.0.0/0&lt;/code&gt; 모두 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉 신규는 “인바운드 완전 차단, 아웃바운드 열림”. 필요한 인바운드만 명시 추가.&lt;/p&gt;
&lt;h2 id=&quot;제한-quota&quot;&gt;제한 (Quota)&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;VPC 당 SG 수&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2,500&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;SG 당 인바운드 규칙&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;60&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;SG 당 아웃바운드 규칙&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;60&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;ENI 당 SG 수&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;최대 &lt;strong&gt;16&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;SG 참조 (source/dest 로)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;100 개 서로 다른 SG&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;총 유효 규칙 = SG 규칙 수 × ENI 당 SG 수&lt;/strong&gt; → 상한 &lt;code&gt;60 × 5 = 300&lt;/code&gt; (기본), 확장 시 &lt;code&gt;60 × 16 = 960&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;넘어서면&lt;/strong&gt;: 인스턴스 시작 실패 또는 규칙 추가 실패. 규칙 통합 (여러 개를 하나로) 또는 SG 분리 필요.&lt;/p&gt;
&lt;h2 id=&quot;prefix-list&quot;&gt;Prefix List&lt;/h2&gt;
&lt;p&gt;여러 IP CIDR 을 하나의 논리 그룹으로 묶어 SG 규칙에 참조.&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 관리 Prefix List&lt;/strong&gt;: &lt;code&gt;com.amazonaws.&amp;#x3C;region&gt;.s3&lt;/code&gt; 등 서비스 IP 대역&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer 관리 Prefix List&lt;/strong&gt;: 사용자 정의&lt;/li&gt;
&lt;/ul&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;Customer Prefix List &quot;office-networks&quot;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - 203.0.113.0/24  (서울 오피스)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - 198.51.100.0/24 (도쿄 오피스)&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 rule: SSH 22 from prefix-list office-networks&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;오피스가 추가되면 prefix list 만 수정 → 참조하는 모든 SG 자동 반영.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AWS 관리 예&lt;/strong&gt;: &lt;code&gt;com.amazonaws.us-east-1.s3&lt;/code&gt; 는 S3 IP 대역을 자동으로 최신 유지. VPC Gateway Endpoint 없이 S3 접근 허용하려면 이 prefix list 참조.&lt;/p&gt;
&lt;h2 id=&quot;서비스별-sg-특성&quot;&gt;서비스별 SG 특성&lt;/h2&gt;
&lt;h3 id=&quot;ec2&quot;&gt;EC2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;인스턴스에 여러 ENI, 각 ENI 에 여러 SG (최대 5)&lt;/li&gt;
&lt;li&gt;인스턴스 자체가 SG 를 갖는 게 아니라 ENI 가.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;rds&quot;&gt;RDS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;하나의 RDS 인스턴스는 하나의 ENI (Multi-AZ 는 2개)&lt;/li&gt;
&lt;li&gt;SG 는 이 ENI 에 부착&lt;/li&gt;
&lt;li&gt;대개 &lt;code&gt;db-sg&lt;/code&gt; 하나만 붙이고, source 는 &lt;code&gt;app-sg&lt;/code&gt; 로&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;lambda-in-vpc&quot;&gt;Lambda (in VPC)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lambda 가 VPC 안에서 실행되면 Hyperplane ENI 사용 (자세히: [[aws-eni|ENI]])&lt;/li&gt;
&lt;li&gt;SG 는 그 Hyperplane ENI 에 부착&lt;/li&gt;
&lt;li&gt;Outbound 만 사용 (Lambda 는 서비스가 호출하므로 inbound 개념 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ecs--eks-fargate&quot;&gt;ECS / EKS (Fargate)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Task / Pod 마다 ENI (VPC CNI)&lt;/li&gt;
&lt;li&gt;Task definition / Pod spec 에 SG 지정&lt;/li&gt;
&lt;li&gt;Task 단위 micro-segmentation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;alb--nlb--gwlb&quot;&gt;ALB / NLB / GWLB&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;로드 밸런서 노드마다 ENI&lt;/li&gt;
&lt;li&gt;SG 를 부착 (NLB 는 최근 지원)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;관측-vpc-flow-logs&quot;&gt;관측: VPC Flow Logs&lt;/h2&gt;
&lt;p&gt;SG 로 허용/거부된 트래픽 관찰:&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;VPC Flow Log 활성화:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  → CloudWatch Logs / S3 로 flow 기록&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  → 각 flow 의 srcaddr, dstaddr, srcport, dstport, action (ACCEPT / REJECT)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;REJECT&lt;/strong&gt; = SG 나 NACL 이 차단.&lt;/p&gt;
&lt;h2 id=&quot;흔한-패턴&quot;&gt;흔한 패턴&lt;/h2&gt;
&lt;h3 id=&quot;1-bastion--ssh-접근-격리&quot;&gt;1. Bastion / SSH 접근 격리&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;bastion-sg: inbound 22 from 오피스 IP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;private-app-sg: inbound 22 from bastion-sg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bastion 만 오피스에서 접근, 내부는 bastion 을 경유.&lt;/p&gt;
&lt;h3 id=&quot;2-public-web--private-db&quot;&gt;2. Public Web + Private DB&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-sg: inbound 443 from 0.0.0.0/0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;web-sg: inbound 8080 from alb-sg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;db-sg: inbound 5432 from web-sg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-자기-참조-mesh&quot;&gt;3. 자기 참조 (mesh)&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;cluster-sg: inbound &quot;모든 포트&quot; from cluster-sg (self-reference)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;같은 SG 를 붙인 인스턴스끼리 자유 통신 (예: Kubernetes 노드끼리).&lt;/p&gt;
&lt;h3 id=&quot;4-vpc-endpoint-접근-제어&quot;&gt;4. VPC Endpoint 접근 제어&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;endpoint-sg: inbound HTTPS 443 from app-sg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;app-sg: outbound HTTPS 443 to endpoint-sg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sg-vs-nacl-요약&quot;&gt;SG vs NACL 요약&lt;/h2&gt;
&lt;p&gt;간단 비교. 자세히는 [[aws-sg-vs-nacl|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;SG&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;&lt;strong&gt;ENI&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Subnet&lt;/strong&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;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;모든 규칙 종합 (OR)&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;Subnet 경계, 특정 IP 차단&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;실무&lt;/strong&gt;: SG 를 주로 쓰고, NACL 은 특별한 경우 (알려진 악성 IP 차단, 서브넷 격리) 에만.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Allow 만 존재&lt;/strong&gt;. 특정 IP 차단이 필요하면 NACL. SG 는 화이트리스트만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;SG 규칙 수 제한&lt;/strong&gt; (60 in / 60 out). 큰 규칙 세트는 SG 를 분리하거나 prefix list 활용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;default SG 를 그대로 둔 인스턴스&lt;/strong&gt; = 같은 default 인 것끼리 자유 통신. 예상 밖 접근성. 새 SG 를 만들어 명시적으로 부착.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;RDS SG 를 CIDR (&lt;code&gt;10.0.0.0/16&lt;/code&gt;) 로 열어두는 관행&lt;/strong&gt; = 다른 VPC 확장 시 커버 못 함. SG 참조 (&lt;code&gt;from app-sg&lt;/code&gt;) 로 대체 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;SSH 22 를 0.0.0.0/0 으로 개방&lt;/strong&gt; = 공격 표면. [[aws-ssm-session-manager|SSM Session Manager]] 로 대체하고 22 는 닫기.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Stateful 하지만 규칙 변경 시 기존 세션 재검사&lt;/strong&gt; (AWS 문서 기준 최근 개선). 오래된 관행 문서를 그대로 믿지 말 것.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;SG 삭제 안 됨&lt;/strong&gt; 다른 SG 나 ENI 가 참조 중이면. Dependency 정리 후 삭제.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Outbound 를 좁혔는데 서비스 안 됨&lt;/strong&gt; = 반환 트래픽은 자동이지만 &lt;em&gt;외부로 요청&lt;/em&gt; 하는 흐름 (예: DB 가 외부 API 호출) 은 outbound 규칙 필요. 트래픽 방향 파악 필수.&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|SG vs NACL]] - NACL 과의 대비&lt;/li&gt;
&lt;li&gt;[[aws-eni|ENI]] - SG 가 부착되는 인터페이스&lt;/li&gt;
&lt;li&gt;[[aws-vpc|VPC]] - 배포 컨텍스트&lt;/li&gt;
&lt;li&gt;[[aws-network-firewall|Network Firewall]] - VPC 수준 관리형 대안&lt;/li&gt;
&lt;li&gt;[[aws-waf|WAF]] - L7 HTTP 대안&lt;/li&gt;
&lt;li&gt;[[aws-gwlb|Gateway Load Balancer]] - 서드파티 방화벽 우회&lt;/li&gt;
&lt;li&gt;[[aws-ssm-session-manager|SSM Session Manager]] - SSH 대체&lt;/li&gt;
&lt;li&gt;[[aws-cloudwatch|CloudWatch]] / VPC Flow Logs - 관측&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>security</category><category>network</category><category>vpc</category><category>firewall</category><category>sg</category><author>koa (김신건)</author></item><item><title>[AWS] SES: Simple Email Service</title><link>https://shinkeonkim.com/wiki/cloud/aws-ses/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-ses/</guid><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Amazon SES&lt;/strong&gt; (Simple Email Service) 는 &lt;em&gt;AWS 관리형 이메일 발송 / 수신 서비스&lt;/em&gt;. 대량 마케팅 메일, 트랜잭션 메일 (주문 확인, 비밀번호 재설정), 알림 메일을 SMTP 또는 API 로 발송하고, 원한다면 MX 레코드를 SES 로 향하게 해 수신도 가능.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 정체성&lt;/strong&gt;: &lt;em&gt;직접 SMTP 서버 (Postfix, Sendmail) 를 운영하지 않고 이메일 인프라를 AWS 에 위임&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;왜-ses-인가&quot;&gt;왜 SES 인가&lt;/h2&gt;
&lt;p&gt;자체 SMTP 서버의 문제:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IP reputation 관리&lt;/strong&gt; = 대형 receiver (Gmail, Outlook) 가 새 IP 를 신뢰하기까지 warm-up 필요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blocklist 관리&lt;/strong&gt; = Spamhaus 등재 시 즉시 배달 불가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SPF / DKIM / DMARC 설정 + 유지&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bounce / complaint 처리&lt;/strong&gt; = 미처리 시 reputation 급락&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재시도 / queue 관리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS 인증서 갱신&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SES 의 답: 위 전부를 AWS 가 대신. 앱은 SendEmail API 만 호출.&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;    App[&quot;애플리케이션&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;    App --&gt;|&quot;SMTP or API&quot;| SES[&quot;Amazon SES&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;    SES --&gt; Identity{&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;    Identity --&gt;|Yes| Reputation[&quot;Reputation 검사&amp;#x3C;br/&gt;(bounce/complaint 율)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Identity --&gt;|No| Reject[&quot;Reject&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;    Reputation --&gt;|OK| DKIMSign[&quot;DKIM 서명&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Reputation --&gt;|경계| Throttle[&quot;throttle&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;    DKIMSign --&gt; Send[&quot;수신자 mail server 로 SMTP&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;    Send --&gt; Events[&quot;이벤트 발행&amp;#x3C;br/&gt;(send/deliver/bounce/complaint/open/click)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Events --&gt; Kinesis[Kinesis]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Events --&gt; SNS[SNS]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Events --&gt; CW[CloudWatch Metrics]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;발송-인터페이스&quot;&gt;발송 인터페이스&lt;/h2&gt;
&lt;p&gt;두 가지 API.&lt;/p&gt;
&lt;h3 id=&quot;1-smtp&quot;&gt;1. SMTP&lt;/h3&gt;
&lt;p&gt;표준 SMTP 프로토콜. 기존 mail 라이브러리 (&lt;code&gt;nodemailer&lt;/code&gt;, &lt;code&gt;django.core.mail&lt;/code&gt;, Rails ActionMailer 등) 그대로.&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;Endpoint: email-smtp.us-east-1.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Port: 587 (STARTTLS) 또는 2587&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Username/Password: SES SMTP credentials (IAM 사용자에서 생성)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;: 이미 SMTP 클라이언트가 있는 앱, 서드파티 도구 (WordPress 등).&lt;/p&gt;
&lt;h3 id=&quot;2-https-api&quot;&gt;2. HTTPS API&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SendEmail&lt;/code&gt;&lt;/strong&gt;: 간단한 이메일 (subject + body + to)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SendRawEmail&lt;/code&gt;&lt;/strong&gt;: 완전 MIME 제어 (첨부, HTML, multipart)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SendBulkTemplatedEmail&lt;/code&gt;&lt;/strong&gt;: 템플릿 기반 대량 발송 (수신자당 개인화)&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;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 style=&quot;color:#E1E4E8&quot;&gt;ses &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;sesv2&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;ses.send_email(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    FromEmailAddress&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;no-reply@example.com&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;    Destination&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;ToAddresses&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;user@example.com&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;    Content&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;Simple&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;Subject&apos;&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 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:#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;Html&apos;&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 style=&quot;color:#9ECBFF&quot;&gt;&apos;&amp;#x3C;h1&gt;주문이 접수되었습니다&amp;#x3C;/h1&gt;&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:#FFAB70&quot;&gt;    ConfigurationSetName&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;transactional&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;p&gt;&lt;strong&gt;적합&lt;/strong&gt;: 서버리스 ([[aws-lambda|Lambda]]), IAM 기반 인증, 세밀한 제어.&lt;/p&gt;
&lt;h2 id=&quot;identity-검증&quot;&gt;Identity 검증&lt;/h2&gt;
&lt;p&gt;SES 는 아무 도메인이나 발송 불가. 소유권 검증된 identity 만 사용.&lt;/p&gt;
&lt;h3 id=&quot;email-identity-단일-주소&quot;&gt;Email identity (단일 주소)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;no-reply@example.com&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. SES 에서 email identity 등록&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. AWS 가 검증 이메일 발송&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. 링크 클릭 → 검증 완료 (24시간 안)&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;h3 id=&quot;domain-identity-도메인-전체&quot;&gt;Domain identity (도메인 전체)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;example.com&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. SES 에서 domain identity 등록&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. AWS 가 DKIM 토큰 3 개 제공&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. Route 53 (또는 DNS 공급자) 에 CNAME 3 개 등록&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4. AWS 가 자동 확인 → 검증 완료 (수 분 - 72시간)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;적합&lt;/strong&gt;: 프로덕션. &lt;code&gt;noreply@&lt;/code&gt;, &lt;code&gt;orders@&lt;/code&gt;, &lt;code&gt;support@&lt;/code&gt; 등 여러 주소 사용.&lt;/p&gt;
&lt;h3 id=&quot;dkim-옵션&quot;&gt;DKIM 옵션&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy DKIM&lt;/strong&gt;: AWS 가 키 쌍 생성, 고객은 CNAME 만&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BYODKIM (Bring Your Own DKIM)&lt;/strong&gt;: 고객이 키 쌍 관리 (규제 목적)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;spf--dkim--dmarc&quot;&gt;SPF / DKIM / DMARC&lt;/h2&gt;
&lt;p&gt;이메일 도메인 인증 3대 표준. &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;strong&gt;SPF&lt;/strong&gt; (Sender Policy Framework)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;어떤 IP 가 이 도메인 대신 발송 가능한지 선언&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DNS TXT: &lt;code&gt;v=spf1 include:amazonses.com ~all&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;DKIM&lt;/strong&gt; (DomainKeys Identified Mail)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;발송자 도메인의 개인키로 서명, 수신자가 공개키로 검증&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CNAME 3 개 (SES 가 제공)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;DMARC&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SPF/DKIM 실패 시 정책 (거부/격리/보고)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;DNS TXT: &lt;code&gt;v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;미설정 결과&lt;/strong&gt;: Gmail / Outlook 이 스팸 폴더로 보냄. 최악의 경우 완전 차단.&lt;/p&gt;
&lt;h2 id=&quot;sandbox-모드-신규-계정&quot;&gt;Sandbox 모드 (신규 계정)&lt;/h2&gt;
&lt;p&gt;새 SES 계정은 &lt;strong&gt;sandbox 모드&lt;/strong&gt; 로 시작. 제한:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;수신자&lt;/strong&gt;: &lt;strong&gt;검증된&lt;/strong&gt; 이메일 / 도메인 만 (Mailbox Simulator 예외)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;속도&lt;/strong&gt;: &lt;strong&gt;200 emails / 24시간&lt;/strong&gt;, &lt;strong&gt;1 email / 초&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수신 (receiving)&lt;/strong&gt;: 비활성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suppression list 일괄 조작&lt;/strong&gt;: 비활성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;프로덕션 접근 요청&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS 콘솔 → SES → Account dashboard → Request production access&lt;/li&gt;
&lt;li&gt;발송 유즈케이스, 웹사이트 URL, mail type (transactional / marketing), 대략 볼륨 명시&lt;/li&gt;
&lt;li&gt;AWS Support 검토 (통상 24시간 안)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;reputation-관리-매우-중요&quot;&gt;Reputation 관리 (매우 중요)&lt;/h2&gt;
&lt;p&gt;SES 는 &lt;strong&gt;계정 sender reputation&lt;/strong&gt; 을 관리. 나쁘면 발송 정지.&lt;/p&gt;
&lt;h3 id=&quot;지표&quot;&gt;지표&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bounce rate&lt;/strong&gt;: 반송률 = (반송된 이메일 / 발송) × 100&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complaint rate&lt;/strong&gt;: 스팸 신고율 = (신고 / 발송) × 100&lt;/li&gt;
&lt;/ul&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;Bounce&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Complaint&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;Healthy&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&amp;#x3C; 2%&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&amp;#x3C; 0.05%&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;Under review&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&gt; 5%&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&gt; 0.1%&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;Paused&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&gt; 10%&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&gt; 0.5%&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;매우 신중&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;대응&quot;&gt;대응&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suppression list&lt;/strong&gt;: 반송/신고 이메일을 자동 억제 (재발송 안 함)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;List cleaning&lt;/strong&gt;: 발송 전 알려진 hard bounce 주소 제거&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unsubscribe 링크&lt;/strong&gt;: 마케팅 메일 필수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DKIM/SPF/DMARC&lt;/strong&gt; 완비 (수신자가 legitimate 로 인식)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warm-up&lt;/strong&gt;: 새 IP / 계정은 소량부터 시작해 점진 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;suppression-list&quot;&gt;Suppression List&lt;/h2&gt;
&lt;p&gt;바운스 / 신고된 주소는 자동으로 &lt;strong&gt;suppression list&lt;/strong&gt; 에 등록되어 이후 발송 시도 자동 차단.&lt;/p&gt;
&lt;p&gt;두 레벨:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account-level&lt;/strong&gt;: SES 계정에서 관리 (사용자가 조회/삭제 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global (AWS-wide)&lt;/strong&gt;: AWS 전체 suppression list (모든 계정 공유)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;중요&lt;/strong&gt;: hard bounce 는 재시도 안 되지만, 사용자가 이메일 주소 오타를 고치고 다시 등록하면 리스트에서 제거해야 함.&lt;/p&gt;
&lt;h2 id=&quot;configuration-set&quot;&gt;Configuration Set&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Identity 에 적용되는 규칙 그룹&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;포함&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Event destinations&lt;/strong&gt;: 이벤트를 어디로 발행 (Kinesis / SNS / CloudWatch / Firehose)
&lt;ul&gt;
&lt;li&gt;Send, Delivery, Open, Click, Bounce, Complaint, Reject&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP pool&lt;/strong&gt;: 전용 IP 를 여러 목적별 pool 로 (트랜잭션 vs 마케팅)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reputation tracking&lt;/strong&gt;: 지표 추적&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sending options&lt;/strong&gt;: 발송 활성/비활성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;활용&lt;/strong&gt;: 마케팅용 config set 은 open/click 추적, 트랜잭션용은 bounce/complaint 만 추적. 각 config set 이 다른 IP pool 사용.&lt;/p&gt;
&lt;h2 id=&quot;templates--personalization&quot;&gt;Templates &amp;#x26; Personalization&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;Template: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;welcome-v2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Subject: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;환영합니다, {{name}}님&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Html: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&amp;#x3C;p&gt;안녕하세요 {{name}}님, {{coupon}} 쿠폰을 드립니다.&amp;#x3C;/p&gt;&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;SendBulkTemplatedEmail:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  Template: welcome-v&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:#E1E4E8&quot;&gt;  Destinations:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - ToAddresses: [&lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;alice@example.com&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ReplacementTemplateData: {&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;Alice&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;coupon&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;SAVE10&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - ToAddresses: [&lt;/span&gt;&lt;span style=&quot;color:#FDAEB7;font-style:italic&quot;&gt;bob@example.com&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      ReplacementTemplateData: {&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;Bob&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;coupon&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;SAVE20&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;수신자당 개인화 + 대량 발송을 한 번의 API 호출로.&lt;/p&gt;
&lt;h2 id=&quot;수신-receiving&quot;&gt;수신 (Receiving)&lt;/h2&gt;
&lt;p&gt;MX 레코드를 SES 로 향하게 하면 SES 가 도메인 이메일을 수신.&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;    Sender[&quot;외부 발송자&quot;] --&gt;|SMTP| SES[&quot;SES Receiving&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;    SES --&gt; Rules[&quot;Receipt Rules&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;    Rules --&gt;|&quot;recipient=support@&quot;| 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;    Rules --&gt;|&quot;recipient=noreply@&quot;| SNS[&quot;SNS 알림&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Rules --&gt;|&quot;모든 spam&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;    Rules --&gt;|&quot;규제 대상&quot;| WorkMail&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Receipt Rules&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;수신자 별 조건 (&lt;code&gt;support@example.com&lt;/code&gt;, &lt;code&gt;*@example.com&lt;/code&gt; 등)&lt;/li&gt;
&lt;li&gt;액션: S3 저장, SNS 알림, Lambda 호출, Bounce, Stop rule set&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;용도&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;고객 지원 티켓 시스템 (&lt;code&gt;support@&lt;/code&gt; → Lambda → Zendesk API)&lt;/li&gt;
&lt;li&gt;알림 처리 (&lt;code&gt;noreply-reply@&lt;/code&gt; → 자동 답장)&lt;/li&gt;
&lt;li&gt;규제 감사 (&lt;code&gt;compliance@&lt;/code&gt; → S3 아카이브)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;주의&lt;/strong&gt;: sandbox 계정은 수신 X. 프로덕션 접근 필요.&lt;/p&gt;
&lt;h2 id=&quot;virtual-deliverability-manager-vdm&quot;&gt;Virtual Deliverability Manager (VDM)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;2023+&lt;/strong&gt; 추가 기능. Deliverability 분석 대시보드.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;각 receiver (Gmail, Yahoo, Outlook) 별 배달률&lt;/li&gt;
&lt;li&gt;Placement (inbox vs spam)&lt;/li&gt;
&lt;li&gt;Reputation trend&lt;/li&gt;
&lt;li&gt;문제 감지 시 권장 조치&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;mail-manager-2024&quot;&gt;Mail Manager (2024+)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Inbound 이메일 처리 파이프라인&lt;/strong&gt;. 수신된 메일을 여러 단계 (스팸 필터, 정책, 라우팅) 로 처리.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이메일 게이트웨이 대체 (Proofpoint, Barracuda 등)&lt;/li&gt;
&lt;li&gt;Rule 기반 라우팅 / 격리 / 아카이브&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;발송&lt;/strong&gt;: $0.10 / 1000 emails (EC2 에서 발송 시 첫 62,000 emails 무료)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수신&lt;/strong&gt;: $0.10 / 1000 emails&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;첨부&lt;/strong&gt;: $0.12 / GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전용 IP&lt;/strong&gt;: $24.95 / IP / 월&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;비교&lt;/strong&gt;: Mailgun / SendGrid 등 SaaS 는 $10 - $50 / 월 (10K emails). SES 는 $1 정도로 훨씬 저렴.&lt;/p&gt;
&lt;h2 id=&quot;실전-시나리오&quot;&gt;실전 시나리오&lt;/h2&gt;
&lt;h3 id=&quot;1-트랜잭션-이메일-주문-확인&quot;&gt;1. 트랜잭션 이메일 (주문 확인)&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;[웹앱 checkout] → Lambda → SES SendEmail (config-set=transactional)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                          → S3 로 이벤트 저장 (via Kinesis Firehose)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Transactional config set 은 open/click 추적 안 함 (개인정보 최소화)&lt;/li&gt;
&lt;li&gt;Bounce/complaint 만 별도 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-마케팅-뉴스레터&quot;&gt;2. 마케팅 뉴스레터&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;[관리자] → SendBulkTemplatedEmail (config-set=marketing)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    → Dedicated IP pool&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    → Kinesis Firehose → Redshift → 분석&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;마케팅 config set 은 open/click 추적&lt;/li&gt;
&lt;li&gt;Dedicated IP 로 reputation 격리&lt;/li&gt;
&lt;li&gt;Suppression list 로 unsubscribe 자동&lt;/li&gt;
&lt;/ul&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;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[사용자 이메일] → MX → SES Receiving → Lambda (본문 파싱) → Zendesk API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                         → S3 아카이브&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;support@example.com&lt;/code&gt; 을 SES 수신으로 → 자동 티켓 생성.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Sandbox 모드에서 프로덕션 배포&lt;/strong&gt; = 검증 안 된 주소에 발송 실패. 배포 전 반드시 프로덕션 접근 승인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Bounce rate &gt; 5%&lt;/strong&gt; = AWS 관찰 시작. &gt; 10% = 발송 정지. 리스트 정리 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;DKIM / SPF / DMARC 미설정&lt;/strong&gt; = Gmail 스팸 폴더 or 완전 차단. 도메인 검증 후 3 종 세트 반드시 설정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Marketing / Transactional 을 같은 IP&lt;/strong&gt; = 마케팅 스팸이 트랜잭션 배달률까지 망침. Config set 으로 IP pool 분리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;Suppression list 무한 확대&lt;/strong&gt;. 사용자가 오타 고쳐서 재등록하면 리스트에서 제거해야 배달됨. 관리 프로세스 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;첨부 크기 상한&lt;/strong&gt; (SES 는 raw email 40 MB 근처). 큰 파일은 [[aws-s3|S3]] Presigned URL 로 링크만.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;수신 (receiving) 은 sandbox 미지원&lt;/strong&gt;. 프로덕션 접근 요청 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;SMTP credentials ≠ IAM access key&lt;/strong&gt;. IAM 사용자에서 SMTP credentials 를 별도 생성해야 함 (같아 보여도 다름).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-lambda|AWS Lambda]] - 서버리스 발송 로직&lt;/li&gt;
&lt;li&gt;[[aws-s3|AWS S3]] - 수신 이메일 저장&lt;/li&gt;
&lt;li&gt;[[aws-sns|AWS SNS]] - 이벤트 알림&lt;/li&gt;
&lt;li&gt;[[aws-kinesis-data-streams|Kinesis Data Streams]] - 이벤트 스트리밍&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - SMTP credentials 관리&lt;/li&gt;
&lt;li&gt;[[aws-kms|KMS]] - 이메일 암호화&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>email</category><category>ses</category><category>messaging</category><author>koa (김신건)</author></item><item><title>[AWS] SSM Automation: 운영 워크플로 런북</title><link>https://shinkeonkim.com/wiki/cloud/aws-ssm-automation/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/cloud/aws-ssm-automation/</guid><pubDate>Thu, 30 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 SSM Automation&lt;/strong&gt; 은 &lt;em&gt;여러 단계로 이루어진 운영 워크플로를 런북 (runbook) 이라는 문서로 정의하고 실행&lt;/em&gt; 하는 [[aws-systems-manager|Systems Manager]] 기능. 각 단계는 [[aws-ec2|EC2]] 재시작, AMI 생성, [[aws-iam|IAM]] role 부여, [[aws-lambda|Lambda]] 호출, 다른 SSM 문서 실행 등을 조합할 수 있으며 조건 분기, 재시도, 승인 게이트 (approval), 병렬 실행을 지원.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한 줄 요약&lt;/strong&gt;: &lt;em&gt;[[aws-step-functions|Step Functions]] 의 인프라 운영 특화 버전&lt;/em&gt;. 서버/AWS API 를 조합한 복잡한 운영 작업을 코드화.&lt;/p&gt;
&lt;h2 id=&quot;automation-vs-다른-ssm-기능&quot;&gt;Automation vs 다른 SSM 기능&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;[[aws-ssm-run-command|Run Command]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;단일 스크립트 다중 서버 실행&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;”nginx restart 전 서버 일괄”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;[[aws-ssm-state-manager|State Manager]]&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;원하는 상태 지속 유지&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;”SSM Agent 최신 유지”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Automation&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;여러 단계 + 여러 서비스 조합&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;”AMI 생성 → 인스턴스 교체 → DNS 업데이트 → 알림”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Run Command 는 “명령” 단위, Automation 은 “워크플로” 단위.&lt;/p&gt;
&lt;h2 id=&quot;왜-automation-인가&quot;&gt;왜 Automation 인가&lt;/h2&gt;
&lt;p&gt;수동 운영 워크플로의 문제:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;여러 서비스 조합&lt;/strong&gt; (EC2, EBS, IAM, ELB, Route53, Lambda …)&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;Automation 의 답:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;런북 (JSON/YAML)&lt;/strong&gt; 으로 워크플로 코드화, 버전 관리&lt;/li&gt;
&lt;li&gt;각 단계는 &lt;strong&gt;&lt;code&gt;aws:executeAwsApi&lt;/code&gt;&lt;/strong&gt; 로 AWS API 직접 호출 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;aws:approve&lt;/code&gt;&lt;/strong&gt; 로 인간 승인 스텝 삽입&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;aws:branch&lt;/code&gt;&lt;/strong&gt; 로 조건 분기&lt;/li&gt;
&lt;li&gt;실패 시 &lt;strong&gt;&lt;code&gt;onFailure: Continue / Abort / RollbackAndContinue&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt; 자동 감사&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;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;schemaVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;0.3&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;EC2 를 재부팅하고 헬스체크 확인&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;  InstanceId&lt;/span&gt;&lt;span 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;    description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;재부팅할 EC2 ID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  HealthCheckUrl&lt;/span&gt;&lt;span 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;&apos;https://example.com/healthz&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;# 실행할 IAM role (Automation 의 실행 컨텍스트)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;assumeRole&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ automation:EXECUTION_ROLE_NAME }}&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;mainSteps&lt;/span&gt;&lt;span style=&quot;color:#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;StopInstance&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;aws:changeInstanceState&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      InstanceIds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ InstanceId }}&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:#85E89D&quot;&gt;      DesiredState&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;stopped&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    onFailure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Abort&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;  - &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;WaitForStopped&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;aws:waitForAwsResourceProperty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;ec2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Api&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DescribeInstances&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      InstanceIds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ InstanceId }}&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:#85E89D&quot;&gt;      PropertySelector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;$.Reservations[0].Instances[0].State.Name&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      DesiredValues&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;stopped&lt;/span&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;  - &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;StartInstance&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;aws:changeInstanceState&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      InstanceIds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ InstanceId }}&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:#85E89D&quot;&gt;      DesiredState&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;running&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;  - &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;WaitForRunning&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;aws:waitForAwsResourceProperty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;ec2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Api&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DescribeInstanceStatus&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      InstanceIds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ InstanceId }}&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:#85E89D&quot;&gt;      PropertySelector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;$.InstanceStatuses[0].InstanceStatus.Status&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      DesiredValues&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ok&lt;/span&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;  - &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;HealthCheck&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;aws:runCommand&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      DocumentName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS-RunShellScript&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      InstanceIds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ InstanceId }}&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:#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;        commands&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 {{ HealthCheckUrl }} || 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&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;NotifySlack&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;aws:invokeLambdaFunction&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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:#9ECBFF&quot;&gt;notify-slack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Payload&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{&quot;message&quot;: &quot;EC2 {{ InstanceId }} restart OK&quot;}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;주요-액션-aws&quot;&gt;주요 액션 (aws:*)&lt;/h2&gt;
&lt;p&gt;Automation 이 제공하는 빌트인 액션.&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;strong&gt;&lt;code&gt;aws:executeAwsApi&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;임의 AWS API 호출 (가장 범용)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:runCommand&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Run Command 실행 (스크립트 배포)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:changeInstanceState&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EC2 start/stop/terminate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:createImage&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AMI 생성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:copyImage&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AMI 리전 복사&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:createStack&lt;/code&gt; / &lt;code&gt;deleteStack&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CloudFormation 조작&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:invokeLambdaFunction&lt;/code&gt;&lt;/strong&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;&lt;strong&gt;&lt;code&gt;aws:invokeWebhook&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;HTTP 호출 (Slack, Datadog 등)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:executeStateMachine&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Step Functions 실행&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:branch&lt;/code&gt;&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;&lt;code&gt;aws:approve&lt;/code&gt;&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;&lt;code&gt;aws:pause&lt;/code&gt;&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;&lt;code&gt;aws:sleep&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;N 초 대기&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;&lt;code&gt;aws:waitForAwsResourceProperty&lt;/code&gt;&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;&lt;code&gt;aws:executeAutomation&lt;/code&gt;&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;&lt;code&gt;aws:executeScript&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Python/PowerShell 스크립트 직접 실행 (SSM 안에서)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;실전-예제&quot;&gt;실전 예제&lt;/h2&gt;
&lt;h3 id=&quot;예-1-정기-ami-golden-ami-생성&quot;&gt;예 1: 정기 AMI (Golden AMI) 생성&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;schemaVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;0.3&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;주간 golden AMI 생성&apos;&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;  SourceInstanceId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&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 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;  ImageNamePrefix&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&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 style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&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;&apos;golden&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:#85E89D&quot;&gt;mainSteps&lt;/span&gt;&lt;span style=&quot;color:#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;CreateAMI&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;aws:createImage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      InstanceId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ SourceInstanceId }}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      ImageName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ ImageNamePrefix }}-{{ global:DATE_TIME }}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      NoReboot&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:#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:#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;NewAmiId&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        Selector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;$.ImageId&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&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;WaitAMI&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;aws:waitForAwsResourceProperty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;ec2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Api&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DescribeImages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      ImageIds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ CreateAMI.NewAmiId }}&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:#85E89D&quot;&gt;      PropertySelector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;$.Images[0].State&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      DesiredValues&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;available&lt;/span&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;  - &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;TagAMI&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;aws:executeAwsApi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;ec2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Api&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;CreateTags&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 style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ CreateAMI.NewAmiId }}&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:#85E89D&quot;&gt;      Tags&lt;/span&gt;&lt;span style=&quot;color:#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;Type&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:#9ECBFF&quot;&gt;Golden&lt;/span&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;CreatedBy&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:#9ECBFF&quot;&gt;&apos;ssm-automation&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[[aws-eventbridge|EventBridge]] 스케줄러 → 매주 이 런북 실행 → 최신 golden AMI 자동 유지.&lt;/p&gt;
&lt;h3 id=&quot;예-2-승인-게이트가-있는-프로덕션-배포&quot;&gt;예 2: 승인 게이트가 있는 프로덕션 배포&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;mainSteps&lt;/span&gt;&lt;span style=&quot;color:#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;PreCheck&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;aws:runCommand&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      DocumentName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;AWS-RunShellScript&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 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;&apos;tag:Env&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&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;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;      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;        commands&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;./pre-deploy-check.sh&quot;&lt;/span&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;  - &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;WaitForApproval&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;aws:approve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      NotificationArn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;arn:aws:sns:...:deploy-approvers&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Message&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Pre-check 통과. 프로덕션 배포 승인 필요.&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      MinRequiredApprovals&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;      Approvers&lt;/span&gt;&lt;span style=&quot;color:#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;arn:aws:iam::123:role/OpsLead&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 style=&quot;color:#9ECBFF&quot;&gt;&apos;arn:aws:iam::123:role/SREOncall&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:#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;RollingDeploy&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;aws:runCommand&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      DocumentName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;app-deploy&apos;&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 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;&apos;tag:Env&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&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;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;      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;        version&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ Version }}&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:#85E89D&quot;&gt;      MaxConcurrency&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;10%&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      MaxErrors&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;20%&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ops 리더 2명이 승인해야 실제 배포 진행. 승인 대기 중 자동 알림.&lt;/p&gt;
&lt;h3 id=&quot;예-3-셀프-힐링-자가-복구&quot;&gt;예 3: 셀프 힐링 (자가 복구)&lt;/h3&gt;
&lt;p&gt;CloudWatch Alarm → Automation 실행. 예: EBS 볼륨 사용률 80% 초과 → 자동 확장.&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;mainSteps&lt;/span&gt;&lt;span style=&quot;color:#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;GetCurrentSize&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;aws:executeAwsApi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;ec2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Api&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DescribeVolumes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      VolumeIds&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ VolumeId }}&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:#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:#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;CurrentSize&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        Selector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;$.Volumes[0].Size&apos;&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;Integer&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;  - &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;CalculateNewSize&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;aws:executeScript&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;      Runtime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;python3.11&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;main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Script&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;        def main(events, context):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            return {&apos;NewSize&apos;: int(events[&apos;current&apos;] * 1.5)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      InputPayload&lt;/span&gt;&lt;span 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;        current&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ GetCurrentSize.CurrentSize }}&apos;&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:#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;NewSize&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        Selector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;$.Payload.NewSize&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;Integer&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;  - &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;ModifyVolume&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;aws:executeAwsApi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    inputs&lt;/span&gt;&lt;span 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;ec2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Api&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ModifyVolume&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      VolumeId&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ VolumeId }}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      Size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{ CalculateNewSize.NewSize }}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;aws-제공-런북-사전-정의&quot;&gt;AWS 제공 런북 (사전 정의)&lt;/h2&gt;
&lt;p&gt;100+ 개의 표준 런북 이미 존재. &lt;code&gt;AWS-*&lt;/code&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;AWS-RestartEC2Instance&lt;/code&gt;&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;code&gt;AWS-StopEC2Instance&lt;/code&gt;&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;code&gt;AWS-CreateImage&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AMI 생성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWS-UpdateLinuxAmi&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Linux AMI 패치 후 새 AMI 생성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWS-EnableS3BucketEncryption&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;S3 버킷 암호화 활성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWS-DisablePublicAccessForSecurityGroup&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;0.0.0.0/0 규칙 제거&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSSupport-TroubleshootSSH&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SSH 접속 문제 진단&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;AWSSupport-CopyEBSSnapshot&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;AWS-RestoreRdsFromSnapshot&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;RDS 복원&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;활용&lt;/strong&gt;: [[aws-config|AWS Config]] 규칙 위반 → 자동 remediation 런북 실행 (예: 퍼블릭 SG 발견 → 자동 제거).&lt;/p&gt;
&lt;h2 id=&quot;실행-방법&quot;&gt;실행 방법&lt;/h2&gt;
&lt;h3 id=&quot;1-aws-콘솔&quot;&gt;1. AWS 콘솔&lt;/h3&gt;
&lt;p&gt;SSM → Automation → Execute automation. 폼에 파라미터 입력.&lt;/p&gt;
&lt;h3 id=&quot;2-cli&quot;&gt;2. CLI&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; ssm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start-automation-execution&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; &quot;app-deploy-with-approval&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;  --parameters&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Version=v1.2.3&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-parameter-name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;InstanceId&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;  --targets&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Key=tag:Env,Values=prod&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;  --max-concurrency&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;  --max-errors&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-aws-eventbridgeeventbridge-트리거&quot;&gt;3. [[aws-eventbridge|EventBridge]] 트리거&lt;/h3&gt;
&lt;p&gt;CloudWatch Alarm, S3 이벤트, 스케줄 등 → EventBridge Rule → Automation 실행.&lt;/p&gt;
&lt;h3 id=&quot;4-aws-configaws-config-remediation&quot;&gt;4. [[aws-config|AWS Config]] Remediation&lt;/h3&gt;
&lt;p&gt;Config 규칙 위반 감지 → 자동 remediation 런북 지정.&lt;/p&gt;
&lt;h2 id=&quot;실행-모드&quot;&gt;실행 모드&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AutoApprove&lt;/strong&gt;: 승인 게이트 자동 통과 (테스트 / dev)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate Control&lt;/strong&gt;: 대량 배포 시 concurrency + error threshold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactive&lt;/strong&gt;: 매 스텝 실행 전 사용자 확인 (조사 목적)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;요금&quot;&gt;요금&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;일부 무료&lt;/strong&gt;: 매월 100,000 스텝 무료&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;초과 시&lt;/strong&gt;: 스텝당 $0.002 (예: 스텝 10 개 런북 10 회 = 100 스텝)&lt;/li&gt;
&lt;li&gt;하위 서비스 (EC2, Lambda 등) 요금 별도&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;런북 assumeRole 권한 부족&lt;/strong&gt; = 스텝 중간 실패. IAM 정책은 사용하는 모든 API (&lt;code&gt;ec2:*&lt;/code&gt;, &lt;code&gt;iam:*&lt;/code&gt;, &lt;code&gt;s3:*&lt;/code&gt; 등) 를 포함해야 함. 최소 권한 유지하되 필요 액션 다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;&lt;code&gt;onFailure: Continue&lt;/code&gt; 남용&lt;/strong&gt; = 중요 스텝 실패해도 진행 → 반쯤 완료된 상태. 대부분 &lt;code&gt;Abort&lt;/code&gt; 가 안전.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;&lt;code&gt;aws:approve&lt;/code&gt; timeout&lt;/strong&gt; (기본 7일). 승인자 알림 [[aws-sns|SNS]] 필수. 승인자가 놓치면 실행 만료.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;&lt;code&gt;aws:executeScript&lt;/code&gt; 는 Python 3.x / PowerShell&lt;/strong&gt; 지원. 무거운 로직은 Lambda 로 분리해 &lt;code&gt;aws:invokeLambdaFunction&lt;/code&gt; 이 좋음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;런북 버전&lt;/strong&gt; 명시. &lt;code&gt;--document-version &quot;$LATEST&quot;&lt;/code&gt; 는 재현 불가. 프로덕션은 &lt;code&gt;&quot;3&quot;&lt;/code&gt; 등 고정.&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;잘못 만든 런북이 대량 리소스 파괴&lt;/strong&gt; 가능. Dev 계정에서 충분히 테스트 후 프로덕션. Config remediation 연결 전 dry-run.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[aws-systems-manager|Systems Manager (개요)]] - 상위 서비스&lt;/li&gt;
&lt;li&gt;[[aws-ssm-run-command|SSM Run Command]] - 단일 스크립트 실행&lt;/li&gt;
&lt;li&gt;[[aws-ssm-state-manager|SSM State Manager]] - 상태 유지&lt;/li&gt;
&lt;li&gt;[[aws-step-functions|Step Functions]] - 대안 워크플로 (일반 애플리케이션)&lt;/li&gt;
&lt;li&gt;[[aws-eventbridge|EventBridge]] - 트리거&lt;/li&gt;
&lt;li&gt;[[aws-config|AWS Config]] - remediation 통합&lt;/li&gt;
&lt;li&gt;[[aws-lambda|Lambda]] - 커스텀 로직 호출&lt;/li&gt;
&lt;li&gt;[[aws-iam|IAM]] - 실행 role&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloud</category><category>ssm</category><category>systems-manager</category><category>automation</category><category>runbook</category><category>orchestration</category><author>koa (김신건)</author></item></channel></rss>