EC2 User Data와 메타데이터: 인스턴스 자동화의 핵심
EC2 User Data로 부트스트랩 자동화하고, 메타데이터로 인스턴스 정보를 조회하는 방법을 완벽 정리합니다. SAA-C03 시험 필수 개념.
관련 시험 도메인
- Domain 2: Design Resilient Architectures
- Domain 3: Design High-Performing Architectures
핵심 요약
User Data는 인스턴스 시작 시 자동 실행되는 스크립트이고, 메타데이터는 인스턴스가 자신의 정보를 조회하는 방법입니다. 둘 다
169.254.169.254라는 링크-로컬 주소를 통해 인스턴스 내부에서만 접근할 수 있습니다.
시험 팁
시험 핵심: User Data는 첫 번째 부팅 시에만 실행됩니다(기본값). 메타데이터에서 IAM 역할의 임시 자격 증명을 얻을 수 있어 EC2에 자격 증명을 하드코딩할 필요가 없습니다. IMDSv2(토큰 기반)가 보안상 권장됩니다.
| 구분 | User Data | Instance Metadata |
|---|---|---|
| 용도 | 부팅 시 스크립트 실행 | 인스턴스 정보 조회 |
| 실행 시점 | 첫 번째 부팅 (기본값) | 언제든 조회 가능 |
| 최대 크기 | 16KB | - |
| 접근 방식 | 인스턴스 내부에서 HTTP | 인스턴스 내부에서 HTTP |
| 엔드포인트 | 169.254.169.254/latest/user-data | 169.254.169.254/latest/meta-data/ |
User Data란?
개념
User Data는 EC2 인스턴스가 시작될 때 자동으로 실행되는 스크립트입니다. 이를 **부트스트래핑(bootstrapping)**이라고 합니다.
User Data 활용 예시:
├── 소프트웨어 설치 (웹 서버, 에이전트 등)
├── 패키지 업데이트
├── 파일 다운로드 (S3에서 설정 파일)
├── 서비스 시작/활성화
├── 환경 변수 설정
└── CloudWatch Agent 설정
User Data 기본 형식
#!/bin/bash
# 모든 User Data 스크립트는 #!로 시작
# 패키지 업데이트
yum update -y
# 웹 서버 설치 및 시작
yum install -y httpd
systemctl start httpd
systemctl enable httpd
# 웹 페이지 생성
echo "<h1>Hello from EC2</h1>" > /var/www/html/index.html
User Data 주요 특성
| 특성 | 설명 |
|---|---|
| 실행 권한 | root 권한으로 실행 |
| 실행 시점 | 첫 번째 부팅 시에만 (기본값) |
| 최대 크기 | 16KB (gzip 압축 가능) |
| 인코딩 | Base64 인코딩 (콘솔에서 자동 처리) |
| 로그 위치 | /var/log/cloud-init-output.log |
| AMI 포함 여부 | AMI 생성 시 User Data는 포함되지 않음 |
시험 팁
시험 포인트: User Data는 AMI에 포함되지 않습니다. 인스턴스에서 AMI를 생성해도 해당 인스턴스의 User Data는 새 AMI에 저장되지 않습니다.
User Data 작성 방법
Shell Script 방식
#!/bin/bash
# 가장 일반적인 방식
# 로그 출력 (디버깅용)
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
echo "User Data 실행 시작: $(date)"
# 패키지 설치
yum update -y
yum install -y docker
systemctl start docker
systemctl enable docker
# Docker 이미지 실행
docker run -d -p 80:80 nginx
echo "User Data 실행 완료: $(date)"
Cloud-Init Directive 방식
#cloud-config
# YAML 형식의 cloud-init 설정
packages:
- httpd
- php
runcmd:
- systemctl start httpd
- systemctl enable httpd
- echo "Hello World" > /var/www/html/index.html
write_files:
- path: /etc/myapp/config.json
content: |
{
"environment": "production",
"debug": false
}
S3에서 스크립트 다운로드
#!/bin/bash
# 대용량 스크립트는 S3에 저장 후 다운로드
# AWS CLI는 Amazon Linux에 기본 설치됨
aws s3 cp s3://my-bucket/setup-script.sh /tmp/setup.sh
chmod +x /tmp/setup.sh
/tmp/setup.sh
User Data 재실행 설정
기본 동작
기본적으로 User Data는 첫 번째 부팅 시에만 실행됩니다. 재부팅해도 다시 실행되지 않습니다.
매번 부팅 시 실행하려면
#cloud-config
# cloud-init의 매번 실행 설정
cloud_final_modules:
- [scripts-user, always]
또는 User Data에서 직접:
#!/bin/bash
# /var/lib/cloud/instance/sem/ 파일 삭제
rm -f /var/lib/cloud/instance/sem/config_scripts_user
# 스크립트 내용...
시험 팁
시험 함정: "User Data를 수정하면 인스턴스 재시작 후 새 스크립트가 실행된다" → 틀림. 기본적으로 첫 번째 부팅 시에만 실행됩니다. 매번 실행하려면 추가 설정이 필요합니다.
Instance Metadata란?
개념
Instance Metadata는 EC2 인스턴스가 자기 자신의 정보를 조회할 수 있는 서비스입니다.
메타데이터로 조회 가능한 정보:
├── instance-id # 인스턴스 ID
├── instance-type # 인스턴스 유형 (t3.micro 등)
├── ami-id # AMI ID
├── hostname # 호스트명
├── local-ipv4 # Private IP
├── public-ipv4 # Public IP
├── placement/
│ └── availability-zone # 가용 영역
├── security-groups # 보안 그룹 이름
├── iam/
│ └── security-credentials/<role-name> # IAM 역할 자격 증명
└── network/interfaces/ # 네트워크 인터페이스 정보
메타데이터 조회 방법
# 인스턴스 ID 조회
curl http://169.254.169.254/latest/meta-data/instance-id
# 가용 영역 조회
curl http://169.254.169.254/latest/meta-data/placement/availability-zone
# Public IP 조회
curl http://169.254.169.254/latest/meta-data/public-ipv4
# Private IP 조회
curl http://169.254.169.254/latest/meta-data/local-ipv4
# 인스턴스 유형 조회
curl http://169.254.169.254/latest/meta-data/instance-type
# 전체 메타데이터 카테고리 목록
curl http://169.254.169.254/latest/meta-data/
IMDSv1 vs IMDSv2
비교표
| 항목 | IMDSv1 | IMDSv2 |
|---|---|---|
| 인증 방식 | 없음 (누구나 접근) | 토큰 기반 |
| 보안 | SSRF 공격에 취약 | SSRF 방어 |
| 요청 방식 | 단순 GET 요청 | PUT으로 토큰 → GET으로 조회 |
| AWS 권장 | 비권장 | 권장 |
IMDSv2 사용법
# 1. 토큰 획득 (PUT 요청, TTL 설정)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 2. 토큰으로 메타데이터 조회
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id
IMDSv2 강제 설정
# AWS CLI로 IMDSv2 필수 설정
aws ec2 modify-instance-metadata-options \
--instance-id i-1234567890abcdef0 \
--http-tokens required \
--http-endpoint enabled
시험 팁
시험 핵심: IMDSv2가 보안상 권장됩니다. --http-tokens required 설정으로 IMDSv1을 비활성화하고 IMDSv2만 허용할 수 있습니다. SSRF(Server-Side Request Forgery) 공격을 방어합니다.
IAM 역할과 메타데이터
EC2에서 AWS 서비스 접근
EC2 인스턴스가 S3, DynamoDB 등 AWS 서비스에 접근하려면 자격 증명이 필요합니다.
자격 증명 방법 (권장 순서):
1. ✅ IAM 역할 (Instance Profile) - 권장
2. ❌ 환경 변수에 Access Key 저장 - 비권장
3. ❌ 코드에 Access Key 하드코딩 - 절대 금지
IAM 역할 자격 증명 조회
# IAM 역할 이름 조회
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# 임시 자격 증명 조회
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/MyEC2Role
# 응답 예시:
{
"Code": "Success",
"AccessKeyId": "ASIA...",
"SecretAccessKey": "xxx...",
"Token": "xxx...",
"Expiration": "2026-01-26T12:00:00Z"
}
AWS SDK 자동 사용
# Python에서 AWS SDK (boto3) 사용
# IAM 역할이 연결되어 있으면 자격 증명 자동 획득
import boto3
# 자격 증명 명시 불필요 - 메타데이터에서 자동 획득
s3 = boto3.client('s3')
s3.list_buckets()
시험 팁
시험 포인트: AWS SDK는 IAM 역할의 임시 자격 증명을 메타데이터에서 자동으로 가져옵니다. Access Key를 코드에 하드코딩하지 마세요!
실전 User Data 예제
1. 웹 서버 + CloudWatch Agent
#!/bin/bash
# 웹 서버 설치 및 CloudWatch 모니터링 설정
# 기본 설정
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# 웹 서버 설치
yum update -y
yum install -y httpd amazon-cloudwatch-agent
# 웹 페이지 생성
cat > /var/www/html/index.html << EOF
<h1>Hello from $INSTANCE_ID</h1>
<p>Region: $REGION</p>
EOF
# 웹 서버 시작
systemctl start httpd
systemctl enable httpd
# CloudWatch Agent 설정 다운로드 및 시작
aws s3 cp s3://my-config-bucket/cloudwatch-config.json /opt/aws/amazon-cloudwatch-agent/etc/
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-c file:/opt/aws/amazon-cloudwatch-agent/etc/cloudwatch-config.json \
-s
2. ECS 컨테이너 인스턴스 등록
#!/bin/bash
# ECS 클러스터에 컨테이너 인스턴스 등록
echo ECS_CLUSTER=my-ecs-cluster >> /etc/ecs/ecs.config
echo ECS_ENABLE_CONTAINER_METADATA=true >> /etc/ecs/ecs.config
3. Auto Scaling에서 동적 설정
#!/bin/bash
# Auto Scaling 그룹에서 동적으로 설정 적용
# 인스턴스 정보 조회
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
INSTANCE_TYPE=$(curl -s http://169.254.169.254/latest/meta-data/instance-type)
# AZ별 설정 적용
case $AZ in
*a) DB_HOST="db-primary.example.com" ;;
*b) DB_HOST="db-replica-1.example.com" ;;
*c) DB_HOST="db-replica-2.example.com" ;;
esac
# 환경 변수로 설정
echo "export DB_HOST=$DB_HOST" >> /etc/environment
트러블슈팅
User Data 실행 확인
# cloud-init 로그 확인
cat /var/log/cloud-init-output.log
# cloud-init 상태 확인
cloud-init status
# User Data 내용 확인
curl http://169.254.169.254/latest/user-data
일반적인 문제
| 문제 | 원인 | 해결책 |
|---|---|---|
| 스크립트 미실행 | shebang(#!/bin/bash) 누락 | 첫 줄에 shebang 추가 |
| 권한 오류 | 파일/디렉토리 권한 | chmod, chown 확인 |
| 패키지 설치 실패 | 네트워크 미연결 | NAT Gateway/IGW 확인 |
| S3 접근 실패 | IAM 역할 미연결 | Instance Profile 확인 |
| 메타데이터 조회 실패 | IMDS 비활성화 | --http-endpoint enabled 설정 |
시험 출제 포인트
자주 나오는 문제 유형
| 유형 | 핵심 포인트 |
|---|---|
| 실행 시점 | User Data는 첫 번째 부팅 시에만 실행 (기본값) |
| IAM 자격 증명 | 메타데이터에서 임시 자격 증명 자동 획득 |
| 보안 | IMDSv2 권장, SSRF 공격 방어 |
| 크기 제한 | User Data 최대 16KB |
| AMI 포함 | User Data는 AMI에 포함되지 않음 |
| 로그 위치 | /var/log/cloud-init-output.log |
오답 함정
❌ User Data를 수정하면 재부팅 시 새 스크립트가 실행된다
→ 기본적으로 첫 번째 부팅 시에만 실행
❌ IMDSv1과 IMDSv2는 보안 수준이 같다
→ IMDSv2가 토큰 기반으로 더 안전
❌ 메타데이터는 인스턴스 외부에서도 조회할 수 있다
→ 169.254.169.254는 인스턴스 내부에서만 접근 가능
❌ IAM 역할의 자격 증명은 영구적이다
→ 임시 자격 증명이며 자동으로 갱신됨
❌ User Data는 AMI에 포함된다
→ 포함되지 않음
FAQ
Q1: User Data와 Launch Template의 차이점은?
User Data는 인스턴스 시작 시 실행되는 스크립트입니다. Launch Template은 인스턴스 설정(AMI, 인스턴스 유형, 보안 그룹, User Data 등)의 템플릿입니다. Launch Template에 User Data를 포함할 수 있습니다.
Q2: User Data 스크립트가 실패하면 인스턴스 시작이 중단되나요?
아니요, User Data 스크립트가 실패해도 인스턴스는 정상적으로 시작됩니다. 스크립트 실패 여부는 /var/log/cloud-init-output.log에서 확인할 수 있습니다.
Q3: 메타데이터를 완전히 비활성화할 수 있나요?
네, --http-endpoint disabled 설정으로 IMDS를 완전히 비활성화할 수 있습니다. 단, 이 경우 IAM 역할 자격 증명도 사용할 수 없게 됩니다.
Q4: 169.254.169.254 주소는 왜 사용하나요?
**링크-로컬 주소(Link-Local Address)**입니다. 이 주소는 라우팅되지 않아 인스턴스 외부에서 접근할 수 없습니다. AWS가 메타데이터 서비스를 위해 사용하는 특수 주소입니다.
Q5: User Data 크기가 16KB를 초과하면?
gzip으로 압축하거나, S3에 스크립트를 저장하고 User Data에서 다운로드하는 방식을 사용하세요. 압축 시 #include 또는 #cloud-config-archive 형식을 사용합니다.
마무리
User Data와 메타데이터는 EC2 자동화의 핵심입니다:
- User Data: 부팅 시 스크립트 자동 실행, 16KB 제한, 첫 부팅만 실행
- 메타데이터: 인스턴스 정보 조회, IAM 자격 증명 획득
- IMDSv2: 토큰 기반 인증, 보안상 권장
- IAM 역할: Access Key 대신 임시 자격 증명 사용
다음으로 EC2 기초와 Auto Scaling 정책을 학습하면 EC2 관련 내용을 완성할 수 있습니다.