Module 04
IAM 최소 권한 설계 — Lambda가 필요한 것만 허용하기
Service Role vs Resource-based Policy, gsr-* 와일드카드 전략
IAM 최소 권한 설계
Lambda에 과도한 권한을 주지 않고, 필요한 것만 허용하는 IAM 설계
IAM 두 레이어 — 역할과 신뢰 정책
"IAM은 '누가 무엇을 할 수 있는가'를 정의합니다. Lambda는 IAM 역할을 맡아서 그 역할이 허용한 일만 할 수 있습니다."
Lambda IAM에는 항상 두 가지 정책이 있습니다:
Trust Policy (신뢰 정책)
"누가 이 역할을 맡을 수 있는가?"
Lambda 서비스가 이 역할을 가정(AssumeRole)할 수 있도록 허용. 없으면 Lambda가 역할을 사용할 수 없음.
Lambda 서비스가 이 역할을 가정(AssumeRole)할 수 있도록 허용. 없으면 Lambda가 역할을 사용할 수 없음.
Permission Policy (권한 정책)
"이 역할로 무엇을 할 수 있는가?"
DynamoDB 읽기/쓰기, CloudWatch 로그 쓰기 등 실제 허용 작업 목록. 여기 없는 작업은 모두 거부.
DynamoDB 읽기/쓰기, CloudWatch 로그 쓰기 등 실제 허용 작업 목록. 여기 없는 작업은 모두 거부.
Trust Policy — Lambda 서비스를 신뢰하도록 설정
📋 Lambda 역할의 Trust Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com" // Lambda 서비스가 이 역할을 맡을 수 있음
},
"Action": "sts:AssumeRole"
}
]
}
ℹ️ 역할 생성 시 "Lambda"를 신뢰 개체(trusted entity)로 선택하면 자동으로 생성됩니다. IAM 콘솔 → 역할 만들기 → AWS 서비스 → Lambda를 선택하면 Trust Policy가 자동으로 위와 같이 설정됩니다.
필요 권한 목록 — 이것만 허용하면 됩니다
Lambda 함수가 실제로 필요한 권한은 다음 다섯 가지입니다. 이 이상은 최소 권한 원칙에 위반됩니다.
Permission Policy — 필요 권한 5가지
logs:CreateLogGroup
logs:CreateLogStream
logs:PutLogEvents
logs:CreateLogStream
logs:PutLogEvents
CloudWatch Logs에 Lambda 실행 로그 기록. 없으면 Lambda가 로그를 못 씀.
dynamodb:GetItem
dynamodb:PutItem
dynamodb:Query
dynamodb:PutItem
dynamodb:Query
DynamoDB 로그인 이력 테이블 읽기/쓰기. 필요한 작업만 명시 — DeleteItem, Scan 등은 포함하지 않음.
xray:PutTraceSegments
xray:PutTelemetryRecords
xray:PutTelemetryRecords
X-Ray 트레이싱 (선택). Zappa가 기본 활성화. 없으면 경고만 나고 동작은 함.
📋 최소 권한 정책 JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-2:*:log-group:/aws/lambda/gsr-*"
},
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:ap-northeast-2:*:table/gsr-*",
"arn:aws:dynamodb:ap-northeast-2:*:table/gsr-*/index/*"
]
},
{
"Effect": "Allow",
"Action": [
"xray:PutTraceSegments",
"xray:PutTelemetryRecords"
],
"Resource": "*"
}
]
}
gsr-* 와일드카드 전략 — 왜 ARN을 하드코딩하지 않는가
"새 프로젝트마다 역할 ARN을 바꾸면 IAM 정책도 매번 수정해야 합니다. gsr-*로 묶으면 한 번 만든 정책을 재사용할 수 있습니다."
😰 ARN 하드코딩
새 프로젝트마다 정책 수정. 테이블 이름 바뀌면 정책 업데이트 필요. 관리 부담 증가.
arn:aws:dynamodb:ap-northeast-2:123:table/my-specific-table새 프로젝트마다 정책 수정. 테이블 이름 바뀌면 정책 업데이트 필요. 관리 부담 증가.
✅ gsr-* 와일드카드
arn:aws:dynamodb:ap-northeast-2:*:table/gsr-*gsr-로 시작하는 모든 테이블 허용. 새 프로젝트는 테이블 이름만 gsr-로 시작하면 자동으로 허용.
| 리소스 | gsr-* 패턴 |
|---|---|
| DynamoDB 테이블 | arn:aws:dynamodb:ap-northeast-2:*:table/gsr-* |
| DynamoDB GSI (인덱스) | arn:aws:dynamodb:ap-northeast-2:*:table/gsr-*/index/* |
| CloudWatch Logs | arn:aws:logs:ap-northeast-2:*:log-group:/aws/lambda/gsr-* |
| Lambda 함수 | arn:aws:lambda:ap-northeast-2:*:function:gsr-* |
ℹ️ gsr- prefix는 GS Retail 리소스 네이밍 컨벤션입니다. 프로젝트의 모든 Lambda 함수, DynamoDB 테이블, CloudWatch Log Group 이름은
gsr-로 시작합니다. Zappa의 project_name을 gsr-my-project로 설정하면 자동으로 gsr-my-project로 Lambda가 생성됩니다.Resource-based Policy — API Gateway가 Lambda를 호출하는 권한
Service Role(역할)이 "Lambda가 다른 서비스에 무엇을 할 수 있는가"를 정의한다면, Resource-based Policy는 "다른 서비스가 이 Lambda를 호출할 수 있는가"를 정의합니다.
| 정책 유형 | 부착 위치 | 질문 |
|---|---|---|
| IAM 역할 (Service Role) | Lambda 실행 역할 | Lambda가 DynamoDB를 쓸 수 있는가? |
| Resource-based Policy | Lambda 함수 자체 | API Gateway가 이 Lambda를 호출할 수 있는가? |
Zappa가 zappa deploy 시 자동으로 API Gateway → Lambda 호출 권한을 추가합니다. 직접 추가해야 하는 경우는 Keep-Warm을 위한 EventBridge 권한뿐입니다.
📋 Lambda resource-based policy 확인
# Lambda 함수에 붙어있는 resource-based policy 확인
aws lambda get-policy \
--function-name my-project-api \
--profile my-aws-profile
# 직접 추가할 때 (EventBridge 또는 API GW)
aws lambda add-permission \
--function-name my-project-api \
--statement-id AllowAPIGatewayInvoke \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn "arn:aws:execute-api:ap-northeast-2:*:*/prod/*" \
--profile my-aws-profile
EventBridge Trust 설정 — Keep-Warm이 동작하려면
Keep-Warm은 EventBridge(CloudWatch Events)가 5분마다 Lambda를 호출합니다. 이것도 Lambda의 Resource-based Policy에 EventBridge 호출 권한이 있어야 합니다.
📋 EventBridge → Lambda 호출 권한 추가
aws lambda add-permission \
--function-name my-project-api \
--statement-id AllowEventBridgeKeepWarm \
--action lambda:InvokeFunction \
--principal events.amazonaws.com \
--source-arn "arn:aws:events:ap-northeast-2:123456789:rule/my-project-api-*" \
--profile my-aws-profile
⚠️ Zappa가 Keep-Warm EventBridge 규칙을 만들지만 Lambda permission은 자동으로 추가하지 않을 수 있습니다.
zappa update 후 Keep-Warm이 동작하지 않으면 위 명령으로 직접 추가하세요. aws lambda get-policy로 현재 허용된 목록을 확인할 수 있습니다.✅ 이 모듈을 마쳤습니다. Trust Policy vs Permission Policy의 구분, 필요 권한 5가지, gsr-* 와일드카드 전략, Resource-based Policy, EventBridge trust 설정까지 — IAM 최소 권한 설계의 핵심을 이해했습니다.