학습 목표

인스턴스 패밀리와 명명 규칙

인스턴스 타입 이름은 네 부분으로 이루어집니다 — 패밀리 · 세대 · 부가 기능 · 크기입니다. 예를 들어 c5n.xlarge는 컴퓨팅 최적화 패밀리(c)의 5세대(5)이며 네트워크가 최적화되어 있고(n) 크기는 xlarge라는 뜻입니다. 점 뒤가 크기이고, 베어메탈은 metal로 표기합니다.

SAA에서 자주 쓰이는 인스턴스 패밀리 문자와 의미
문자 의미 대표 워크로드
M Most scenarios — 범용 웹 · 애플리케이션 서버, 중소형 데이터베이스
T Turbo — 버스트 가능 성능 평소 부하가 낮고 가끔 튀는 개발 · 소규모 서비스
C Compute — 컴퓨팅 최적화 배치 처리, 미디어 인코딩, 고성능 웹 서버
R Random access memory — 메모리 최적화 인메모리 캐시, 대용량 인메모리 데이터베이스
X · U Extra-large memory · Ultra-high memory 인메모리 데이터베이스, 대규모 분석
I · D I/O · Dense storage — 스토리지 최적화 NoSQL, 데이터 웨어하우스, 분산 파일 시스템
P · G · Inf · Trn GPU · AWS Inferentia · AWS Trainium — 가속 컴퓨팅 머신러닝 학습과 추론, 그래픽 워크로드
Hpc High performance computing 노드 간 통신이 잦은 병렬 시뮬레이션

패밀리 문자 뒤에 붙는 부가 기능 문자도 문항의 힌트가 됩니다 — a는 AMD, g는 AWS Graviton, i는 Intel 프로세서, d는 인스턴스 스토어 볼륨, n은 네트워크 최적화, b는 블록 스토리지 최적화, e는 추가 스토리지나 메모리, z는 고클럭입니다. d가 붙은 타입은 인스턴스 스토어를 포함하므로 6장의 인스턴스 스토어 휘발성이 그대로 적용됩니다.

인스턴스를 키울 것인가, 늘릴 것인가

인스턴스 타입을 더 큰 것으로 바꾸는 것이 수직 확장이고, 같은 인스턴스를 여러 대로 늘리는 것이 수평 확장입니다. EC2에서 타입 변경은 인스턴스를 중지한 상태에서만 할 수 있으므로 중단이 따라옵니다. 게다가 인스턴스가 한 대인 이상 단일 장애점은 그대로 남습니다.

그래서 탄력성 · 확장성 · 고가용성이 요구되면 답은 수평 확장이고, 그 장치가 7장의 Auto Scaling 그룹입니다. 수직 확장이 정답이 되는 경우는 수평으로 나눌 수 없는 워크로드일 때입니다.

구매 옵션 5종 — 무엇을 약정하는가 SAA 빈출

구매 옵션은 결국 무엇을 얼마나 약속하고 그 대가로 무엇을 포기하느냐의 문제입니다. 아무것도 약속하지 않으면 온디맨드이고, 금액을 약속하면 Savings Plans, 구성을 약속하면 예약 인스턴스, 중단을 감수하면 스팟, 물리 호스트를 통째로 쓰면 전용 호스트입니다.

EC2 구매 옵션 5종 결정 트리 워크로드의 성격을 네 번 물어 다섯 가지 구매 옵션 중 하나로 수렴시키는 결정 트리입니다. 먼저 중단을 허용할 수 있으면 스팟 인스턴스입니다. 허용할 수 없다면 1년 이상 꾸준히 쓸 계획인지 묻고, 아니라면 온디맨드입니다. 꾸준히 쓴다면 물리 서버 가시성이나 소켓·코어 단위 라이선스 요구가 있는지 묻고, 있다면 전용 호스트입니다. 없다면 특정 가용 영역의 용량 예약이 필요한지 묻고, 필요하면 예약 인스턴스, 필요 없고 유연성이 중요하면 Savings Plans 입니다. 금액은 표시하지 않습니다. 약정 기간이 길고 중단을 더 많이 허용할수록 단가가 낮아진다는 상대 관계만 기억하면 됩니다. 중단을 허용할 수 있는가 배치 · 렌더링 · 상태 비저장 1년 이상 꾸준히 쓰는가 기저 부하가 있는가 물리 서버 가시성이 필요한가 소켓·코어 단위 라이선스 용량 예약이 필요한가 특정 AZ 의 자리 확보 스팟 인스턴스 단가가 가장 낮습니다 용량이 회수되면 중단됩니다 온디맨드 약정이 없습니다 단가는 가장 높습니다 전용 호스트 물리 호스트를 통째로 할당 소켓·코어 라이선스에 대응 예약 인스턴스 1년 또는 3년 약정 영역 지정 시 용량 예약 Savings Plans 1년 또는 3년 약정 사용량 기준 · 인스턴스 유연 예 아니오 아니오 예 예 아니오 예 아니오 금액은 쓰지 않습니다 — 약정 기간이 길고 중단을 더 허용할수록 단가가 낮아진다는 상대 관계만 기억합니다
구매 옵션 결정 트리 — 중단을 허용할 수 있는가, 사용 기간을 약정할 수 있는가, 라이선스나 규정이 물리적 격리를 요구하는가라는 세 갈래로 다섯 옵션이 갈립니다
EC2 구매 옵션 다섯 가지의 약정 대상과 성격
옵션 무엇을 약정하는가 중단 가능성 언제 고르는가
온디맨드 없음. 실행한 초 단위로 지불 없음 부하를 예측할 수 없는 초기 단계, 단기 실험, 스파이크 대응
Savings Plans 시간당 사용 금액을 1년 또는 3년 약정 없음 상시 기저 부하가 있고, 인스턴스 구성을 바꿀 여지를 남기고 싶을 때
예약 인스턴스(RI) 인스턴스 구성(타입 · 리전 등)을 1년 또는 3년 약정 없음 구성이 고정되어 있고, 특정 가용 영역의 용량 확보가 필요할 때
스팟 인스턴스 없음. 대신 AWS가 용량을 회수할 수 있음 있음 — 2분 전 통지 후 중단 중단되어도 되는 배치 · 분석 · 렌더링 · 백그라운드 처리
전용 호스트 · 전용 인스턴스 물리 서버 단위(호스트) 또는 단일 테넌트 하드웨어(인스턴스) 없음 소켓 · 코어 단위 라이선스를 가져와야 하거나 물리적 격리가 규정인 경우
구매 옵션의 상대 비용과 유연성 위치. 비용을 낮추는 방향과 유연성을 지키는 방향이 서로 반대라는 것이 이 그림의 결론입니다. 두 축 모두 등급이며 실제 금액이 아닙니다 — 요금은 리전과 시점에 따라 달라집니다

온디맨드 — 기준선

약정이 없고 실행한 만큼 지불합니다. 다른 옵션의 절감 효과는 언제나 온디맨드 요율을 기준으로 설명됩니다. 시험에서 온디맨드가 정답이 되는 경우는 기간이 짧거나 부하를 아직 모를 때입니다. "1년 약정" 같은 조건이 문제에 없는데 예약 인스턴스를 고르는 것은 과잉 설계입니다.

예약 인스턴스 — 구성을 약정한다

예약 인스턴스는 인스턴스 타입과 리전을 포함한 구성을 1년 또는 3년 약정하고 온디맨드보다 낮은 요율을 적용받습니다. 선택할 것이 세 가지 있습니다.

예약 인스턴스의 세 가지 선택 축
축 값 차이
범위(scope) Region / Availability Zone 리전 범위는 용량을 예약하지 않지만 가용 영역과 인스턴스 크기 유연성이 있고, 가용 영역 범위는 해당 가용 영역의 용량을 예약하지만 유연성이 없다
제공 클래스 standard / convertible 표준은 절감 폭이 크고, 컨버터블은 기간 중 다른 인스턴스 구성으로 교환할 수 있다
결제 방식 All Upfront / Partial Upfront / No Upfront 선결제 비중이 클수록 절감 폭이 커진다

시험에서 "특정 가용 영역에 용량을 확보해야 한다"는 조건이 붙으면 리전 범위 예약 인스턴스나 Savings Plans는 답이 아닙니다. 용량 예약이 필요하면 가용 영역 범위 예약 인스턴스 또는 온디맨드 용량 예약(On-Demand Capacity Reservations)입니다.

Savings Plans — 금액을 약정한다

Savings Plans는 인스턴스 구성이 아니라 시간당 사용 금액을 1년 또는 3년 약정합니다. 약정한 금액까지는 할인 요율이 적용되고, 초과분은 온디맨드 요율로 청구됩니다. 결제 방식은 예약 인스턴스와 같이 세 가지입니다. SAA 범위에서 구분해야 할 유형은 두 가지입니다.

Savings Plans 두 유형의 적용 범위
유형 API 값 적용 범위
Compute Savings Plans Compute 인스턴스 패밀리 · 크기 · 리전 · 운영체제 · 테넌시를 바꿔도 적용되고, AWS Fargate와 AWS Lambda 사용량에도 적용된다. 가장 유연하다
EC2 Instance Savings Plans EC2Instance 특정 리전의 특정 인스턴스 패밀리에 한정된다. 유연성을 포기하는 대신 Compute 유형보다 절감 폭이 크다

스팟 인스턴스 — 중단을 감수한다

스팟 인스턴스는 남는 EC2 용량을 온디맨드보다 낮은 가격에 쓰는 방식입니다. AWS가 용량이 필요해지면 인스턴스를 회수하며, 이때 2분 전에 중단 통지(interruption notice)가 인스턴스 메타데이터로 전달됩니다. 더 이른 신호로 재조정 권장(rebalance recommendation)이 있어 중단 위험이 높아졌을 때 미리 워크로드를 옮길 기회를 줍니다.

스팟 인스턴스 중단 처리 타임라인 스팟 인스턴스가 회수될 때 일어나는 일을 왼쪽에서 오른쪽으로 늘어놓은 타임라인입니다. 정상 실행 중이던 인스턴스에 대해 EC2 가 용량 회수를 결정하면 중단 알림이 인스턴스 메타데이터와 EventBridge 로 전달됩니다. 알림 이후 약 2분의 유예가 주어지고, 이 시간 안에 진행 중인 요청을 마무리하고 로드 밸런서에서 빠지고 작업 상태를 외부 스토리지에 체크포인트로 저장해야 합니다. 유예가 끝나면 인스턴스는 종료되고, Auto Scaling 그룹이나 EC2 플릿이 다른 용량 풀에서 대체 인스턴스를 시작합니다. 2분 안에 끝낼 수 있는 일만 남아 있어야 하므로 상태를 인스턴스 안에 두지 않는 설계가 전제입니다. 정상 실행 스팟 용량으로 작업 처리 중 중단 알림 메타데이터와 EventBridge 로 약 2분 유예 드레이닝 · 체크포인트 저장 인스턴스 종료 로컬 상태는 함께 사라집니다 재배치 다른 용량 풀에서 대체 인스턴스 시작 시간 → 이 구간이 전부입니다 2분 안에 끝낼 수 있는 일만 남아 있어야 합니다 세션과 작업 상태를 인스턴스 밖(S3 · DynamoDB · ElastiCache)에 두고 언제 사라져도 되는 상태 비저장 설계를 전제로 씁니다 여러 인스턴스 유형과 여러 AZ 를 후보로 두면 한 용량 풀이 마르더라도 대체를 찾기 쉬워집니다
스팟 인스턴스 중단 처리 타임라인 — 재조정 권장 신호와 2분 중단 통지를 받아 진행 중 작업을 마무리하고 체크포인트를 남긴 뒤 Auto Scaling이 대체 용량을 확보합니다. 상태 비저장 설계가 전제입니다

중단 시 동작은 종료 · 중지 · 최대 절전(terminate · stop · hibernate) 중에서 고를 수 있고, 요청은 일회성(one-time)과 지속(persistent)이 있습니다. 지속 요청은 중단된 뒤 용량이 생기면 자동으로 다시 제출됩니다.

스팟이 답이 되는 신호는 명확합니다 — "중단되어도 된다", "내결함성이 있다", "언제 실행되든 상관없다", "배치 작업"입니다. 반대로 상태를 로컬에 유지하는 서버, 즉시 응답해야 하는 사용자 요청 처리, 중단이 곧 데이터 손실인 워크로드에는 쓰지 않습니다.

전용 호스트와 전용 인스턴스

테넌시(Tenancy) 값은 default · dedicated · host 세 가지입니다. 전용 인스턴스(dedicated)는 단일 테넌트 하드웨어에서 실행되지만 물리 서버 자체를 우리가 지정하지는 않습니다. 전용 호스트(host)는 물리 서버를 통째로 배정받아 소켓 · 코어 · VM 단위 라이선스를 가져와 쓸 수 있고 소켓과 코어 수를 볼 수 있습니다.

따라서 시험의 갈림길은 이렇습니다 — "기존 서버 바인딩 라이선스를 가져와야 한다"면 전용 호스트, "다른 고객과 하드웨어를 공유하지 않아야 한다"는 규정만 있으면 전용 인스턴스로 충분합니다.

핵심 판단 — 스팟인가 Savings Plans인가

도메인 4에서 가장 자주 나오는 판단입니다. 기준은 단 하나, 워크로드가 중단을 견디는가입니다.

워크로드 특성에 따른 구매 옵션 배정
워크로드 특성 배정 근거
24시간 상시 실행되는 기저 부하 Savings Plans (또는 예약 인스턴스) 어차피 계속 쓸 용량이므로 약정으로 단가를 낮추는 것이 순이익이다
중단되어도 되는 배치 · 분석 · 렌더링 스팟 인스턴스 중단 비용이 낮으므로 남는 용량을 쓰는 대가를 감당할 수 있다
예측 불가능한 단기 스파이크 온디맨드 약정 기간보다 짧게 쓰면 약정이 오히려 손해다
구성이 고정되고 용량 확보까지 필요 가용 영역 범위 예약 인스턴스 Savings Plans는 용량을 예약하지 않는다
서버 바인딩 라이선스 · 물리적 격리 규정 전용 호스트 · 전용 인스턴스 비용이 아니라 라이선스와 규정이 결정 기준이다

실무와 시험 모두에서 흔한 정답 형태는 혼합입니다. Auto Scaling 그룹의 기저 대수는 Savings Plans로 덮고, 그 위로 늘어나는 변동분은 스팟으로 채우는 구성입니다. 이때도 전제는 상태 비저장 설계입니다 — 스팟 인스턴스가 2분 뒤 사라져도 서비스가 계속되어야 하기 때문입니다.

AMI와 사용자 데이터 — 무엇을 굽고 무엇을 실행할 것인가

Amazon Machine Image

AMI는 인스턴스를 시작할 때 쓰는 템플릿이며, 루트 볼륨의 스냅샷과 블록 디바이스 매핑, 시작 권한을 담습니다. EBS 기반 인스턴스에서 AMI를 만들면 연결된 EBS 볼륨의 스냅샷이 함께 생성되고, 그 AMI로 시작한 인스턴스는 같은 볼륨 구성을 그대로 갖습니다. AMI와 스냅샷의 관계는 6장에서 자세히 다룹니다.

AMI는 리전 단위 리소스입니다. 다른 리전에서 쓰려면 복사해야 하고, 복사 작업은 대상 리전에서 시작합니다. 재해 복구용으로 다른 리전에 골든 이미지를 미리 복사해 두는 구성이 여기서 나옵니다.

인스턴스 스토어 볼륨의 데이터는 AMI에 보존되지 않습니다. AMI로 시작한 새 인스턴스의 인스턴스 스토어는 비어 있습니다.

사용자 데이터 — 시작 시 실행되는 스크립트

사용자 데이터(user data)는 인스턴스를 시작할 때 전달하는 셸 스크립트 또는 cloud-init 지시문입니다. API로 넘길 때는 base64로 인코딩해야 하며, CLI와 SDK는 이 인코딩을 대신 해 주기도 합니다. 패키지 설치, 설정 파일 배치, 서비스 기동 같은 초기화를 여기서 처리합니다.

bootstrap.sh — 사용자 데이터로 전달할 초기화 스크립트 예시
#!/bin/bash
set -euo pipefail

# 애플리케이션 설정을 Parameter Store 에서 가져옵니다.
# 자격 증명은 인스턴스 프로파일(IAM 역할)로 해결하므로 키를 심지 않습니다.
APP_PORT=$(aws ssm get-parameter --name /app/web/port --query 'Parameter.Value' --output text)

systemctl enable --now web-app
echo "listen ${APP_PORT}" > /etc/web-app/listen.conf
systemctl restart web-app

사용자 데이터는 편하지만 기동 시간을 늘립니다. Auto Scaling 그룹이 새 인스턴스를 띄우는 상황에서는 이 시간이 곧 스케일아웃 지연이 됩니다. 그래서 실무 표준은 변하지 않는 부분은 AMI에 미리 굽고(golden AMI), 환경마다 달라지는 값만 사용자 데이터로 주입하는 것입니다.

배치 그룹 3종 — 성능과 장애 격리는 반대 방향

기본적으로 EC2는 인스턴스를 서로 다른 하드웨어에 흩어 놓으려 합니다. 배치 그룹은 그 배치에 개입해 더 가깝게 또는 더 멀리 두게 만드는 장치입니다. API의 배치 전략 값에는 cluster · partition · spread가 있습니다.

배치 그룹 3종의 장애 도메인 같은 랙 그림 위에 세 가지 배치 그룹 전략을 나란히 놓았습니다. 클러스터 배치 그룹은 하나의 가용 영역 안에서 인스턴스를 물리적으로 가깝게 모아 네트워크 지연을 최소화하지만 같은 랙을 공유하므로 랙 하나가 죽으면 전부 함께 죽습니다. 파티션 배치 그룹은 인스턴스를 파티션 단위로 묶고 파티션마다 서로 다른 랙에 배치하므로 랙 하나가 죽어도 한 파티션만 잃습니다. 분산 시스템의 복제본 배치에 맞습니다. 분산 배치 그룹은 인스턴스마다 랙을 완전히 분리하므로 장애 격리가 가장 강하지만 한 그룹에 넣을 수 있는 수가 제한됩니다. 아래 축이 결론입니다. 네트워크 성능 최적화와 장애 격리는 서로 반대 방향으로 움직입니다. 클러스터 파티션 분산 한 AZ 안에 근접 배치 파티션마다 다른 랙 인스턴스마다 다른 하드웨어 랙 1 인스턴스 인스턴스 인스턴스 인스턴스 랙 2 — 사용 안 함 근접이 목적 랙 1 · 파티션 1 인스턴스 인스턴스 랙 2 · 파티션 2 인스턴스 인스턴스 랙 1 인스턴스 랙 2 인스턴스 랙 3 인스턴스 랙 4 인스턴스 랙 하나가 죽으면 전부 랙 하나가 죽으면 한 파티션만 랙 하나가 죽으면 하나만 ← 네트워크 지연이 낮다 (성능 최적화) 장애 격리가 강하다 → 성능 최적화와 장애 격리는 서로 반대 방향입니다 HPC 처럼 노드 간 지연이 중요하면 클러스터, 가용성이 중요하면 파티션이나 분산을 고릅니다
배치 그룹 3종의 장애 도메인 비교 — 클러스터는 한 가용 영역 안에 인스턴스를 밀집시키고, 파티션은 랙 단위로 나누며, 분산은 인스턴스마다 하드웨어를 완전히 분리합니다
배치 그룹 세 가지의 배치 방식과 제약
전략 배치 방식 주요 제약 언제 고르는가
클러스터 cluster 단일 가용 영역 안에 인스턴스를 밀집 배치한다. 같은 고대역폭 네트워크 구간에 놓인다 여러 가용 영역에 걸칠 수 없다. 같은 타입으로 한 번에 시작하지 않으면 용량 부족 오류가 나기 쉽다 노드 간 통신이 잦은 HPC, 낮은 지연과 높은 처리량이 목표일 때
파티션 partition 인스턴스를 논리 파티션으로 나누고, 파티션끼리는 랙을 공유하지 않게 배치한다 가용 영역당 파티션 최대 7개. 전용 인스턴스를 쓰면 파티션 2개까지 HDFS · HBase · Cassandra처럼 복제본을 랙 단위로 흩어야 하는 대규모 분산 시스템
분산 spread 인스턴스를 각각 다른 하드웨어에 배치한다 랙 수준 분산은 가용 영역당 실행 인스턴스 최대 7개. 전용 인스턴스는 지원하지 않는다 소수의 중요한 인스턴스를 서로 떨어뜨려야 할 때

파티션 배치 그룹과 분산 배치 그룹은 같은 리전의 여러 가용 영역에 걸칠 수 있지만, 클러스터 배치 그룹은 단일 가용 영역을 벗어나지 못합니다. 여기서 시험이 노리는 충돌이 생깁니다 — "가용 영역 간 지연을 최소화하라"와 "다중 가용 영역으로 고가용성을 확보하라"는 동시에 만족시킬 수 없습니다. 문제문이 어느 쪽을 우선하는지 읽어야 합니다.

그 밖의 공통 제약도 함께 봅니다. 인스턴스는 한 번에 하나의 배치 그룹에만 속하고, 배치 그룹을 병합할 수 없으며, 전용 호스트에는 배치 그룹을 쓸 수 없습니다. 배치 그룹 생성 자체에는 요금이 붙지 않습니다.

create-placement-group.sh — 파티션 배치 그룹 생성과 인스턴스 시작 (리소스 ID는 예시입니다)
aws ec2 create-placement-group \
  --group-name analytics-pg \
  --strategy partition \
  --partition-count 3

aws ec2 run-instances \
  --image-id ami-0123456789abcdef0 \
  --instance-type r6i.2xlarge \
  --count 6 \
  --placement "GroupName=analytics-pg" \
  --subnet-id subnet-0123456789abcdef0

인스턴스 메타데이터와 IMDSv2 SAA 빈출

인스턴스 메타데이터 서비스(Instance Metadata Service, IMDS)는 인스턴스 안에서 링크 로컬 주소 169.254.169.254로 호출하는 로컬 엔드포인트입니다. 인스턴스 ID, AMI ID, 사용자 데이터, 그리고 연결된 IAM 역할의 임시 자격 증명을 여기서 얻습니다. SDK가 자격 증명을 자동으로 찾는 것도 이 경로 덕분입니다.

문제는 임시 자격 증명이 여기 있다는 사실 자체입니다. 애플리케이션에 서버 측 요청 위조(Server-Side Request Forgery, SSRF) 취약점이 있으면, 공격자가 애플리케이션에 169.254.169.254로 요청을 보내게 만들어 자격 증명을 훔칠 수 있습니다. IMDSv2는 이 공격 경로를 막기 위해 설계되었습니다.

IMDSv2 요청 흐름과 SSRF 차단 위쪽은 IMDSv2 의 정상 요청 흐름입니다. 인스턴스 안의 프로세스가 먼저 PUT 으로 토큰 발급을 요청하고, TTL 헤더와 함께 세션 토큰을 받습니다. 그 뒤 메타데이터를 읽는 모든 GET 요청에 토큰 헤더를 실어야만 응답을 받습니다. 토큰이 없는 GET 은 거부됩니다. 아래쪽은 서버 측 요청 위조 공격 비교입니다. 공격자는 취약한 애플리케이션이 임의의 URL 을 대신 가져오게 만들 수는 있지만 보통 GET 만 유도할 수 있고 임의 헤더를 붙이게 할 수도 없습니다. 그래서 IMDSv1 에서는 자격 증명이 그대로 빠져나가지만 IMDSv2 에서는 토큰 발급 단계에서 막힙니다. 아울러 hop limit 을 1 로 두면 응답 패킷이 한 홉을 넘지 못하므로 컨테이너처럼 한 홉 건너에 있는 프로세스가 접근하지 못합니다. IMDSv2 — 토큰을 먼저 받아야 합니다 인스턴스 안의 애플리케이션 인스턴스 메타데이터 서비스 (IMDS) 169.254.169.254 1. PUT /latest/api/token 2. 세션 토큰 발급 (TTL 지정) 3. GET + 토큰 헤더 4. 메타데이터 · 임시 자격 증명 응답 토큰 헤더가 없는 GET 은 거부됩니다 — 여기가 IMDSv1 과 갈리는 지점입니다 서버 측 요청 위조(SSRF) 공격 비교 공격자 URL 을 주입 취약한 애플리케이션 GET 만 대신 보낼 수 있음 임의 헤더 주입은 어려움 IMDSv1 — 그대로 응답 토큰 없이 GET 만으로 자격 증명 유출 IMDSv2 — 토큰 단계에서 차단 PUT 과 헤더를 유도할 수 없어 실패 hop limit — 응답 패킷이 넘을 수 있는 홉 수의 상한 1 로 두면 인스턴스 자신만 읽을 수 있고, 컨테이너처럼 한 홉 건너에 있는 프로세스는 읽지 못합니다 IMDSv2 를 필수로 강제하면(HttpTokens=required) IMDSv1 방식 요청 자체가 받아들여지지 않습니다
IMDSv2의 두 단계 요청 — PUT으로 세션 토큰을 받고 그 토큰을 헤더에 실은 GET만 응답을 받습니다. 홉 제한과 결합하면 서버 측 요청 위조로는 토큰 발급 단계를 통과할 수 없습니다

두 단계 요청 구조

IMDSv2는 세션 지향 방식입니다. 먼저 PUT으로 세션 토큰을 발급받고, 이후 모든 GET 요청 헤더에 그 토큰을 실어야 응답을 받습니다. 토큰의 유효 시간은 최소 1초에서 최대 6시간(21,600초)이며, 토큰 사용이 required인 인스턴스에서 토큰 없이 호출하면 401 Unauthorized가 반환됩니다. 토큰은 발급된 인스턴스에서만 유효해서 다른 인스턴스로 가져가 쓸 수 없습니다.

imdsv2.sh — 토큰 발급 후 메타데이터 조회 (인스턴스 안에서 실행합니다)
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
  -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")

curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id

# 연결된 IAM 역할 이름 확인
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/iam/security-credentials/

여기에 홉 제한(HttpPutResponseHopLimit)이 더해집니다. PUT 응답의 기본 홉 제한은 1이고 1에서 64 사이로 조정합니다. 홉 제한이 1이면 응답이 인스턴스를 벗어나지 못하므로 역방향 프록시나 컨테이너 네트워크를 한 번 더 거치는 요청은 토큰을 받을 수 없습니다. 컨테이너에서 메타데이터를 써야 한다면 이 값을 올려야 하지만, 올리는 만큼 노출 범위도 넓어진다는 것을 함께 알아야 합니다. 또한 PUT 요청에 X-Forwarded-For 헤더가 있으면 거부됩니다 — 프록시를 경유한 요청을 걸러 내기 위한 장치입니다.

2024년 이후의 기본값 정책

인스턴스 메타데이터 옵션의 값과 기본값
옵션 값 기본값
HttpTokens optional(IMDSv1도 허용) / required(IMDSv2 전용) AMI의 ImdsSupport와 계정 수준 기본값의 조합으로 결정된다
HttpEndpoint enabled / disabled enabled
HttpPutResponseHopLimit 1 – 64 1
HttpProtocolIpv6 enabled / disabled disabled
InstanceMetadataTags enabled / disabled disabled
enforce-imdsv2.sh — 계정 수준 기본값 설정과 기존 인스턴스 적용 (리소스 ID와 리전은 예시입니다)
# 이 리전에서 앞으로 시작되는 인스턴스의 기본값을 IMDSv2 전용으로 지정합니다.
aws ec2 modify-instance-metadata-defaults \
  --http-tokens required \
  --http-put-response-hop-limit 1 \
  --region ap-northeast-2

# 이미 실행 중인 인스턴스에 개별 적용합니다.
aws ec2 modify-instance-metadata-options \
  --instance-id i-0123456789abcdef0 \
  --http-tokens required \
  --http-endpoint enabled

인스턴스 수명주기와 상태별 과금

인스턴스 상태와 인스턴스 사용 요금 과금 여부
상태 의미 인스턴스 사용 요금
pending 시작 준비 중. 시작 직후 또는 중지 상태에서 다시 시작할 때 거친다 과금 안 됨
running 실행 중이며 사용 가능 과금됨
stopping 중지 준비 중 과금 안 됨 (최대 절전으로 중지할 때는 이 구간도 과금됨)
stopped 종료되지 않았고 언제든 다시 시작할 수 있다 과금 안 됨
shutting-down 종료 준비 중 과금 안 됨
terminated 영구 삭제되어 다시 시작할 수 없다 과금 안 됨 (예약 인스턴스 약정은 기간까지 계속 청구됨)

표는 인스턴스 사용 요금만 다룹니다. 중지된 인스턴스라도 연결된 EBS 볼륨과 Elastic IP 요금은 계속 발생합니다. "인스턴스를 껐는데 왜 요금이 나오는가"의 답이 여기 있습니다.

중지와 시작이 바꾸는 것들

운영체제 안에서 종료 명령을 실행했을 때의 동작은 InstanceInitiatedShutdownBehavior가 정하며 기본값은 stop입니다. 이 값을 terminate로 두면 인스턴스 안에서의 실수 한 번이 인스턴스 삭제로 이어집니다.

흔한 오해

시험 포인트 정리

확인 문제

이 장의 핵심을 확인하는 10문항입니다. 키보드만으로 완주할 수 있습니다 — 숫자키 1~5로 선택지를 고르고 Enter로 제출합니다.

이어서 볼 곳

공식 문서 출처

이 장의 설정값 · 기본값 · 동작은 모두 아래 문서에서 확인했습니다.