これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
を使用する際の L2 コンストラクトの AWS Identity and Access Management (IAM) ロールとポリシーを定義します AWS Cloud Development Kit (AWS CDK)。
許可メソッドを使用してアクセス許可を定義する
コンストラクトライブラリの L2 AWS コンストラクトを使用してインフラストラクチャを定義する場合、提供されたグラントメソッドを使用して、リソースに必要なアクセス許可を指定できます。 AWS CDK は、それらを必要とするすべての AWS リソースに必要な IAM ロールを自動的に作成します。
以下は、 AWS Lambda 関数と Amazon Simple Storage Service (Amazon S3) バケット間のアクセス許可を定義する例です。ここでは、バケット 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
メソッドを使用せずにアクセス許可を作成および管理する場合は、手動で作成および設定する必要があります。IAM ロールは 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 がデプロイ時の値であり、合成時には不明である (バケットがまだ作成されていない) ためです。これは、提供されたgrant
メソッドを使用して CDK に IAM ロールとアクセス許可を管理させることが推奨されるもう 1 つの理由です。初期ポリシーでロールを作成するには、管理者はより広範なアクセス許可 (arn:aws:s3:::*
など) でポリシーを作成する必要があります。