AWS CDK에서 Grant는 IAM 정책을 객체 지향 프로그래밍의 메서드 호출 방식으로 추상화한 패턴이다. 리소스가 자신에 대한 접근 권한을 다른 객체에게 부여하는 형식을 취한다.
기존의 방식이 “누가(Principal) 무엇을(Resource) 할 수 있는가”라는 정책 문서를 작성하는 방식이었다면 Grant는 리소스(Resource)가 누구(Principal)에게 권한을 허용한다는 관점을 가진다. 이는 객체자 자신의 상태와 행동을 스스로 관리하는 객체 지향의 캡슐화(Encapsulation) 원칙과 같다.
grantRead(), grantWrite()와 같은 메서드를 호출하면 CDK는 내부적으로 해당 작업에 필요한 최소한의 IAM 액션들을 자동으로 계산한다. 예를 들어 S3 버킷에서 grantRead()를 호출하면 s3:GetObject뿐만 아니라 폴더 목록을 조회하기 위한 s3:ListBucket등의 권한이 적절하게 조합되어 나온다.
직접 JSON 구조를 생각하며 코드를 작성해야 하므로 오타에 취약하고 가독성이 떨어진다.
table.addToRolePolicy(PolicyStatement.Builder.create()
.actions(List.of("dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query"))
.resources(List.of(table.getTableArn()))
.effect(Effect.ALLOW)
.build());
메서드 한 줄로 의도가 명확히 드어나며 컴파일 타임에 타입 체크가 이루어진다.
table.grantReadData(myLambda);
대부분의 L2 Construct(고수준 객체)는 다음과 같이 표준화된 Grant 메서드를 제공한다.
grantRead(grantee): 읽기 전용 권한을 부여한다.grantWrite(grantee): 쓰기 전용 권한을 부여한다.grantReadWrite(grantee): 읽기와 쓰기 권한을 모두 부여한다.grant(grantee, actions...): 표준 메서드 외에 특정 액션들만 골라서 부여할 때 사용한다.Grant 메서드는 호출 결과로 Grant 타입의 객체를 반환한다. 이 객체를 통해 권한 부여가 성공적으로 이루어졌는지 확인하거나 추가적인 조건(Condition)을 덧붙이는 작업이 가능하다.
Grant readGrant = table.grantReadData(myLambda);
*, Wildcard)을 부여하는 것을 방지한다.Grant를 통해 리소스 간의 관계를 정의하면 수백 줄의 IAM 정책 문서 관리에서 자유로워질 수 있다.