これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS コンストラクトライブラリは、アクセスとアクセス許可を管理するために、広く実装されている一般的なイディオムをいくつか使用します。IAM モジュールは、これらのイディオムを使用するために必要なツールを提供します。
AWS CDK は を使用して変更 AWS CloudFormation をデプロイします。すべてのデプロイには、 AWS CloudFormation デプロイを開始するアクター (開発者または自動システム) が含まれます。これを行う過程で、アクターは 1 つ以上の IAM ID (ユーザーまたはロール) を引き受け、オプションでロールを渡します AWS CloudFormation。
AWS IAM Identity Center を使用してユーザーとして認証する場合、シングルサインオンプロバイダーは、事前定義された IAM ロールとして動作することを許可する有効期間の短いセッション認証情報を提供します。が IAM Identity Center 認証から AWS 認証情報 AWS CDK を取得する方法については、 SDK およびツールリファレンスガイドの「IAM Identity Center 認証を理解する」を参照してください。 AWS SDKs
プリンシパル
IAM プリンシパルは、API を呼び出すことができるユーザー、サービス、またはアプリケーションを表す認証された AWS エンティティです。 AWS APIs AWS コンストラクトライブラリでは、プリンシパルを複数の柔軟な方法で指定して、 AWS リソースへのアクセスを許可できます。
セキュリティコンテキストでは、「プリンシパル」という用語は特にユーザーなどの認証されたエンティティを指します。グループやロールなどのオブジェクトは、ユーザー (およびその他の認証されたエンティティ) を表すのではなく、アクセス許可を付与する目的で間接的に特定します。
例えば、IAM グループを作成する場合、グループ (およびそのメンバー) に Amazon RDS テーブルへの書き込みアクセスを許可できます。ただし、グループ自体は単一のエンティティを表していないため、プリンシパルではありません (また、グループにログインすることができません)。
CDK の IAM ライブラリでは、プリンシパルを直接または間接的に特定するクラスが IPrincipal
インターフェイスを実装するため、これらのオブジェクトをアクセスポリシーで互換的に使用できるようにします。ただし、セキュリティ上の意味ではすべてがプリンシパルではありません。これらのオブジェクトには次のものが含まれます。
-
サービスプリンシパル (
new iam.ServicePrincipal('service.amazonaws.com')
) -
フェデレーティッドプリンシパル (
new iam.FederatedPrincipal('cognito-identity.amazonaws.com')
) -
アカウントプリンシパル (
new iam.AccountPrincipal('0123456789012'))
) -
正規ユーザープリンシパル (
new iam.CanonicalUserPrincipal('79a59d[...]7ef2be')
) -
AWS Organizations プリンシパル (
new iam.OrganizationPrincipal('org-id')
) -
任意の ARN プリンシパル (
new iam.ArnPrincipal(res.arn)
) -
複数のプリンシパルを信頼するための
iam.CompositePrincipal(principal1, principal2, ...)
権限
Amazon S3 バケットや Amazon DynamoDB テーブルなど、アクセスできるリソースを表すすべてのコンストラクトには、別のエンティティにアクセスを許可するメソッドがあります。このようなメソッドのすべては、grant で始まる名前を持ちます。
例えば、Amazon S3 バケットにはエンティティからバケットへの読み取りおよび読み取り/書き込みアクセスをそれぞれ有効にするため、メソッド grantRead
および grantReadWrite
(Python: grant_read
および grant_read_write
) があります。エンティティは、これらの操作を実行するために必要な Amazon S3 IAM アクセス許可を正確に知る必要はありません。
付与メソッドの最初の引数は、常に IGrantable 型です。このインターフェイスは、アクセス許可を付与できるエンティティを表します。つまり、IAM オブジェクトの Role
、User
、Group
などのロールを持つリソースを表します。
他のエンティティにもアクセス許可を付与できます。例えば、このトピックの後半では、CodeBuild プロジェクトにAmazon S3 バケットへのアクセスを許可する方法を示します。一般的に、関連付けられたロールは、アクセスが許可されているエンティティの role
プロパティを介して取得されます。
lambda.Function
などの実行ロールを使用するリソースも IGrantable
を実装するため、ロールにアクセスを許可するのではなく、直接アクセスを許可できます。例えば、bucket
が Amazon S3 バケットで function
が Lambda 関数である場合、次のコードは関数にバケットへの読み取りアクセスを許可します。
bucket.grantRead(function);
スタックのデプロイ中にアクセス許可の適用が必要な場合があります。このようなケースのうち、 AWS CloudFormation カスタムリソースに他のリソースへのアクセスを許可する例があります。カスタムリソースはデプロイ時に呼び出されるため、デプロイ時に指定されたアクセス許可が必要です。
もう 1 つのケースは、サービスに渡したロールに適切なポリシーが適用されていることをサービスが検証する例です。(ポリシーの設定を忘れないようにするため、多くの AWS サービスがこれを行います) このようなケースでは、アクセス許可の適用が遅すぎる場合、デプロイが失敗する可能性があります。
別のリソースが作成される前に付与されたアクセス許可を強制的に適用するには、こちらに示すように、付与自体に依存関係を追加できます。付与メソッドの戻り値は一般的に破棄されますが、実際にはすべての付与メソッドは iam.Grant
オブジェクトを返します。
const grant = bucket.grantRead(lambda);
const custom = new CustomResource(...);
custom.node.addDependency(grant);
ロール
IAM パッケージには、IAM ロールを表す Role
コンストラクトが含まれています。次のコードは、Amazon EC2 サービスを信頼する新しいロールを作成します。
import * as iam from 'aws-cdk-lib/aws-iam';
const role = new iam.Role(this, 'Role', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'), // required
});
ロールの addToPolicy
メソッド (Python: add_to_policy
) を呼び出し、追加するルールを定義する PolicyStatement
で渡すことにより、ロールにアクセス許可を追加できます。ステートメントはロールのデフォルトポリシーに追加されます。持っていない場合、1 つ作成されます。
次の例では、承認されたサービスが AWS CodeBuildであるという条件で、bucket
および otherRole
(Python: other_role
) リソースに ec2:SomeAction
および s3:AnotherAction
アクションのロールに Deny
ポリシーステートメントを追加します。
role.addToPolicy(new iam.PolicyStatement({
effect: iam.Effect.DENY,
resources: [bucket.bucketArn, otherRole.roleArn],
actions: ['ec2:SomeAction', 's3:AnotherAction'],
conditions: {StringEquals: {
'ec2:AuthorizedService': 'codebuild.amazonaws.com',
}}}));
前の例では、addToPolicy
(Python: add_to_policy
) 呼び出しで新しい PolicyStatement
インラインを作成しました。既存のポリシーステートメントまたは変更したポリシーステートメントに渡すこともできます。PolicyStatement オブジェクトにはプリンシパル、リソース、条件、アクションを追加する多数の方法があります。
ロールが正しく機能する必要があるコンストラクトを使用している場合、次のいずれかを実行できます。
-
コンストラクトオブジェクトをインスタンス化するとき、既存のロールに渡します。
-
適切なサービスプリンシパルを信頼し、コンストラクトに新しいロールを作成させます。次の例では、CodeBuild プロジェクトというコンストラクトを使用します。
import * as codebuild from 'aws-cdk-lib/aws-codebuild';
// imagine roleOrUndefined is a function that might return a Role object
// under some conditions, and undefined under other conditions
const someRole: iam.IRole | undefined = roleOrUndefined();
const project = new codebuild.Project(this, 'Project', {
// if someRole is undefined, the Project creates a new default role,
// trusting the codebuild.amazonaws.com service principal
role: someRole,
});
オブジェクトが作成されたら、ロール (ロールを渡したが、コンストラクトによってデフォルトのものが作成されたかを問わず) がプロパティ role
として利用できます。ただし、このプロパティは外部リソースでは利用できません。したがって、これらのコンストラクトには addToRolePolicy
(Python: add_to_role_policy
) メソッドがあります。
コンストラクトが外部リソースである場合、メソッドは何も行いません。それ以外の場合は role
プロパティの addToPolicy
(Python: add_to_policy
) メソッドを呼び出します。未定義のケースを明示的に処理する手間を省けます。
次の例で示される内容
// project is imported into the CDK application
const project = codebuild.Project.fromProjectName(this, 'Project', 'ProjectName');
// project is imported, so project.role is undefined, and this call has no effect
project.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW, // ... and so on defining the policy
}));
リソースポリシー
Amazon S3 バケットや IAM ロールなど AWS、 のいくつかのリソースにもリソースポリシーがあります。これらのコンストラクトには addToResourcePolicy
メソッド (Python: add_to_resource_policy
) があり、PolicyStatement
を引数として扱います。リソースポリシーに追加されるすべてのポリシーステートメントには、少なくとも 1 つのプリンシパルを指定する必要があります。
次の例では、Amazon S3 バケットの bucket
が、s3:SomeAction
のアクセス許可を持つロールを自らに付与しています。
bucket.addToResourcePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ['s3:SomeAction'],
resources: [bucket.bucketArn],
principals: [role]
}));
外部 IAM オブジェクトの使用
AWS CDK アプリの外部で IAM ユーザー、プリンシパル、グループ、またはロールを定義している場合は、 AWS CDK アプリでその IAM オブジェクトを使用できます。これを行うには、ARN またはその名前を使用してそのリファレンスを作成します。(ユーザー、グループ、ロールの名前を使用します) その後、返されたリファレンスを使用し、前述のようにアクセス許可を付与したり、ポリシーステートメントを構築したりできます。
-
ユーザーの場合、
User.fromUserArn()
またはUser.fromUserName()
を呼び出します。User.fromUserAttributes()
も利用できますが、現在はUser.fromUserArn()
と同じ機能を使用できます。 -
プリンシパルの場合、
ArnPrincipal
オブジェクトをインスタンス化します。 -
グループの場合、
Group.fromGroupArn()
またはGroup.fromGroupName()
を呼び出します。 -
ロールの場合、
Role.fromRoleArn()
またはRole.fromRoleName()
を呼び出します。
ポリシー (マネージドポリシーを含む) は、次の方法を使用して同様に使用できます。これらのオブジェクトへのリファレンスは、IAM ポリシーが必要な場所で使用できます。
注記
外部 AWS リソースへのすべての参照と同様に、CDK アプリで外部 IAM オブジェクトを変更することはできません。