CDK スタック合成の設定とカスタマイズ - AWS Cloud Development Kit (AWS CDK) v2

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

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

CDK スタック合成の設定とカスタマイズ

AWS Cloud Development Kit (AWS CDK) スタックをデプロイする前に、まずスタックを合成する必要があります。スタック合成は、CDKスタックから AWS CloudFormation テンプレートとデプロイアーティファクトを生成するプロセスです。テンプレートとアーティファクトはクラウドアセンブリ と呼ばれます。クラウドアセンブリは、 にリソースをプロビジョニングするためにデプロイされるものです AWS。デプロイの仕組みの詳細については、「」を参照してくださいAWS CDK デプロイの仕組み

CDK アプリを適切にデプロイするには、合成中に生成される CloudFormation テンプレートで、ブートストラップ中に作成されたリソースを正しく指定する必要があります。したがって、デプロイを成功させるには、ブートストラップと合成が互いに補完する必要があります。

  • ブートストラップは、 AWS CDK デプロイ用の AWS 環境を設定する 1 回限りのプロセスです。デプロイCDKに が使用する環境内の特定の AWS リソースを設定します。これらは一般的にブートストラップリソース と呼ばれます。ブートストラップの手順については、「」を参照してくださいで使用する環境をブートストラップする AWS CDK

  • CloudFormation 合成中に生成される テンプレートには、使用するブートストラップリソースに関する情報が含まれます。合成中、 は AWS 環境がどのようにブートストラップされたかを明確には認識CDKCLIしません。代わりに、 は、各CDKスタック用に設定したシンセサイザーに基づいて CloudFormation テンプレートCDKCLIを生成します。デプロイを成功させるには、シンセサイザーは使用する正しいブートストラップリソースを参照する CloudFormation テンプレートを生成する必要があります。

CDK には、連携するように設計されたデフォルトのシンセサイザーとブートストラップ設定が付属しています。一方をカスタマイズする場合は、関連するカスタマイズをもう一方のカスタマイズに適用する必要があります。

CDK スタック合成を設定する

CDK スタック合成は、Stackインスタンスの synthesizerプロパティを使用して設定します。このプロパティは、CDKスタックの合成方法を指定します。IStackSynthesizer または を実装するクラスのインスタンスを指定しますIReusableStackSynthesizer。そのメソッドは、アセットがスタックに追加されるたびに、またはスタックが合成されるたびに呼び出されます。スタック内でこのプロパティを使用する基本的な例を次に示します。

TypeScript
new MyStack(this, 'MyStack', { // stack properties synthesizer: new DefaultStackSynthesizer({ // synthesizer properties }), });
JavaScript
new MyStack(this, 'MyStack', { // stack properties synthesizer: new DefaultStackSynthesizer({ // synthesizer properties }), });
Python
MyStack(self, "MyStack", # stack properties synthesizer=DefaultStackSynthesizer( # synthesizer properties ))
Java

new MyStack(app, "MyStack", StackProps.builder() // stack properties .synthesizer(DefaultStackSynthesizer.Builder.create() // synthesizer properties .build()) .build();
C#
new MyStack(app, "MyStack", new StackProps // stack properties { Synthesizer = new DefaultStackSynthesizer(new DefaultStackSynthesizerProps { // synthesizer properties }) });
Go
func main() { app := awscdk.NewApp(nil) NewMyStack(app, "MyStack", &MyStackProps{ StackProps: awscdk.StackProps{ Synthesizer: awscdk.NewDefaultStackSynthesizer(&awscdk.DefaultStackSynthesizerProps{ // synthesizer properties }), }, }) app.Synth(nil) }

App インスタンスの defaultStackSynthesizerプロパティを使用して、CDKアプリ内のすべてのCDKスタックのシンセサイザーを設定することもできます。

TypeScript

import { App, Stack, DefaultStackSynthesizer } from 'aws-cdk-lib'; const app = new App({ // Configure for all stacks in this app defaultStackSynthesizer: new DefaultStackSynthesizer({ /* ... */ }), });
JavaScript

const { App, Stack, DefaultStackSynthesizer } = require('aws-cdk-lib'); const app = new App({ // Configure for all stacks in this app defaultStackSynthesizer: new DefaultStackSynthesizer({ /* ... */ }), });
Python

from aws_cdk import App, Stack, DefaultStackSynthesizer app = App( default_stack_synthesizer=DefaultStackSynthesizer( # Configure for all stacks in this app # ... ) )
Java

import software.amazon.awscdk.App; import software.amazon.awscdk.Stack; import software.amazon.awscdk.DefaultStackSynthesizer; public class Main { public static void main(final String[] args) { App app = new App(AppProps.builder() // Configure for all stacks in this app .defaultStackSynthesizer(DefaultStackSynthesizer.Builder.create().build()) .build() ); } }
C#

using Amazon.CDK; using Amazon.CDK.Synthesizers; namespace MyNamespace { sealed class Program { public static void Main(string[] args) { var app = new App(new AppProps { // Configure for all stacks in this app DefaultStackSynthesizer = new DefaultStackSynthesizer(new DefaultStackSynthesizerProps { // ... }) }); } } }
Go

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) func main() { defer jsii.Close() app := awscdk.NewApp(&awscdk.AppProps{ // Configure for all stacks in this app DefaultStackSynthesizer: awscdk.NewDefaultStackSynthesizer(&awscdk.DefaultStackSynthesizerProps{ // ... }), }) }

デフォルトでは、 は AWS CDK を使用しますDefaultStackSynthesizer。シンセサイザーを設定しない場合、このシンセサイザーが使用されます。

ブートストラップスタックやテンプレートに変更を加えるなど、ブートストラップを変更しない場合は、スタック合成を変更する必要はありません。シンセサイザーを提供する必要すらありません。CDK は、デフォルトの DefaultStackSynthesizer クラスを使用して、ブートストラップCDKスタックと適切にやり取りするようにスタック合成を設定します。

CDK スタックの合成

CDK スタックを合成するには、 AWS CDK コマンドラインインターフェイス (AWS CDK CLI) cdk synth コマンドを使用します。このコマンドで使用できるオプションなど、このコマンドの詳細については、「」を参照してくださいcdk synthesize

CDK アプリケーションに 1 つのスタックが含まれている場合、またはすべてのスタックを合成する場合は、CDKスタック名を引数として指定する必要はありません。デフォルトでは、 CDKCLIはCDKスタックをテンプレートに AWS CloudFormation 合成します。各スタックのjsonフォーマットされたテンプレートが cdk.out ディレクトリに保存されます。アプリケーションに 1 yaml つのスタックが含まれている場合、フォーマットされたテンプレートが に出力されますstdout。以下に例を示します。

$ cdk synth Resources: CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:H4sIAAAAAAAA/unique-identifier Metadata: aws:cdk:path: CdkAppStack/CDKMetadata/Default Condition: CDKMetadataAvailable ...

CDK アプリケーションに複数のスタックが含まれている場合は、スタックの論理 ID を指定して 1 つのスタックを合成できます。以下に例を示します。

$ cdk synth MyStackName

スタックを合成して を実行しない場合cdk deploy、 CDKCLIはデプロイ前にスタックを自動的に合成します。

CDK スタック合成をカスタマイズする

AWS CDK には、合成動作をカスタマイズするために使用できる以下の組み込みシンセサイザーが含まれています。

  • DefaultStackSynthesizer – シンセサイザーを指定しない場合、これは自動的に使用されます。CDK Pipelines コンストラクトを使用したクロスアカウントデプロイとデプロイをサポートします。ブートストラップ契約には、既知の名前の既存の Amazon S3 バケット、既知の名前の既存の Amazon ECRリポジトリ、既知の名前の 5 つの既存のIAMロールが必要です。デフォルトのブートストラップテンプレートは、これらの要件を満たしています。

  • CliCredentialsStackSynthesizer – このシンセサイザーのブートストラップ契約には、既存の Amazon S3 バケットと既存の Amazon ECRリポジトリが必要です。IAM ロールは必要ありません。デプロイを実行するために、このシンセサイザーはCDKCLIユーザーのアクセス許可に依存しているため、IAMデプロイ認証情報を制限したい組織にはお勧めします。このシンセサイザーは、クロスアカウントデプロイやCDKパイプラインをサポートしていません。

  • LegacyStackSynthesizer – このシンセサイザーは v1 CDK 合成動作をエミュレートします。ブートストラップ契約には、任意の名前の既存の Amazon S3 バケットが必要であり、アセットの場所が CloudFormation スタックパラメータとして渡されることを想定しています。このシンセサイザーを使用する場合は、 を使用してデプロイCDKCLIを実行する必要があります。

これらの組み込みシンセサイザーのいずれもユースケースに適していない場合は、 からシンセサイザーを実装IStackSynthesizerまたは表示するクラスとして独自のシンセサイザーを記述できますConstruct Hub。

DefaultStackSynthesizer のカスタマイズ

DefaultStackSynthesizer は のデフォルトのシンセサイザーです AWS CDK。CDK アプリケーションのクロスアカウントデプロイと、 の明示的なサポートがない AWS CDKが、 などの通常のデプロイをサポートする CI/CD システムからのCDKアプリケーションの CloudFormation デプロイを可能にするように設計されています AWS CodePipeline。このシンセサイザーは、ほとんどのユースケースに最適なオプションです。

DefaultStackSynthesizer ブートストラップ契約

DefaultStackSynthesizer には、次のブートストラップ契約が必要です。ブートストラップ中に作成する必要があるリソースは次のとおりです。

ブートストラップリソース 説明 デフォルトの想定リソース名 目的

Amazon S3 バケット

ステージングバケット

cdk-hnb659fds-アセット-ACCOUNT-REGION

ファイルアセットを保存します。

Amazon ECRリポジトリ

ステージングリポジトリ

cdk-hnb659fds-container-assets-ACCOUNT-REGION

Docker イメージアセットを保存および管理します。

IAM ロール

ロールをデプロイする

cdk-hnb659fds-deploy-role-ACCOUNT-REGION

CDK CLI と によって引き受けられ、他のロール CodePipeline を引き受けてデプロイを開始する AWS CloudFormation 可能性があります。

このロールの信頼ポリシーは、 AWS CDK この AWS 環境で でデプロイできるユーザーを制御します。

IAM ロール

AWS CloudFormation 実行ロール

cdk-hnb659fds-cfn-exec-role-ACCOUNT-REGION

このロールは、デプロイを実行する AWS CloudFormation ために によって使用されます。

このロールのポリシーは、CDKデプロイが実行できるオペレーションを制御します。

IAM ロール

検索ロール

cdk-hnb659fds-lookup-role-ACCOUNT-REGION

このロールは、 が環境コンテキスト検索を実行CDKCLIする必要がある場合に使用されます。

このロールの信頼ポリシーは、環境で情報を検索できるユーザーを制御します。

IAM ロール

ファイル発行ロール

cdk-hnb659fds-file-publishing-role-ACCOUNT-REGION

このロールは、Amazon S3 ステージングバケットにアセットをアップロードするために使用されます。これはデプロイロールから引き受けられます。

IAM ロール

イメージ公開ロール

cdk-hnb659fds-image-publishing-role-ACCOUNT-REGION

このロールは、Amazon ECRステージングリポジトリにDockerイメージをアップロードするために使用されます。これはデプロイロールから引き受けられます。

SSM パラメータ

ブートストラップバージョンパラメータ

/cdk-bootstrap/hnb659fds/version

ブートストラップテンプレートのバージョン。これは、要件を検証CDKCLIするためにブートストラップテンプレートと によって使用されます。

CDK スタック合成をカスタマイズする 1 つの方法は、 を変更することですDefaultStackSynthesizerStack インスタンスの synthesizerプロパティを使用して、このシンセサイザーを 1 つのCDKスタック用にカスタマイズできます。App インスタンスの defaultStackSynthesizerプロパティを使用して、CDKアプリ内のすべてのスタックDefaultStackSynthesizerの を変更することもできます。

修飾子を変更する

この修飾子は、ブートストラップ中に作成されたリソースの名前に追加されます。デフォルトでは、この値は hnb659fds です。ブートストラップ中に修飾子を変更する場合は、同じ修飾子を使用するようにCDKスタック合成をカスタマイズする必要があります。

修飾子を変更するには、 の qualifierプロパティを設定するDefaultStackSynthesizerか、CDKプロジェクトの cdk.json ファイルで修飾子をコンテキストキーとして設定します。

以下は、 の qualifierプロパティを設定する例ですDefaultStackSynthesizer

TypeScript
new MyStack(this, 'MyStack', { synthesizer: new DefaultStackSynthesizer({ qualifier: 'MYQUALIFIER', }), });
JavaScript
new MyStack(this, 'MyStack', { synthesizer: new DefaultStackSynthesizer({ qualifier: 'MYQUALIFIER', }), })
Python
MyStack(self, "MyStack", synthesizer=DefaultStackSynthesizer( qualifier="MYQUALIFIER" ))
Java
new MyStack(app, "MyStack", StackProps.builder() .synthesizer(DefaultStackSynthesizer.Builder.create() .qualifier("MYQUALIFIER") .build()) .build();
C#
new MyStack(app, "MyStack", new StackProps { Synthesizer = new DefaultStackSynthesizer(new DefaultStackSynthesizerProps { Qualifier = "MYQUALIFIER" }) });
Go
func NewMyStack(scope constructs.Construct, id string, props *MyStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) synth := awscdk.NewDefaultStackSynthesizer(&awscdk.DefaultStackSynthesizerProps{ Qualifier: jsii.String("MYQUALIFIER"), }) stack.SetSynthesizer(synth) return stack }

以下は、 で修飾子をコンテキストキーとして設定する例ですcdk.json

{ "app": "...", "context": { "@aws-cdk/core:bootstrapQualifier": "MYQUALIFIER" } }

リソース名の変更

その他のプロパティはすべて、ブートストラップテンプレート内のリソースの名前DefaultStackSynthesizerに関連しています。ブートストラップテンプレートを変更し、リソース名または命名スキームを変更した場合にのみ、これらのプロパティのいずれかを指定する必要があります。

すべてのプロパティは、特別なプレースホルダー ${Qualifier}${AWS::Partition}${AWS::AccountId}、および を受け入れます${AWS::Region}。これらのプレースホルダーは、 qualifierパラメータの値と、スタックの環境の AWS パーティション、アカウント ID、および AWS リージョン 値でそれぞれ置き換えられます。

次の例は、シンセサイザーをインスタンス化しているかのように、 で最も一般的に使用されるプロパティDefaultStackSynthesizerとデフォルト値を示しています。詳細なリストについては、「」を参照してくださいDefaultStackSynthesizerProps

TypeScript
new DefaultStackSynthesizer({ // Name of the S3 bucket for file assets fileAssetsBucketName: 'cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}', bucketPrefix: '', // Name of the ECR repository for Docker image assets imageAssetsRepositoryName: 'cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}', dockerTagPrefix: '', // ARN of the role assumed by the CLI and Pipeline to deploy here deployRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}', deployRoleExternalId: '', // ARN of the role used for file asset publishing (assumed from the CLI role) fileAssetPublishingRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-file-publishing-role-${AWS::AccountId}-${AWS::Region}', fileAssetPublishingExternalId: '', // ARN of the role used for Docker asset publishing (assumed from the CLI role) imageAssetPublishingRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-image-publishing-role-${AWS::AccountId}-${AWS::Region}', imageAssetPublishingExternalId: '', // ARN of the role passed to CloudFormation to execute the deployments cloudFormationExecutionRole: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region}', // ARN of the role used to look up context information in an environment lookupRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region}', lookupRoleExternalId: '', // Name of the SSM parameter which describes the bootstrap stack version number bootstrapStackVersionSsmParameter: '/cdk-bootstrap/${Qualifier}/version', // Add a rule to every template which verifies the required bootstrap stack version generateBootstrapVersionRule: true, })
JavaScript
new DefaultStackSynthesizer({ // Name of the S3 bucket for file assets fileAssetsBucketName: 'cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}', bucketPrefix: '', // Name of the ECR repository for Docker image assets imageAssetsRepositoryName: 'cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}', dockerTagPrefix: '', // ARN of the role assumed by the CLI and Pipeline to deploy here deployRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}', deployRoleExternalId: '', // ARN of the role used for file asset publishing (assumed from the CLI role) fileAssetPublishingRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-file-publishing-role-${AWS::AccountId}-${AWS::Region}', fileAssetPublishingExternalId: '', // ARN of the role used for Docker asset publishing (assumed from the CLI role) imageAssetPublishingRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-image-publishing-role-${AWS::AccountId}-${AWS::Region}', imageAssetPublishingExternalId: '', // ARN of the role passed to CloudFormation to execute the deployments cloudFormationExecutionRole: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region}', // ARN of the role used to look up context information in an environment lookupRoleArn: 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region}', lookupRoleExternalId: '', // Name of the SSM parameter which describes the bootstrap stack version number bootstrapStackVersionSsmParameter: '/cdk-bootstrap/${Qualifier}/version', // Add a rule to every template which verifies the required bootstrap stack version generateBootstrapVersionRule: true, })
Python
DefaultStackSynthesizer( # Name of the S3 bucket for file assets file_assets_bucket_name="cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}", bucket_prefix="", # Name of the ECR repository for Docker image assets image_assets_repository_name="cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}", docker_tag_prefix="", # ARN of the role assumed by the CLI and Pipeline to deploy here deploy_role_arn="arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}", deploy_role_external_id="", # ARN of the role used for file asset publishing (assumed from the CLI role) file_asset_publishing_role_arn="arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-file-publishing-role-${AWS::AccountId}-${AWS::Region}", file_asset_publishing_external_id="", # ARN of the role used for Docker asset publishing (assumed from the CLI role) image_asset_publishing_role_arn="arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-image-publishing-role-${AWS::AccountId}-${AWS::Region}", image_asset_publishing_external_id="", # ARN of the role passed to CloudFormation to execute the deployments cloud_formation_execution_role="arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", # ARN of the role used to look up context information in an environment lookup_role_arn="arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region}", lookup_role_external_id="", # Name of the SSM parameter which describes the bootstrap stack version number bootstrap_stack_version_ssm_parameter="/cdk-bootstrap/${Qualifier}/version", # Add a rule to every template which verifies the required bootstrap stack version generate_bootstrap_version_rule=True, )
Java
DefaultStackSynthesizer.Builder.create() // Name of the S3 bucket for file assets .fileAssetsBucketName("cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}") .bucketPrefix('') // Name of the ECR repository for Docker image assets .imageAssetsRepositoryName("cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}") .dockerTagPrefix('') // ARN of the role assumed by the CLI and Pipeline to deploy here .deployRoleArn("arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}") .deployRoleExternalId("") // ARN of the role used for file asset publishing (assumed from the CLI role) .fileAssetPublishingRoleArn("arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-file-publishing-role-${AWS::AccountId}-${AWS::Region}") .fileAssetPublishingExternalId("") // ARN of the role used for Docker asset publishing (assumed from the CLI role) .imageAssetPublishingRoleArn("arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-image-publishing-role-${AWS::AccountId}-${AWS::Region}") .imageAssetPublishingExternalId("") // ARN of the role passed to CloudFormation to execute the deployments .cloudFormationExecutionRole("arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region}") .lookupRoleArn("arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region}") .lookupRoleExternalId("") // Name of the SSM parameter which describes the bootstrap stack version number .bootstrapStackVersionSsmParameter("/cdk-bootstrap/${Qualifier}/version") // Add a rule to every template which verifies the required bootstrap stack version .generateBootstrapVersionRule(true) .build()
C#
new DefaultStackSynthesizer(new DefaultStackSynthesizerProps { // Name of the S3 bucket for file assets FileAssetsBucketName = "cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}", BucketPrefix = "", // Name of the ECR repository for Docker image assets ImageAssetsRepositoryName = "cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}", DockerTagPrefix = "", // ARN of the role assumed by the CLI and Pipeline to deploy here DeployRoleArn = "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}", DeployRoleExternalId = "", // ARN of the role used for file asset publishing (assumed from the CLI role) FileAssetPublishingRoleArn = "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-file-publishing-role-${AWS::AccountId}-${AWS::Region}", FileAssetPublishingExternalId = "", // ARN of the role used for Docker asset publishing (assumed from the CLI role) ImageAssetPublishingRoleArn = "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-image-publishing-role-${AWS::AccountId}-${AWS::Region}", ImageAssetPublishingExternalId = "", // ARN of the role passed to CloudFormation to execute the deployments CloudFormationExecutionRole = "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", LookupRoleArn = "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region}", LookupRoleExternalId = "", // Name of the SSM parameter which describes the bootstrap stack version number BootstrapStackVersionSsmParameter = "/cdk-bootstrap/${Qualifier}/version", // Add a rule to every template which verifies the required bootstrap stack version GenerateBootstrapVersionRule = true, })

CliCredentialsStackSynthesizer を使用します。

CDK デプロイ中にアクセス許可を付与するために使用されるセキュリティ認証情報を変更するには、 を使用して合成をカスタマイズできますCliCredentialsStackSynthesizer。このシンセサイザーは、Amazon S3 バケットや Amazon ECRリポジトリなどのアセットを保存するためにブートストラップ中に作成されるデフォルトの AWS リソースで動作します。ブートストラップCDK中に によって作成されたデフォルトのIAMロールを使用する代わりに、デプロイを開始するアクターのセキュリティ認証情報を使用します。したがって、アクターのセキュリティ認証情報には、すべてのデプロイアクションを実行するための有効なアクセス許可が必要です。次の図は、このシンセサイザーを使用する場合のデプロイプロセスを示しています。

デフォルトの AWS CDK デプロイプロセスのフローチャート。

を使用する場合CliCredentialsStackSynthesizer

  • デフォルトでは、 CloudFormation はアクターのアクセス許可を使用してアカウントでAPI呼び出しを実行します。したがって、現在の ID には、 CloudFormation スタック内の AWS リソースに必要な変更を加えるためのアクセス許可と、 CreateStackや などの必要な CloudFormation オペレーションを実行するためのアクセス許可が必要ですUpdateStack。デプロイ機能はアクターのアクセス許可に制限されます。

  • アセットの公開と CloudFormation デプロイは、現在の IAM ID を使用して行われます。この ID には、アセットバケットとリポジトリの読み取りと書き込みの両方に十分なアクセス許可が必要です。

  • ルックアップは現在のIAMアイデンティティを使用して実行され、ルックアップはポリシーの対象となります。

このシンセサイザーを使用する場合、任意のCDKCLIコマンドで --role-arnオプションを使用して指定することで、別の CloudFormation 実行ロールを使用できます。

CliCredentialsStackSynthesizer ブートストラップ契約

CliCredentialsStackSynthesizer には、次のブートストラップ契約が必要です。ブートストラップ中に作成する必要があるリソースは次のとおりです。

ブートストラップリソース 説明 デフォルトの想定リソース名 目的

Amazon S3 バケット

ステージングバケット

cdk-hnb659fds-アセット-ACCOUNT-REGION

ファイルアセットを保存します。

Amazon ECRリポジトリ

ステージングリポジトリ

cdk-hnb659fds-container-assets-ACCOUNT-REGION

Docker イメージアセットを保存および管理します。

hnb659fds リソース名の文字列は、修飾子 と呼ばれます。デフォルト値には特別な意味はありません。ブートストラップリソースの複数のコピーは、異なる修飾子がある限り、1 つの環境に保持できます。コピーを複数持つと、異なるアプリケーションのアセットを同じ環境に分離するのに役立ちます。

デフォルトのブートストラップテンプレートをデプロイして、 CliCredentialsStackSynthesizerのブートストラップ契約を満たすことができます。デフォルトのブートストラップテンプレートはIAMロールを作成しますが、このシンセサイザーはロールを使用しません。ブートストラップテンプレートをカスタマイズしてIAMロールを削除することもできます。

CliCredentialsStackSynthesizer の変更

ブートストラップ中に修飾子またはデフォルトのブートストラップリソース名を変更する場合は、同じ名前を使用するようにシンセサイザーを変更する必要があります。1 つのスタックまたはアプリ内のすべてのスタックのシンセサイザーを変更できます。以下に例を示します。

TypeScript
new MyStack(this, 'MyStack', { synthesizer: new CliCredentialsStackSynthesizer({ qualifier: 'MYQUALIFIER', }), });
JavaScript
new MyStack(this, 'MyStack', { synthesizer: new CliCredentialsStackSynthesizer({ qualifier: 'MYQUALIFIER', }), })
Python
MyStack(self, "MyStack", synthesizer=CliCredentialsStackSynthesizer( qualifier="MYQUALIFIER" ))
Java
new MyStack(app, "MyStack", StackProps.builder() .synthesizer(CliCredentialsStackSynthesizer.Builder.create() .qualifier("MYQUALIFIER") .build()) .build();
C#
new MyStack(app, "MyStack", new StackProps { Synthesizer = new CliCredentialsStackSynthesizer(new CliCredentialsStackSynthesizerProps { Qualifier = "MYQUALIFIER" }) });

次の例は、 で最もよく使用されるプロパティCliCredentialsStackSynthesizerとそのデフォルト値を示しています。詳細なリストについては、「」を参照してくださいCliCredentialsStackSynthesizerProps

TypeScript
new CliCredentialsStackSynthesizer({ // Value for '${Qualifier}' in the resource names qualifier: 'hnb659fds', // Name of the S3 bucket for file assets fileAssetsBucketName: 'cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}', bucketPrefix: '', // Name of the ECR repository for Docker image assets imageAssetsRepositoryName: 'cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}', dockerTagPrefix: '', })
JavaScript
new CliCredentialsStackSynthesizer({ // Value for '${Qualifier}' in the resource names qualifier: 'hnb659fds', // Name of the S3 bucket for file assets fileAssetsBucketName: 'cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}', bucketPrefix: '', // Name of the ECR repository for Docker image assets imageAssetsRepositoryName: 'cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}', dockerTagPrefix: '', })
Python
CliCredentialsStackSynthesizer( # Value for '${Qualifier}' in the resource names qualifier="hnb659fds", # Name of the S3 bucket for file assets file_assets_bucket_name="cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}", bucket_prefix="", # Name of the ECR repository for Docker image assets image_assets_repository_name="cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}", docker_tag_prefix="", )
Java
CliCredentialsStackSynthesizer.Builder.create() // Value for '${Qualifier}' in the resource names .qualifier("hnb659fds") // Name of the S3 bucket for file assets .fileAssetsBucketName("cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}") .bucketPrefix('') // Name of the ECR repository for Docker image assets .imageAssetsRepositoryName("cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}") .dockerTagPrefix('') .build()
C#
new CliCredentialsStackSynthesizer(new CliCredentialsStackSynthesizerProps { // Value for '${Qualifier}' in the resource names Qualifier = "hnb659fds", // Name of the S3 bucket for file assets FileAssetsBucketName = "cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region}", BucketPrefix = "", // Name of the ECR repository for Docker image assets ImageAssetsRepositoryName = "cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region}", DockerTagPrefix = "", })

LegacyStackSynthesizer を使用します。

LegacyStackSynthesizer v1 CDK デプロイの動作をエミュレートします。デプロイを実行するアクターのセキュリティ認証情報は、アクセス許可の確立に使用されます。ファイルアセットは、 という名前の AWS CloudFormation スタックを使用して作成する必要があるバケットにアップロードされますCDKToolkit。CDK CLI は、 という名前のアンマネージド型 Amazon ECRリポジトリを作成しaws-cdk/assets、Dockerイメージアセットを保存します。このリポジトリをクリーンアップして管理する責任はお客様にあります。を使用して合成されたスタックは、 CDK を使用してのみデプロイLegacyStackSynthesizerできますCLI。

v1 から CDK vCDK2 LegacyStackSynthesizer に移行していて、環境を再ブートストラップできない場合は、 を使用できます。新しいプロジェクトでは、 を使用しないことをお勧めしますLegacyStackSynthesizer

LegacyStackSynthesizer ブートストラップ契約

LegacyStackSynthesizer には、次のブートストラップ契約が必要です。ブートストラップ中に作成する必要があるリソースは次のとおりです。

ブートストラップリソース 説明 デフォルトの想定リソース名 目的

Amazon S3 バケット

ステージングバケット

cdk-hnb659fds-アセット-ACCOUNT-REGION

ファイルアセットを保存します。

CloudFormation 出力

バケット名の出力

スタック – CDKToolkit

出力名 – BucketName

ステージングバケットの名前を記述する CloudFormation 出力

LegacyStackSynthesizer は、固定名を持つ Amazon S3 バケットの存在を前提としません。代わりに、合成された CloudFormation テンプレートには、ファイルアセットごとに 3 つの CloudFormation パラメータが含まれます。これらのパラメータには、各ファイルアセットの Amazon S3 バケット名、Amazon S3 オブジェクトキー、アーティファクトハッシュが保存されます。

Docker イメージアセットは、 という名前の Amazon ECRリポジトリに公開されますaws-cdk/assets。この名前はアセットごとに変更できます。リポジトリが存在しない場合、リポジトリが作成されます。

CloudFormation スタックはデフォルト名 で存在する必要がありますCDKToolkit。このスタックには、 CloudFormationステージングバケットを参照BucketNameする という名前のエクスポートが必要です。

デフォルトのブートストラップテンプレートは、LegacyStackSynthesizerブートストラップ契約を満たしています。ただし、ブートストラップテンプレートのブートストラップリソースの Amazon S3 バケットのみが使用されます。ブートストラップテンプレートをカスタマイズして、Amazon ECR、IAM、および SSMブートストラップリソースを削除できます。

LegacyStackSynthesizer デプロイプロセス

このシンセサイザーを使用すると、デプロイ中に次のプロセスが実行されます。

  • は、 環境CDKToolkit内で という名前の CloudFormation スタックCDKCLIを検索します。このスタックから、 は という名前の CloudFormation 出力をCDKCLI読み取りますBucketName。で --toolkit-stack-nameオプションを使用して、別のスタック名cdk deployを指定できます。

  • デプロイを開始するアクターのセキュリティ認証情報は、デプロイのアクセス許可を確立するために使用されます。したがって、アクターには、すべてのデプロイアクションを実行するための十分なアクセス許可が必要です。これには、Amazon S3 ステージングバケットの読み取りと書き込み、Amazon ECRリポジトリの作成と書き込み、 AWS CloudFormation デプロイの開始とモニタリング、デプロイに必要なAPI呼び出しの実行が含まれます。

  • 必要に応じて、アクセス許可が有効であれば、ファイルアセットは Amazon S3 ステージングバケットに発行されます。

  • 必要に応じて、またアクセス許可が有効な場合、Dockerイメージアセットはアセットの repositoryNameプロパティによって という名前のリポジトリに発行されます。リポジトリ名を指定'aws-cdk/assets'しない場合、デフォルト値は です。

  • アクセス許可が有効な場合、 AWS CloudFormation デプロイが実行されます。Amazon S3 ステージングバケットとキーの場所は CloudFormation パラメータとして渡されます。