$ yh.log
[AWS 자격증] AWS CLI, SDK, IAM Roles & Policies 정리

[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

구분설명
MetadataEC2 인스턴스에 대한 정보
UserdataEC2 인스턴스 시작 스크립트

조회 가능/불가능 항목

항목조회 가능 여부
IAM Role 이름✅ 가능
IAM Policy 내용❌ 불가능

2. IMDSv1 vs IMDSv2

버전 비교

버전방식보안
IMDSv1URL 직접 접근기본
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 이름
Pythonboto3 / botocore
Node.jsaws-sdk
JavaAWS SDK for Java
.NETAWS SDK for .NET
GoAWS SDK for Go
RubyAWS SDK for Ruby
PHPAWS 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제한
EC2DescribeInstances100 calls/sec
S3GetObject5,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

자격 증명 검색 순서 (우선순위)

순위소스설명
1Command line options--region, --output, --profile
2Environment variablesAWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
3CLI credentials file~/.aws/credentials
4CLI configuration file~/.aws/config
5Container credentialsECS 태스크용
6Instance profile credentialsEC2 Instance Profile

파일 위치

OScredentialsconfig
Linux/Mac~/.aws/credentials~/.aws/config
WindowsC:\Users\USER\.aws\credentialsC:\Users\USER\.aws\config

8. AWS SDK Default Credentials Provider Chain

Java SDK 예시 - 검색 순서

순위소스설명
1Java system propertiesaws.accessKeyId, aws.secretKey
2Environment variablesAWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
3Default credential profiles file~/.aws/credentials
4Amazon ECS container credentialsECS 컨테이너용
5Instance profile credentialsEC2 인스턴스용

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 HeaderAuthorization 헤더에 포함일반 API 호출
Query StringURL 파라미터로 포함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
)

핵심 요약

개념핵심 포인트
IMDSEC2 인스턴스 자체 정보 조회, IMDSv2가 더 안전
SDK코드에서 AWS API 호출, CLI도 boto3 사용
Exponential Backoff5xx/Throttling만 적용, 4xx는 적용 안 함
Credentials Chain우선순위 이해 필수, 환경 변수 > Instance Profile
모범 사례코드에 자격 증명 ❌, AWS 내부에선 IAM Role 사용
SigV4API 요청 서명, SDK/CLI는 자동 처리