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가 역할을 사용할 수 없음.
Permission Policy (권한 정책)
"이 역할로 무엇을 할 수 있는가?"

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
CloudWatch Logs에 Lambda 실행 로그 기록. 없으면 Lambda가 로그를 못 씀.
dynamodb:GetItem
dynamodb:PutItem
dynamodb:Query
DynamoDB 로그인 이력 테이블 읽기/쓰기. 필요한 작업만 명시 — DeleteItem, Scan 등은 포함하지 않음.
xray:PutTraceSegments
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 Logsarn: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_namegsr-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 PolicyLambda 함수 자체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 최소 권한 설계의 핵심을 이해했습니다.