ブートストラッピング - AWS Cloud Development Kit (AWS CDK) v2

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

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

ブートストラッピング

ブートストラップとは、デプロイする環境を準備するプロセスです。ブートストラップは、リソースをデプロイするすべての環境に対して実行する必要がある 1 回限りのアクションです。

環境のブートストラップ

重要

ブートストラップされたリソースに保存されているデータに対して AWS 料金が発生する可能性があります。

ブートストラップは、デプロイの実行に必要なアクセス許可を付与するファイルや (IAM) ロールを保存するための Amazon Simple Storage Service AWS Identity and Access Management (Amazon S3) バケットなど、 環境内のリソースをプロビジョニングします。これらのリソースは、ブートストラップ AWS CloudFormation スタック と呼ばれる スタックにプロビジョニングされます。 通常は という名前が付けられますCDKToolkit。他の AWS CloudFormation スタックと同様に、デプロイされると環境の AWS CloudFormation コンソールに表示されます。

注記

CDK v2 は最新のブートストラップテンプレートを使用します。CDK v1 のレガシーテンプレートは v2 ではサポートされていません。

環境は独立しています。複数の環境にデプロイする場合は、各環境を個別にブートストラップする必要があります。

ブートストラップされていない環境に CDK アプリをデプロイしようとすると、環境のブートストラップを求めるエラーメッセージが表示されます。

CDK Pipelines によるブートストラップ

CDK Pipelines を使用して別のアカウントの環境にデプロイしている場合、次のようなメッセージが表示されます。

Policy contains a statement with one or more invalid principals

このエラーメッセージは、適切な IAM ロールが他の環境に存在していないことを意味します。最も可能性の高い原因は、環境がブートストラップされていないことです。環境をブートストラップして、もう一度試してください。

注記

環境がブートストラップされている場合は、環境のブートストラップスタックを削除して再作成しないでください。ブートストラップスタックを削除すると、CDK デプロイをサポートするために環境に最初にプロビジョニングされた AWS リソースが削除されます。これにより、パイプラインが動作しなくなります。代わりに、CDK CLI cdk bootstrap コマンドを再度実行して、ブートストラップスタックを新しいバージョンに更新してみてください。

ブートストラップの方法

環境をブートストラップすると、 AWS CloudFormation テンプレートが特定の環境にデプロイされます。このテンプレートは、 アカウントのリソースをプロビジョニングして、環境をデプロイする準備をします。

ブートストラップテンプレートは、ブートストラップされたリソースの一部の側面をカスタマイズするパラメータを受け入れます。詳細については、「ブートストラップのカスタマイズ」を参照してください。

次のいずれかの方法でブートストラップできます。

  • AWS CDK CLI コマンドを使用します。cdk bootstrapこれは最も簡単な方法であり、ブートストラップする環境が少数しかない場合に適しています。

  • 別のデプロイツールを使用して、 が提供するテンプレートを AWS CDK CLI AWS CloudFormation デプロイします。これにより、 AWS CloudFormation StackSets または を使用できます。 AWS Control Tower また、 AWS CloudFormation コンソールまたは も使用できます AWS CLI。デプロイ前にテンプレートに小さな変更を加えることができます。このアプローチは柔軟性が高く、大規模なデプロイに適しています。

環境を複数回ブートストラップすることはエラーではありません。ブートストラップする環境がすでにブートストラップされている場合、必要に応じてそのブートストラップスタックがアップグレードされます。そうしないと、何も起こりません。

によるブートストラップ AWS CDKCLI

cdk bootstrap コマンドを使用して、1 つ以上の AWS 環境をブートストラップします。

次の例では、2 つの環境をブートストラップします。

$ cdk bootstrap aws://ACCOUNT-NUMBER-1/REGION-1 aws://ACCOUNT-NUMBER-2/REGION-2 ...

次の例は、環境をブートストラップする複数の方法を示しています。2 番目の例に示すように、環境を指定する場合、 aws:// プレフィックスはオプションです。

$ cdk bootstrap aws://123456789012/us-east-1 $ cdk bootstrap 123456789012/us-east-1 123456789012/us-west-1

を実行するとcdk bootstrap、CDK CLIは常に CDK アプリを現在のディレクトリに合成します。少なくとも 1 つの環境を指定しない場合、CDK CLIはアプリで参照されているすべての環境をブートストラップします。

環境に依存しないスタックの場合、CDK CLIはデフォルトのソースから環境を判断しようとします。これは、環境変数、またはデフォルトの AWS CLI ソースから、 --profileオプションを使用して指定された環境です。見つかった場合、環境はブートストラップされます。

例えば、次のコマンドは、 prod AWS プロファイルを使用して現在の AWS CDK アプリを合成し、環境をブートストラップします。

$ cdk bootstrap --profile prod

AWS CloudFormation テンプレートからのブートストラップ

ブートストラップ AWS CloudFormation テンプレートを取得してデプロイすることで、環境をブートストラップできます。

ファイル でこのテンプレートのコピーを取得するにはbootstrap-template.yaml、次のコマンドを実行します。

macOS/Linux
$ cdk bootstrap --show-template > bootstrap-template.yaml
Windows

Windows PowerShell では、テンプレートのエンコードを保持するために を使用する必要があります。

powershell "cdk bootstrap --show-template | Out-File -encoding utf8 bootstrap-template.yaml"

テンプレートはリポジトリ AWS CDK GitHub でも使用できます。

CDK CLI または テンプレート用の任意のデプロイメカニズムを使用して、この AWS CloudFormation テンプレートをデプロイします。CDK CLI を使用してデプロイするには、 を実行しますcdk bootstrap --template TEMPLATE_FILENAME。以下のコマンド AWS CLI を実行して を使用してデプロイすることも、 AWS CloudFormation スタックセットを使用して 1 つ以上のアカウントに一度にデプロイすることもできます。

macOS/Linux
aws cloudformation create-stack \ --stack-name CDKToolkit \ --template-body file://path/to/bootstrap-template.yaml \ --capabilities CAPABILITY_NAMED_IAM \ --region us-west-1
Windows
aws cloudformation create-stack ^ --stack-name CDKToolkit ^ --template-body file://path/to/bootstrap-template.yaml ^ --capabilities CAPABILITY_NAMED_IAM ^ --region us-west-1

ブートストラップのカスタマイズ

環境内のリソースのブートストラップをカスタマイズする方法は 2 つあります。

  • コマンドでcdk bootstrapコマンドラインパラメータを使用します。これにより、テンプレートのいくつかの側面を変更できます。

  • デフォルトのブートストラップテンプレートを変更し、自分でデプロイします。これにより、ブートストラップリソースをより完全に制御できます。

次のコマンドラインオプションを CDK CLI とともに使用するとcdk bootstrap、ブートストラップテンプレートに一般的に使用される調整が提供されます。

  • --bootstrap-bucket-name Amazon S3 バケットの名前を上書きします。CDK アプリの変更が必要になる場合があります (「」を参照スタック合成子)。

  • --bootstrap-kms-key-id は、S3 バケットの暗号化に使用される AWS KMS キーを上書きします。

  • --cloudformation-execution-policies は、スタックのデプロイ AWS CloudFormation 中に が引き受けるデプロイロールにアタッチする必要がある マネージドポリシーの ARNs を指定します。デフォルトでは、スタックは AdministratorAccessポリシーを使用して完全な管理者アクセス許可でデプロイされます。

    ポリシー ARNs は、個々の ARNsをカンマで区切って、単一の文字列引数として渡す必要があります。例:

    --cloudformation-execution-policies "arn:aws:iam::aws:policy/AWSLambda_FullAccess,arn:aws:iam::aws:policy/AWSCodeDeployFullAccess".
    重要

    デプロイの失敗を回避するには、指定したポリシーが、ブートストラップする環境で実行するデプロイに十分であることを確認します。

  • --qualifier は、ブートストラップスタック内のすべてのリソースの名前に追加される文字列です。修飾子を使用すると、同じ環境で複数のブートストラップスタックをプロビジョニングするときに、リソース名の競合を回避できます。デフォルトは です hnb659fds (この値には意味がありません)。

    修飾子を変更するには、CDK アプリが変更された値をスタック同期子に渡す必要があります。詳細については、「スタック合成子」を参照してください。

  • --tags は、ブートストラップスタックに 1 つ以上の AWS CloudFormation タグを追加します。

  • --trust は、ブートストラップされる環境にデプロイできる AWS アカウントを一覧表示します。

    このフラグは、別の環境の CDK パイプラインがデプロイされる環境をブートストラップするときに使用します。ブートストラップを実行しているアカウントは常に信頼されています。

  • --trust-for-lookup は、ブートストラップされている環境からコンテキスト情報を検索する可能性のある AWS アカウントを一覧表示します。

    このフラグを使用して、環境にデプロイされるスタックを合成するアクセス許可をアカウントに付与します。実際には、それらのスタックを直接デプロイするアクセス許可は付与しません。

  • --termination-protection は、ブートストラップスタックの削除を防ぎます。詳細については、「 AWS CloudFormation ユーザーガイド」の「スタックが削除されないように保護する」を参照してください。

重要

最新のブートストラップテンプレートは、 によって暗示されているアクセス許可--cloudformation-execution-policies--trustリスト内の任意の AWS アカウントに効果的に付与します。デフォルトでは、これにより、ブートストラップされたアカウントの任意のリソースに対する読み取りと書き込みのアクセス許可が拡張されます。ブートストラップスタックには、使い慣れたポリシーと信頼できるアカウントを設定してください。

テンプレートのカスタマイズ

CDK が提供するよりも多くのカスタマイズが必要な場合はCLI、ニーズに合わせてブートストラップテンプレートを変更できます。まず、 --show-templateオプションを使用してテンプレートを取得します。以下に例を示します。

$ cdk bootstrap --show-template

変更はすべて、ブートストラップテンプレート契約 に従う必要があります。デフォルトテンプレートcdk bootstrapを使用して実行されているユーザーが後でカスタマイズを誤って上書きしないようにするには、BootstrapVariantテンプレートパラメータのデフォルト値を変更します。CDK CLI では、現在デプロイされているテンプレートと同じBootstrapVariantかそれ以上のバージョンを持つテンプレートでのみブートストラップスタックを上書きできます。

その後、「」の説明に従ってAWS CloudFormation テンプレートからのブートストラップ、または を使用して、変更したテンプレートをデプロイできますcdk bootstrap --template

$ cdk bootstrap --template bootstrap-template.yaml

ブートストラップテンプレートの違い

前述したように、 AWS CDK v1 はレガシーと最新という 2 つのブートストラップテンプレートをサポートしていました。CDK v2 は、最新の テンプレートのみをサポートしています。参考までに、これら 2 つのテンプレート間の大まかな違いを次に示します。

機能 レガシー (v1 のみ) 最新 (v1 および v2)
クロスアカウントデプロイ 許可されていません 許可
AWS CloudFormation アクセス許可 現在のユーザーのアクセス許可 ( AWS プロファイル、環境変数などによって決定される) を使用してデプロイします。 ブートストラップスタックのプロビジョニング時に指定されたアクセス許可を使用してデプロイします (例: --trust
バージョニング 使用可能なブートストラップスタックのバージョンは 1 つだけです。 ブートストラップスタックはバージョニングされています。将来のバージョンでは新しいリソースを追加でき、 AWS CDK アプリケーションには最低限のバージョンが必要になる場合があります。
リソース * Amazon S3 バケット Amazon S3 バケット
AWS KMS key
IAM ロール
Amazon ECR リポジトリ
バージョニング用の SSM パラメータ
リソースの命名 自動的に生成される 確定的
バケットの暗号化 デフォルトキー カスタマーマネージドキー

* 必要に応じて、ブートストラップテンプレートにリソースを追加します。

レガシーテンプレートを使用してブートストラップされた環境は、再ブートストラップによって CDK v2 の最新のテンプレートを使用するようにアップグレードする必要があります。レガシーバケットを削除する前に、環境内のすべての AWS CDK アプリケーションを少なくとも 1 回再デプロイします。

スタック合成子

デプロイ可能なスタックを正常に合成するには、 AWS CDK アプリが使用可能なブートストラップリソースについて認識している必要があります。スタックの合成機能は、スタックのテンプレートの合成方法 AWS CDK を制御する クラスです。これには、ブートストラップリソースの使用方法 (ブートストラップバケットに保存されているアセットを参照する方法など) が含まれます。

AWS CDKの組み込みスタック合成子は と呼ばれますDefaultStackSynthesizer。これには、クロスアカウントデプロイと CDK Pipelines デプロイ用の機能が含まれています。

synthesizer プロパティを使用してスタックをインスタンス化するときに、スタックの合成子をスタックに渡すことができます。

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 }) });

synthesizer プロパティを指定しない場合、 DefaultStackSynthesizer が使用されます。

合成のカスタマイズ

ブートストラップテンプレートに加えた変更によっては、合成をカスタマイズする必要がある場合もあります。は、次のように説明するプロパティを使用してカスタマイズDefaultStackSynthesizerできます。

これらのプロパティのいずれも必要なカスタマイズを提供していない場合は、 を実装するクラスとして synthesizer を記述できます IStackSynthesizer (おそらく から派生しますDefaultStackSynthesizer)。

修飾子の変更

ブートストラップスタック内のリソースを区別するために、ブートストラップリソースの名前に 修飾子が追加されます。同じ環境 (AWS アカウントとリージョン) に 2 つの異なるバージョンのブートストラップスタックをデプロイするには、スタックに異なる修飾子が必要です。

この機能は、CDK 自体の自動テスト間の名前分離を目的としています。 AWS CloudFormation 実行ロールに付与される IAM アクセス許可の範囲を非常に正確に絞り込むことができない限り、1 つのアカウントに 2 つの異なるブートストラップスタックを持つことによるアクセス許可分離のメリットはありません。したがって、通常、この値を変更する必要はありません。

修飾子を変更するには、 プロパティで シンセサイザをインスタンス化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" }) });

または、 で修飾子をコンテキストキーとして設定しますcdk.json

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

リソース名の変更

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

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

次の例は、 の最も一般的に使用されるプロパティ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}', // 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}', // 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}", # 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}") // 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}", // 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, })

ブートストラップテンプレート契約

ブートストラップスタックの要件は、使用中のスタック合成子によって異なります。独自のスタック合成子を作成すると、合成に必要なブートストラップリソースと、合成子がそれらを見つける方法を完全に制御できます。

このセクションでは、 がブートストラップテンプレートに対してDefaultStackSynthesizer持つ期待について説明します。

バージョニング

テンプレートには、よく知られている名前で SSM パラメータを作成するリソースと、テンプレートのバージョンを反映する出力が含まれている必要があります。

Resources: CdkBootstrapVersion: Type: AWS::SSM::Parameter Properties: Type: String Name: Fn::Sub: '/cdk-bootstrap/${Qualifier}/version' Value: 4 Outputs: BootstrapVersion: Value: Fn::GetAtt: [CdkBootstrapVersion, Value]

ロール

には、5 つの異なる目的で 5 つの IAM ロールDefaultStackSynthesizerが必要です。デフォルトのロールを使用していない場合は、使用するロールARNs をシンセサイザに伝える必要があります。

ロールは次のとおりです。

  • デプロイロールは、 AWS CDK ツールキットと が引き受け AWS CodePipeline 、 環境にデプロイします。環境へのデプロイが可能なユーザーAssumeRolePolicyを制御します。テンプレートでは、このロールに必要なアクセス許可を確認できます。

  • ルックアップロールは、 AWS CDK ツールキットが環境でコンテキスト検索を実行するために引き受けます。環境へのデプロイが可能なユーザーAssumeRolePolicyを制御します。このロールに必要なアクセス許可は、 テンプレートに表示されます。

  • ファイル発行ロールイメージ発行ロールは、 AWS CDK ツールキットと AWS CodeBuild プロジェクトが引き受け、アセットを環境に公開します。それぞれ S3 バケットと ECR リポジトリへの書き込みに使用されます。これらのロールには、これらのリソースへの書き込みアクセスが必要です。

  • AWS CloudFormation 実行ロールは、実際のデプロイを実行する AWS CloudFormation ために に渡されます。そのアクセス許可は、デプロイを実行するアクセス許可です。アクセス許可は、管理ポリシー ARNs。

出力

Toolkit AWS CDK では、ブートストラップスタックに次の CloudFormation 出力が存在する必要があります。

  • BucketName: ファイルアセットバケットの名前

  • BucketDomainName: ドメイン名形式のファイルアセットバケット

  • BootstrapVersion: ブートストラップスタックの現在のバージョン

テンプレート履歴

ブートストラップテンプレートはバージョニングされ、 AWS CDK それ自体を使用して時間の経過とともに進化します。独自のブートストラップテンプレートを提供する場合は、正規のデフォルトテンプレートで最新の状態を維持します。テンプレートが引き続きすべての CDK 機能で動作するようにする必要があります。

注記

以前のバージョンのブートストラップテンプレートでは、デフォルトでブートストラップされた AWS KMS key 各環境に が作成されていました。KMS キーの課金を回避するには、 を使用してこれらの環境を再ブートストラップします--no-bootstrap-customer-key。現在のデフォルトは KMS キーではないため、これらの料金を回避できます。

このセクションには、各バージョンで行われた変更のリストが含まれています。

[テンプレートのバージョン] AWS CDK バージョン 変更
1 1.40.0 バケット、キー、リポジトリ、ロールを含むテンプレートの初期バージョン。
2 1.45.0 アセット公開ロールを個別のファイル公開ロールとイメージ公開ロールに分割します。
3 1.46.0 アセットコンシューマーに復号化権限を追加できるようにFileAssetKeyArnエクスポートを追加します。
4 1.61.0 AWS KMS アクセス許可は Amazon S3 経由で暗黙的になり、 が不要になりましたFileAsetKeyArn。SSM CdkBootstrapVersion パラメータを追加して、スタック名を知っていることなくブートストラップスタックのバージョンを検証できるようにします。
5 1.87.0 デプロイロールは SSM パラメータを読み取ることができます。
6 1.108.0 デプロイロールとは別のルックアップロールを追加します。
6 1.109.0 デプロイ、ファイル公開、およびイメージ公開ロールにaws-cdk:bootstrap-roleタグをアタッチします。
7 1.110.0 デプロイロールは、ターゲットアカウントのバケットを直接読み取ることができなくなります。(ただし、このロールは事実上管理者であり、いつでもその AWS CloudFormation アクセス許可を使用してバケットを読み取り可能にすることができます)。
8 1.114.0 ルックアップロールには、ターゲット環境に対する完全な読み取り専用アクセス許可があり、 aws-cdk:bootstrap-role タグもあります。
9 2.1.0 一般的に参照される暗号化 SCP によって Amazon S3 アセットのアップロードが拒否されないように修正しました。
10 2.4.0 Amazon ECR ScanOnPush がデフォルトで有効になりました。
11 2.18.0 Lambda が Amazon ECR リポジトリからプルして、再ブートストラップ後も存続できるようにするポリシーを追加しました。
12 2.20.0 実験的な のサポートを追加しましたcdk import
13 2.25.0 ブートストラップによって作成された Amazon ECR リポジトリ内のコンテナイメージをイミュータブルにします。
14 2.34.0 デフォルトでリポジトリレベルでの Amazon ECR イメージスキャンをオフにして、イメージスキャンをサポートしていないリージョンのブートストラップを許可します。
15 2.60.0 KMS キーにタグを付けることはできません。
16 2.69.0 Security Hub の検出結果 KMS.2 に対処します。
17 2.72.0 Security Hub の検出結果 ECR.3 に対処します。
18 2.80.0 バージョン 16 に対して行われた変更は、すべてのパーティションで機能しないため、推奨されません。
19 2.106.1 バージョン 18 に加えられた変更を元に戻しました。ここでは、 AccessControl プロパティがテンプレートから削除されています。(#27964

Security Hub の検出結果

を使用している場合 AWS Security Hubは、ブートストラッププロセスによって AWS CDK 作成された一部のリソースに関する結果が表示されることがあります。Security Hub の検出結果は、正確性と安全性について再確認する必要があるリソース設定を見つけるのに役立ちます。セキュリティでこれらの特定のリソース設定を確認し AWS 、セキュリティ上の問題を構成していないことを確認しました。

[KMS.2] IAM プリンシパルは、すべての KMS キーで復号アクションを許可する IAM インラインポリシーを使用しないでください

デプロイロール (デフォルト名 cdk-hnb659fds-deploy-role-ACCOUNT-REGION) には、Amazon S3 に保存されている暗号化されたデータを読み取るためのアクセス許可があります。このポリシーは、それ自体がどのデータにも許可を付与しません。復号できるのは Amazon S3 から読み取られたデータのみであり、バケットポリシーを介してデプロイロールがそれらから読み取ることを明示的に許可するバケットからのみ、デプロイロールがキーポリシーを使用して復号することを明示的に許可するキーのみです。このステートメントは、 AWS CDK Pipelines がクロスアカウントデプロイを実行できるようにするために使用されます。

Security Hub でこれがフラグ付けされるのはなぜですか? ポリシーには、 Condition句とResource: *組み合わされた が含まれています。Security Hub は にフラグを付けます** は、アカウントがブートストラップされた時点で、 CodePipeline アーティファクトバケットの AWS CDK パイプラインによって作成された AWS KMS キーがまだ存在していないため、ARN を参照できません。さらに、Security Hub では、ポリシーステートメントの推論に Condition句は含まれません。

この検出結果を修正するにはどうすればよいですか? AWS KMS キーのリソースポリシーが不必要に許可でない限り、現在のロールポリシーでは、デプロイロールが意図した以上のデータにアクセスすることはできません。それでも検出結果を削除する場合は、次の 2 つの方法のいずれかでブートストラップスタックをカスタマイズして (上記のプロセスを使用) 削除できます。

  • クロスアカウントデプロイに AWS CDK パイプラインを使用していない場合は、デプロイロールSid: PipelineCrossAccountArtifactsBucketから を含む ステートメントを削除します。

  • クロスアカウントのデプロイに AWS CDK パイプラインを使用している場合: AWS CDK パイプラインをデプロイした後、アーティファクトバケットの AWS KMS キー ARN を検索し、Sid: PipelineCrossAccountArtifactsBucketステートメントResource: *の を実際のキー ARN に置き換えます。