AWS CDK에서 IAM 권한을 관리하는 방식은 크게 고수준의 Grant 패턴과 저수준의 Policy 직접 추가 방식으로 나뉜다. 이를 이해하면 보안은 유지하면서도 코드 양을 줄일 수 있다.
Grant 패턴은 이 리소스가 저 사용자(혹은 서비스)에게 이러한 권한을 준다는 철학을 바탕으로 합니다.
s3:GetObject)을 몰라도 된다.// S3 버킷과 Lambda 함수가 있다고 가정
Bucket myBucket = Bucket.Builder.create(this, "MyBucket").build();
Function myLambda = Function.Builder.create(this, "MyLambda")
// 생략
.build();
// 1. 읽기 권한만 부여
myBucket.grantRead(myLambda);
// 2. 쓰기 권한만 부여
myBucket.grantWrite(myLambda);
// 3. 읽기/쓰기 권한 모두 부여
myBucket.grantReadWrite(myLambda);
이 코드로 CDK 내부적으로 s3:Get*, s3:List* 등 읽기에 필요한 모든 세부 정책을 생성하여 Lambda의 IAM Role 에 연결한다.
addToRolePolicy: 세밀하고 자유로운 권한 부여만약 CDK에서 미리 정의된 grant메서드가 없거나 매우 특정한 조건(Condition)이 포함된 정책이 필요할 때는 addToRolePolicy를 사용한다.
PolicyStatement를 추가한다.grant는 프레임워크의 ORM 메서드이고, addToRolePolicy는 Raw Query를 직접 작성하는 것과 같다.Function myLambda = Function.Builder.create(this, "MyLambda")
// 생략
.build();
// Lambda 함수에 특정 EC2 설명 권한을 수동으로 추가
myLambda.addToRolePolicy(PolicyStatement.Builder.create()
.actions(List.of("ec2:DescribeInstances", "ec2:DescribeTags"))
.resources(List.of("*")) // 특정 리소스로 한정 가능
.effect(Effect.ALLOW)
.build());
| 구분 | grantXxx() (Grant 패턴) | addToRolePolicy() |
|---|---|---|
| 추상화 수준 | 높음 (고수준) | 낮음 (저수준) |
| 보안성 | 매우 높음 (최소 권한 자동 적용) | 보통 (사용자가 직접 정의해야 함) |
| 가독성 | 매우 좋음 (의도가 명확함) | 복잡함 (JSON 구조와 유사함) |
| 사용 시점 | 표준적인 읽기/쓰기 권한이 필요할 때 | 커스텀 액션이나 복잡한 조건이 필요할 때 |
grant메서드의 인자로 들어가는 객체는 대부분 IGrantable인터페이스를 구현하고 있다.다른 AWS 계정의 사용자에게 권한을 줄 때도 grant메서드를 사용할 수 있다. 이때 CDK는 자동으로 리소스 기반 정책(Resource-based Policy, 예: S3 Bucket Policy)을 생성하여 크로스 계정 접근을 허용한다.
가장 먼저 grant 메서드가 있는지 확인하고 그것으로 해결되지 않는 특수한 케이스만 addToRolePolicy를 사용하는 것이 CDK의 표준적인 설계 방식이다.