アクセス許可 - AWS Cloud Development Kit (AWS CDK) v2

これは AWS CDK v2 デベロッパーガイドです。古い CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

アクセス許可

AWS Construct Library は、アクセスとアクセス許可を管理するために、一般的に広く実装されているいくつかのイディオムを使用します。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 Construct Library では、プリンシパルに AWS リソースへのアクセスを許可する複数の柔軟な方法でプリンシパルを指定できます。

セキュリティコンテキストでは、「プリンシパル」という用語は、特にユーザーなどの認証されたエンティティを指します。グループやロールなどのオブジェクトは、ユーザー (およびその他の認証されたエンティティ) を表すのではなく、アクセス許可を付与する目的で間接的に識別します。

例えば、IAM グループを作成する場合、グループ (およびそのメンバー) に Amazon RDS テーブルへの書き込みアクセスを許可できます。ただし、グループ自体は単一のエンティティを表していないため (グループにログインすることもできない)、プリンシパルではありません。

CDK の IAM ライブラリでは、プリンシパルを直接または間接的に識別するクラスがIPrincipalインターフェイスを実装し、これらのオブジェクトをアクセスポリシーで同じ意味で使用できるようにします。ただし、セキュリティ上の意味では、これらすべてがプリンシパルというわけではありません。これらのオブジェクトには以下が含まれます。

  1. Role、、 Userなどの IAM リソース Group

  2. サービスプリンシパル (new iam.ServicePrincipal('service.amazonaws.com')

  3. フェデレーティッドプリンシパル (new iam.FederatedPrincipal('cognito-identity.amazonaws.com')

  4. アカウントプリンシパル (new iam.AccountPrincipal('0123456789012'))

  5. 正規ユーザープリンシパル (new iam.CanonicalUserPrincipal('79a59d[...]7ef2be')

  6. AWS Organizations プリンシパル (new iam.OrganizationPrincipal('org-id')

  7. 任意の ARN プリンシパル (new iam.ArnPrincipal(res.arn)

  8. 複数のプリンシパルを信頼iam.CompositePrincipal(principal1, principal2, ...)する

権限

Amazon S3 バケットや Amazon DynamoDB テーブルなど、アクセスできるリソースを表すすべてのコンストラクトには、別のエンティティへのアクセスを許可するメソッドがあります。このようなメソッドには、すべて grant で始まる名前が付いています。

例えば、Amazon S3 バケットには、エンティティからバケットへの読み取りおよび読み取り/書き込みアクセスをそれぞれ有効にするメソッド grantReadgrantReadWrite (Python: grant_readgrant_read_write) があります。エンティティは、これらのオペレーションを実行するために必要な Amazon S3 IAM アクセス許可を正確に把握する必要はありません。

グラントメソッドの最初の引数は、常にタイプ IGrantable です。このインターフェイスは、アクセス許可を付与できるエンティティを表します。つまり、IAM オブジェクト 、RoleUserなどのロールを持つリソースを表しますGroup

他のエンティティにもアクセス許可を付与できます。例えば、このトピックの後半で、Amazon S3 バケットへのアクセス権をプロジェクトに付与 CodeBuildする方法を示します。通常、関連付けられたロールは、アクセス権が付与されているエンティティの roleプロパティを介して取得されます。

などの実行ロールを使用するリソースlambda.Functionも を実装IGrantableするため、ロールへのアクセス権を付与する代わりに、直接アクセス権を付与できます。例えば、 bucketが Amazon S3 バケットで、 functionが Lambda 関数の場合、次のコードは関数にバケットへの読み取りアクセスを許可します。

TypeScript
bucket.grantRead(function);
JavaScript
bucket.grantRead(function);
Python
bucket.grant_read(function)
Java
bucket.grantRead(function);
C#
bucket.GrantRead(function);

スタックのデプロイ中にアクセス許可を適用する必要がある場合があります。このようなケースの 1 つは、 AWS CloudFormation カスタムリソースに他のリソースへのアクセスを許可する場合です。カスタムリソースはデプロイ時に呼び出されるため、デプロイ時に指定されたアクセス許可が必要です。

もう 1 つのケースは、サービスが渡すロールに適切なポリシーが適用されていることを確認する場合です。(ポリシーの設定を忘れないようにするために、多くの AWS のサービスでこれを行っています)。このような場合、アクセス許可の適用が遅すぎると、デプロイが失敗する可能性があります。

別のリソースが作成される前にグラントのアクセス許可を強制的に適用するには、次に示すように、グラント自体に依存関係を追加できます。グラントメソッドの戻り値は一般的に破棄されますが、実際にはすべてのグラントメソッドが iam.Grant オブジェクトを返します。

TypeScript
const grant = bucket.grantRead(lambda); const custom = new CustomResource(...); custom.node.addDependency(grant);
JavaScript
const grant = bucket.grantRead(lambda); const custom = new CustomResource(...); custom.node.addDependency(grant);
Python
grant = bucket.grant_read(function) custom = CustomResource(...) custom.node.add_dependency(grant)
Java
Grant grant = bucket.grantRead(function); CustomResource custom = new CustomResource(...); custom.node.addDependency(grant);
C#
var grant = bucket.GrantRead(function); var custom = new CustomResource(...); custom.node.AddDependency(grant);

ロール

IAM パッケージには、IAM ロールを表すRoleコンストラクトが含まれています。次のコードは、Amazon EC2 サービスを信頼する新しいロールを作成します。

TypeScript
import * as iam from 'aws-cdk-lib/aws-iam'; const role = new iam.Role(this, 'Role', { assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'), // required });
JavaScript
const iam = require('aws-cdk-lib/aws-iam'); const role = new iam.Role(this, 'Role', { assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com') // required });
Python
import aws_cdk.aws_iam as iam role = iam.Role(self, "Role", assumed_by=iam.ServicePrincipal("ec2.amazonaws.com")) # required
Java
import software.amazon.awscdk.services.iam.Role; import software.amazon.awscdk.services.iam.ServicePrincipal; Role role = Role.Builder.create(this, "Role") .assumedBy(new ServicePrincipal("ec2.amazonaws.com")).build();
C#
using Amazon.CDK.AWS.IAM; var role = new Role(this, "Role", new RoleProps { AssumedBy = new ServicePrincipal("ec2.amazonaws.com"), // required });

ロールの addToPolicyメソッド (Python: add_to_policy) を呼び出し、追加するルールPolicyStatementを定義する を渡すことで、ロールにアクセス許可を追加できます。ステートメントがロールのデフォルトポリシーに追加されます。ポリシーがない場合は、作成されます。

次の例では、承認されたサービスが であるという条件で、 リソース ec2:SomeAction および otherRole (Python: other_role) s3:AnotherActionに対するアクション bucket および のロールにDenyポリシーステートメントを追加します AWS CodeBuild。

TypeScript
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', }}}));
JavaScript
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' }}}));
Python
role.add_to_policy(iam.PolicyStatement( effect=iam.Effect.DENY, resources=[bucket.bucket_arn, other_role.role_arn], actions=["ec2:SomeAction", "s3:AnotherAction"], conditions={"StringEquals": { "ec2:AuthorizedService": "codebuild.amazonaws.com"}} ))
Java
role.addToPolicy(PolicyStatement.Builder.create() .effect(Effect.DENY) .resources(Arrays.asList(bucket.getBucketArn(), otherRole.getRoleArn())) .actions(Arrays.asList("ec2:SomeAction", "s3:AnotherAction")) .conditions(java.util.Map.of( // Map.of requires Java 9 or later "StringEquals", java.util.Map.of( "ec2:AuthorizedService", "codebuild.amazonaws.com"))) .build());
C#
role.AddToPolicy(new PolicyStatement(new PolicyStatementProps { Effect = Effect.DENY, Resources = new string[] { bucket.BucketArn, otherRole.RoleArn }, Actions = new string[] { "ec2:SomeAction", "s3:AnotherAction" }, Conditions = new Dictionary<string, object> { ["StringEquals"] = new Dictionary<string, string> { ["ec2:AuthorizedService"] = "codebuild.amazonaws.com" } } }));

前の例では、 addToPolicy (Python: add_to_policy) 呼び出しを使用して新しいPolicyStatementインラインを作成しました。既存のポリシーステートメントまたは変更したポリシーステートメントを渡すこともできます。PolicyStatement オブジェクトには、プリンシパル、リソース、条件、およびアクションを追加するための多数のメソッドがあります。

ロールが正しく機能する必要があるコンストラクトを使用している場合は、次のいずれかを実行できます。

  • コンストラクトオブジェクトをインスタンス化するときに、既存のロールを渡します。

  • 適切なサービスプリンシパルを信頼して、コンストラクトに新しいロールを作成させます。次の例では、このようなコンストラクトを使用します: CodeBuild プロジェクト。

TypeScript
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, });
JavaScript
const codebuild = require('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 = 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 });
Python
import aws_cdk.aws_codebuild as codebuild # imagine role_or_none is a function that might return a Role object # under some conditions, and None under other conditions some_role = role_or_none(); project = codebuild.Project(self, "Project", # if role is None, the Project creates a new default role, # trusting the codebuild.amazonaws.com service principal role=some_role)
Java
import software.amazon.awscdk.services.iam.Role; import software.amazon.awscdk.services.codebuild.Project; // imagine roleOrNull is a function that might return a Role object // under some conditions, and null under other conditions Role someRole = roleOrNull(); // if someRole is null, the Project creates a new default role, // trusting the codebuild.amazonaws.com service principal Project project = Project.Builder.create(this, "Project") .role(someRole).build();
C#
using Amazon.CDK.AWS.CodeBuild; // imagine roleOrNull is a function that might return a Role object // under some conditions, and null under other conditions var someRole = roleOrNull(); // if someRole is null, the Project creates a new default role, // trusting the codebuild.amazonaws.com service principal var project = new Project(this, "Project", new ProjectProps { Role = someRole });

オブジェクトが作成されると、ロール (ロールが渡されたか、コンストラクトによって作成されたデフォルトのロールかにかかわらず) はプロパティ として使用できますrole。ただし、このプロパティは外部リソースでは使用できません。したがって、これらのコンストラクトには addToRolePolicy (Python: add_to_role_policy) メソッドがあります。

コンストラクトが外部リソースである場合、 メソッドは何もせず、それ以外の場合は roleプロパティの addToPolicy (Python: add_to_policy) メソッドを呼び出します。これにより、未定義のケースを明示的に処理する手間が省けます。

次の例は、以下を示しています。

TypeScript
// 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 }));
JavaScript
// 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 }));
Python
# project is imported into the CDK application project = codebuild.Project.from_project_name(self, 'Project', 'ProjectName') # project is imported, so project.role is undefined, and this call has no effect project.add_to_role_policy(iam.PolicyStatement( effect=iam.Effect.ALLOW, # ... and so on defining the policy )
Java
// project is imported into the CDK application Project project = Project.fromProjectName(this, "Project", "ProjectName"); // project is imported, so project.getRole() is null, and this call has no effect project.addToRolePolicy(PolicyStatement.Builder.create() .effect(Effect.ALLOW) // .. and so on defining the policy .build();
C#
// project is imported into the CDK application var project = Project.FromProjectName(this, "Project", "ProjectName"); // project is imported, so project.role is null, and this call has no effect project.AddToRolePolicy(new PolicyStatement(new PolicyStatementProps { Effect = 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許可を持つロールを付与します。

TypeScript
bucket.addToResourcePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['s3:SomeAction'], resources: [bucket.bucketArn], principals: [role] }));
JavaScript
bucket.addToResourcePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['s3:SomeAction'], resources: [bucket.bucketArn], principals: [role] }));
Python
bucket.add_to_resource_policy(iam.PolicyStatement( effect=iam.Effect.ALLOW, actions=["s3:SomeAction"], resources=[bucket.bucket_arn], principals=role))
Java
bucket.addToResourcePolicy(PolicyStatement.Builder.create() .effect(Effect.ALLOW) .actions(Arrays.asList("s3:SomeAction")) .resources(Arrays.asList(bucket.getBucketArn())) .principals(Arrays.asList(role)) .build());
C#
bucket.AddToResourcePolicy(new PolicyStatement(new PolicyStatementProps { Effect = Effect.ALLOW, Actions = new string[] { "s3:SomeAction" }, Resources = new string[] { bucket.BucketArn }, Principals = new IPrincipal[] { role } }));

外部 IAM オブジェクトの使用

AWS CDK アプリ外で IAM ユーザー、プリンシパル、グループ、またはロールを定義している場合は、 AWS CDK アプリでその IAM オブジェクトを使用できます。そのためには、ARN またはその名前を使用して参照を作成します。(ユーザー、グループ、ロールの名前を使用します)。その後、返されたリファレンスを使用して、前述のようにアクセス許可を付与したり、ポリシーステートメントを作成したりできます。

ポリシー ( マネージドポリシーを含む) は、次の方法を使用して同様の方法で使用できます。これらのオブジェクトへの参照は、IAM ポリシーが必要な任意の場所で使用できます。

注記

外部 AWS リソースへのすべての参照と同様に、CDK アプリで外部 IAM オブジェクトを変更することはできません。