[AWS 자격증] AWS CLI, SDK, IAM Roles & Policies 정리
AWSCLISDKIAM자격증
작성자 : 오예환 | 작성일 : 2026-01-10 | 수정일 : 2026-01-10
AWS CLI, SDK, IAM Roles & Policies 정리
1. EC2 Instance Metadata (IMDS)
IMDS란?
- EC2 인스턴스가 자기 자신에 대한 정보를 조회할 수 있는 기능
- IAM Role 없이도 인스턴스 정보 조회 가능
- 개발자들에게 잘 알려지지 않았지만 매우 강력한 기능
접근 URL
http://169.254.169.254/latest/meta-data
Metadata vs Userdata
| 구분 | 설명 |
|---|
| Metadata | EC2 인스턴스에 대한 정보 |
| Userdata | EC2 인스턴스 시작 스크립트 |
조회 가능/불가능 항목
| 항목 | 조회 가능 여부 |
|---|
| IAM Role 이름 | ✅ 가능 |
| IAM Policy 내용 | ❌ 불가능 |
2. IMDSv1 vs IMDSv2
버전 비교
| 버전 | 방식 | 보안 |
|---|
| IMDSv1 | URL 직접 접근 | 기본 |
| IMDSv2 | 세션 토큰 기반 | 더 안전 |
IMDSv2 사용 방법 (2단계)
# 1단계: 세션 토큰 획득 (PUT 요청 + 헤더)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 2단계: 토큰을 사용하여 메타데이터 조회
curl http://169.254.169.254/latest/meta-data/ \
-H "X-aws-ec2-metadata-token: $TOKEN"
3. CLI에서 MFA 사용
개요
- CLI에서 MFA를 사용하려면 임시 세션 생성 필요
- STS GetSessionToken API 호출
명령어
aws sts get-session-token \
--serial-number arn-of-the-mfa-device \
--token-code code-from-token \
--duration-seconds 3600
반환값 활용
- 반환된 임시 자격 증명(AccessKeyId, SecretAccessKey, SessionToken)을 환경 변수나 프로파일에 설정
4. AWS SDK 개요
SDK란?
- 애플리케이션 코드에서 직접 AWS 서비스와 상호작용
- CLI 없이 프로그래밍 방식으로 AWS API 호출
공식 SDK 지원 언어
| 언어 | SDK 이름 |
|---|
| Python | boto3 / botocore |
| Node.js | aws-sdk |
| Java | AWS SDK for Java |
| .NET | AWS SDK for .NET |
| Go | AWS SDK for Go |
| Ruby | AWS SDK for Ruby |
| PHP | AWS SDK for PHP |
| C++ | AWS SDK for C++ |
알아두면 좋은 점
| 항목 | 설명 |
|---|
| AWS CLI 내부 | Python SDK (boto3) 사용 |
| 기본 리전 | 설정 안 하면 us-east-1 사용 |
| 사용 시점 | DynamoDB 등 AWS 서비스와 코드로 직접 통신 시 |
5. AWS Limits (Quotas)
API Rate Limits (API 호출 제한)
| 서비스 | API | 제한 |
|---|
| EC2 | DescribeInstances | 100 calls/sec |
| S3 | GetObject | 5,500 GET/sec/prefix |
에러 대응 방법
| 에러 유형 | 대응 방법 |
|---|
| 간헐적 에러 | Exponential Backoff 구현 |
| 지속적 에러 | API throttling limit 증가 요청 |
Service Quotas (서비스 한도)
| 항목 | 기본 한도 |
|---|
| On-Demand Standard 인스턴스 | 1,152 vCPU |
한도 증가 방법
- 티켓 오픈하여 요청
- Service Quotas API 사용
6. Exponential Backoff (지수 백오프)
개요
- ThrottlingException 발생 시 재시도 전략
- 재시도 간격을 지수적으로 증가시킴
동작 방식
1차 재시도: 1초 대기
2차 재시도: 2초 대기
3차 재시도: 4초 대기
4차 재시도: 8초 대기
5차 재시도: 16초 대기
...
구현 시 주의사항
| 항목 | 설명 |
|---|
| AWS SDK | 자동으로 포함되어 있음 |
| AWS API 직접 호출 | 직접 구현 필요 |
| 적용 대상 | 5xx 서버 에러, Throttling만 |
| 적용 제외 | 4xx 클라이언트 에러 (재시도 의미 없음) |
예시 코드 (Python)
import time
import random
def exponential_backoff(attempt, base_delay=1, max_delay=32):
delay = min(base_delay * (2 ** attempt), max_delay)
jitter = random.uniform(0, delay * 0.1)
return delay + jitter
for attempt in range(5):
try:
# AWS API 호출
response = call_aws_api()
break
except ThrottlingException:
wait_time = exponential_backoff(attempt)
time.sleep(wait_time)
7. AWS CLI Credentials Provider Chain
자격 증명 검색 순서 (우선순위)
| 순위 | 소스 | 설명 |
|---|
| 1 | Command line options | --region, --output, --profile |
| 2 | Environment variables | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN |
| 3 | CLI credentials file | ~/.aws/credentials |
| 4 | CLI configuration file | ~/.aws/config |
| 5 | Container credentials | ECS 태스크용 |
| 6 | Instance profile credentials | EC2 Instance Profile |
파일 위치
| OS | credentials | config |
|---|
| Linux/Mac | ~/.aws/credentials | ~/.aws/config |
| Windows | C:\Users\USER\.aws\credentials | C:\Users\USER\.aws\config |
8. AWS SDK Default Credentials Provider Chain
Java SDK 예시 - 검색 순서
| 순위 | 소스 | 설명 |
|---|
| 1 | Java system properties | aws.accessKeyId, aws.secretKey |
| 2 | Environment variables | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY |
| 3 | Default credential profiles file | ~/.aws/credentials |
| 4 | Amazon ECS container credentials | ECS 컨테이너용 |
| 5 | Instance profile credentials | EC2 인스턴스용 |
9. Credentials 시나리오 (시험 출제 포인트!)
문제 상황
EC2 인스턴스에 배포된 애플리케이션이 있음
├─ 환경 변수에 IAM User 자격 증명 설정 (S3FullAccess)
├─ EC2 Instance Profile에 IAM Role 할당 (특정 S3 버킷만 접근)
└─ 결과: 여전히 모든 S3 버킷에 접근 가능 😱
원인
- Credentials Chain 우선순위 때문!
- 환경 변수(순위 2)가 Instance Profile(순위 6)보다 먼저 검색됨
해결 방법
- 환경 변수에서 자격 증명 제거
- Instance Profile의 IAM Role만 사용하도록 함
10. AWS Credentials 모범 사례
⚠️ 절대 금지
❌ 코드에 AWS 자격 증명 하드코딩 금지!
❌ 절대로 Access Key를 소스 코드에 넣지 말 것!
✅ 권장 사항
| 환경 | 권장 방식 |
|---|
| EC2 인스턴스 | EC2 Instance Role |
| ECS 태스크 | ECS Task Role |
| Lambda 함수 | Lambda Execution Role |
| AWS 외부 | 환경 변수 / Named Profiles |
핵심 원칙
- Credentials Chain을 통해 자격 증명 상속
- AWS 내부에서는 항상 IAM Role 사용
11. AWS API 요청 서명 (Signing)
개요
- AWS HTTP API 호출 시 요청에 서명 필요
- AWS가 호출자를 식별하기 위함
- Access Key + Secret Key 사용
서명 방식
- Signature Version 4 (SigV4) 사용
SDK/CLI 사용 시
서명 전달 방법
| 방법 | 설명 | 예시 |
|---|
| HTTP Header | Authorization 헤더에 포함 | 일반 API 호출 |
| Query String | URL 파라미터로 포함 | S3 Pre-signed URL |
S3 예외
- 일부 S3 요청은 서명 없이도 가능 (퍼블릭 객체 등)
12. S3 Pre-signed URL
개요
- 서명이 Query String에 포함된 URL
- 임시로 S3 객체에 접근 권한 부여
사용 사례
- 비공개 S3 객체를 임시로 공유
- 파일 업로드 URL 제공
생성 예시
# CLI로 Pre-signed URL 생성 (1시간 유효)
aws s3 presign s3://my-bucket/my-file.txt --expires-in 3600
# Python SDK (boto3)
import boto3
s3_client = boto3.client('s3')
url = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-bucket', 'Key': 'my-file.txt'},
ExpiresIn=3600
)
핵심 요약
| 개념 | 핵심 포인트 |
|---|
| IMDS | EC2 인스턴스 자체 정보 조회, IMDSv2가 더 안전 |
| SDK | 코드에서 AWS API 호출, CLI도 boto3 사용 |
| Exponential Backoff | 5xx/Throttling만 적용, 4xx는 적용 안 함 |
| Credentials Chain | 우선순위 이해 필수, 환경 변수 > Instance Profile |
| 모범 사례 | 코드에 자격 증명 ❌, AWS 내부에선 IAM Role 사용 |
| SigV4 | API 요청 서명, SDK/CLI는 자동 처리 |