v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
를 사용할 때 L2 구문에 대한 AWS Identity and Access Management (IAM) 역할 및 정책을 정의합니다 AWS Cloud Development Kit (AWS CDK).
grant 메서드를 사용하여 권한 정의
AWS Construct Library의 L2 구문을 사용하여 인프라를 정의할 때 제공된 권한 부여 방법을 사용하여 리소스에 필요한 권한을 지정할 수 있습니다. AWS CDK 는 필요한 모든 AWS 리소스에 필요한 IAM 역할을 자동으로 생성합니다.
다음은 AWS Lambda 함수와 Amazon Simple Storage Service(Amazon S3) 버킷 간의 권한을 정의하는 예제입니다. 여기에서는 Bucket L2 구문의 grantRead
메서드를 사용하여 이러한 권한을 정의합니다.
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as kms from 'aws-cdk-lib/aws-kms';
export class CdkDemoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const key = new kms.Key(this, 'BucketKey');
const bucket = new s3.Bucket(this, 'Bucket', {
encryptionKey: key,
});
const handler = new lambda.Function(this, 'Handler', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
// Define permissions between function and S3 bucket using grantRead method
bucket.grantRead(handler);
}
}
L2 구문의 권한 부여 메서드를 사용하여 리소스 간에 권한을 정의하면 AWS CDK 는 지정한 메서드에 따라 최소 권한 정책이 있는 역할을 생성합니다. 보안 모범 사례로 필요한 권한만 적용하는 방법을 사용하는 것이 좋습니다. 예를 들어 Lambda 함수가 Amazon S3 버킷에서 읽을 수 있는 권한만 부여하면 되는 경우 grantReadWrite
대신 grantRead
메서드를 사용합니다.
사용하는 각 메서드에 대해 CDK는 지정된 리소스에 대한 고유한 IAM 역할을 생성합니다. 필요한 경우 역할에 연결할 정책을 직접 수정할 수도 있습니다. 다음은 예제입니다.
import { aws_iam as iam } from 'aws-cdk-lib';
handler.addToRolePolicy(new iam.PolicyStatement({
actions: ['s3:GetObject', 's3:List*'],
resources: [
bucket.bucketArn,
bucket.arnForObjects('*'),
]
}));
그러나 사용 가능한 경우 grant
메서드를 사용하는 것이 좋습니다.
IAM 역할 수동 생성 및 사용
CDK grant
메서드를 사용하여 권한을 생성하고 관리하지 않으려면 수동으로 권한을 생성하고 구성해야 합니다. AWS Management Console AWS CLI또는 AWS SDKs. 그런 다음 CDK 애플리케이션에 수동으로 전달하거나 역할 사용자 지정 기능을 사용할 수 있습니다.
모든 역할을 수동으로 참조 및 관리
역할이 필요한 구문에는 역할 객체를 전달하는 데 사용할 수 있는 선택적 role
속성이 있습니다.
역할을 수동으로 참조하려면
-
Role.fromRoleName()
를 사용하여 기존 역할을 참조합니다. 다음은 예제입니다.const existingRole = Role.fromRoleName(stack, 'Role', 'my-pre-existing-role', { mutable: false // Prevent CDK from attempting to add policies to this role }
-
리소스를 정의할 때 기존 역할을 전달합니다. 다음은 예제입니다.
const handler = new lambda.Function(stack, 'Handler', { runtime: lambda.Runtime.NODEJS_20_XZ, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')), // Pass in pre-existing role role: existingRole, });
역할 사용자 지정 기능 사용
AWS CDK 역할 사용자 지정 기능은 CDK 앱에서 역할 및 정책에 대한 보고서를 생성합니다. 이 기능을 사용하여 보고서를 생성할 수 있습니다. 그런 다음 미리 생성된 역할을 대체할 수 있습니다.
역할 사용자 지정 기능을 사용하려면
-
CDK 애플리케이션 상단에
Role.customizeRoles()
어딘가를 추가합니다. 다음은 예제입니다.const stack = new Stack(app, 'LambdaStack'); // Add this to use the role customization feature iam.Role.customizeRoles(stack); // Define your resources using L2 constructs const key = new kms.Key(stack, 'BucketKey'); const bucket = new s3.Bucket(stack, 'Bucket', { encryptionKey: key, }); const handler = new lambda.Function(stack, 'Handler', { runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')), }); // The grantRead() is still important. Even though it actually doesn't mutate // any policies, it indicates the need for them. bucket.grantRead(handler);
-
애플리케이션을 합성할 때 CDK는 오류를 발생시켜 미리 생성된 역할 이름을
Role.customizeRoles()
에 제공해야 함을 나타냅니다. 다음은 생성된 보고서의 예입니다.<missing role> (LambdaStack/Handler/ServiceRole) AssumeRole Policy: [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" } } ] Managed Policy ARNs: [ "arn:(PARTITION):iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" ] Managed Policies Statements: NONE Identity Policy Statements: [ { "Action": [ "s3:GetObject*", "s3:GetBucket*", "s3:List*" ], "Effect": "Allow", "Resource": [ "(LambdaStack/Bucket/Resource.Arn)", "(LambdaStack/Bucket/Resource.Arn)/*" ] } ]
-
역할이 생성되면 해당 역할이 적용되는 리소스의 애플리케이션에 전달할 수 있습니다. 예를 들어
LambdaStack/Handler/ServiceRole
에 대해 생성된 역할의 이름이lambda-service-role
인 경우 다음과 같이 CDK 앱을 업데이트합니다.const stack = new Stack(app, 'LambdaStack'); // Add this to pass in the role iam.Role.customizeRoles(stack, { usePrecreatedRoles: { 'LambdaStack/Handler/ServiceRole': 'lambda-service-role', }, });
이제 CDK는 CDK 애플리케이션에서 역할이 참조되는 모든 곳에서 미리 생성된 역할 이름을 사용합니다. 또한 향후 정책 변경 사항을 참조할 수 있도록 보고서를 계속 생성합니다.
보고서의 Amazon S3 버킷 ARN에 대한 참조는 버킷의 실제 ARN 대신 (
LambdaStack/Bucket/Resource.Arn
)으로 렌더링됩니다. 이는 버킷 ARN이 합성 시 알려지지 않은 배포 시간 값(버킷이 아직 생성되지 않음)이기 때문입니다. 이는 CDK가 제공된grant
메서드를 사용하여 IAM 역할 및 권한을 관리하도록 허용하는 또 다른 예입니다. 초기 정책으로 역할을 생성하려면 관리자가 더 넓은 권한(예:arn:aws:s3:::*
)으로 정책을 생성해야 합니다.