AWS Lambda + RDS 연동, 최소 IAM 권한으로 역할 만들기
AWS Lambda에서 RDS(MySQL)에 연결할 때 IAM 역할에 과도한 권한을 주는 경우가 많습니다.
특히 RDSFullAccess 정책을 그대로 붙이는 패턴을 자주 봅니다.
하지만 Secrets Manager를 활용한 현재 구조에서는 IAM이 DB 쿼리 권한을 전혀 판단하지 않습니다.
이번 글에서는 Lambda 역할에 필요한 최소 IAM 권한만으로 역할을 만드는 방법을 직접 구성해 보겠습니다.
Lambda는 Secrets Manager에서 DB 자격 증명을 읽어옵니다.
그 뒤 MySQL 프로토콜로 RDS Proxy나 DB 인스턴스에 직접 접속해 SQL을 실행합니다.
IAM 역할은 Secrets Manager 읽기와 VPC 접속만 담당합니다.
실제 DB 내부 권한은 별도의 DB 계정(admin 또는 user)이 결정합니다.
아래 세 가지만 있으면 충분합니다. 불필요한 FullAccess는 제거합니다.
| 정책 | 용도 | 대상 범위 |
|---|---|---|
| AWSLambdaBasicExecutionRole | CloudWatch 로그 기록 | 모든 Lambda |
| AWSLambdaVPCAccessExecutionRole | VPC ENI 생성 및 관리 | Lambda가 속한 VPC |
| AWSSecretsManagerAllowGetSecretValue | Secrets Manager에서 비밀 값 읽기 | 특정 Secret ARN만 지정 |
비교
RDSFullAccess는 RDS 인스턴스 전체를 제어할 수 있는 권한까지 포함합니다.
위 최소 권한은 읽기와 네트워크 접속만 허용하므로 보안 관점이 훨씬 안전합니다.
CloudShell에서 한 번의 명령으로 정책을 자동 생성하거나 업데이트할 수 있습니다.
아래 스크립트를 받아 실행합니다.
curl -fsSL "https://gist.githubusercontent.com/h053698/fd5f0206b608191ea3bad32b6ecbee4f/raw/1c2318ac8e82cb0745b4bd19da84aacd82faf17f/grant-secret-read-role.sh" -o grant-secret-read-role.sh
chmod +x grant-secret-read-role.sh
./grant-secret-read-role.sh
스크립트 원본
https://gist.github.com/h053698/fd5f0206b608191ea3bad32b6ecbee4f
이 스크립트는 정책 생성·업데이트만 수행합니다. Role에 붙이는 작업은 별도로 해야 합니다.
정책이 생성된 뒤 Lambda 역할에 연결합니다.
aws iam attach-role-policy \
--role-name <lambda-role-name> \
--policy-arn arn:aws:iam::<account-id>:policy/AWSSecretsManagerAllowGetSecretValue
Lambda + RDS 연동은 RDSFullAccess보다 Secret 읽기 + VPC + 로그 권한이 정석입니다.