SAABlog
컴퓨팅초급

EC2 User Data와 메타데이터: 인스턴스 자동화의 핵심

EC2 User Data로 부트스트랩 자동화하고, 메타데이터로 인스턴스 정보를 조회하는 방법을 완벽 정리합니다. SAA-C03 시험 필수 개념.

PHILOLAMB-
EC2User Data메타데이터부트스트랩자동화

관련 시험 도메인

  • Domain 2: Design Resilient Architectures
  • Domain 3: Design High-Performing Architectures

핵심 요약

User Data는 인스턴스 시작 시 자동 실행되는 스크립트이고, 메타데이터는 인스턴스가 자신의 정보를 조회하는 방법입니다. 둘 다 169.254.169.254라는 링크-로컬 주소를 통해 인스턴스 내부에서만 접근할 수 있습니다.

시험 팁

시험 핵심: User Data는 첫 번째 부팅 시에만 실행됩니다(기본값). 메타데이터에서 IAM 역할의 임시 자격 증명을 얻을 수 있어 EC2에 자격 증명을 하드코딩할 필요가 없습니다. IMDSv2(토큰 기반)가 보안상 권장됩니다.

구분User DataInstance Metadata
용도부팅 시 스크립트 실행인스턴스 정보 조회
실행 시점첫 번째 부팅 (기본값)언제든 조회 가능
최대 크기16KB-
접근 방식인스턴스 내부에서 HTTP인스턴스 내부에서 HTTP
엔드포인트169.254.169.254/latest/user-data169.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

비교표

항목IMDSv1IMDSv2
인증 방식없음 (누구나 접근)토큰 기반
보안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 자동화의 핵심입니다:

  1. User Data: 부팅 시 스크립트 자동 실행, 16KB 제한, 첫 부팅만 실행
  2. 메타데이터: 인스턴스 정보 조회, IAM 자격 증명 획득
  3. IMDSv2: 토큰 기반 인증, 보안상 권장
  4. IAM 역할: Access Key 대신 임시 자격 증명 사용

다음으로 EC2 기초Auto Scaling 정책을 학습하면 EC2 관련 내용을 완성할 수 있습니다.