で使用する環境をブートストラップする AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

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

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

で使用する環境をブートストラップする AWS CDK

AWS 環境をブートストラップして、 AWS Cloud Development Kit (AWS CDK) スタックデプロイの準備をします。

  • 環境の概要については、「」を参照してください環境

  • ブートストラップの概要については、「」を参照してくださいブートストラッピング

環境をブートストラップする方法

AWS CDK コマンドラインインターフェイス (AWS CDK CLI) または任意の AWS CloudFormation デプロイツールを使用して、環境をブートストラップできます。

CDK を使用するCLI

CDK CLI cdk bootstrap コマンドを使用して環境をブートストラップできます。これは、ブートストラップに大幅な変更が必要ない場合は推奨される方法です。

任意の作業ディレクトリからのブートストラップ

作業ディレクトリからブートストラップするには、ブートストラップする環境をコマンドライン引数として指定します。以下に例を示します。

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

引数を指定する場合、aws://プレフィックスはオプションです。以下は有効です。

$ cdk bootstrap 123456789012/us-east-1

複数の環境を同時にブートストラップするには、複数の引数を指定します。

$ cdk bootstrap aws://123456789012/us-east-1 aws://123456789012/us-east-2
CDK プロジェクトの親ディレクトリからのブートストラップ

cdk.json ファイルを含む CDK プロジェクトの親ディレクトリcdk bootstrapから を実行できます。引数として環境を指定しない場合、CDK CLIは configおよび credentials ファイルなどのデフォルトのソースから環境情報、または CDK スタックに指定された環境情報を取得します。

CDK プロジェクトの親ディレクトリからブートストラップする場合、コマンドライン引数から提供される環境が他のソースよりも優先されます。

config および credentials ファイルで指定されている環境をブートストラップするには、 --profileオプションを使用します。

$ cdk bootstrap --profile prod

cdk bootstrap コマンドとサポートされているオプションの詳細については、「」を参照してくださいcdk bootstrap

任意の AWS CloudFormation ツールを使用する

ブートストラップテンプレートは、aws-cdk GitHubリポジトリからコピーすることも、 cdk bootstrap --show-template コマンドを使用してテンプレートを取得することもできます。次に、任意の AWS CloudFormation ツールを使用してテンプレートを環境にデプロイします。

この方法では、 AWS CloudFormation StackSets または を使用できます AWS Control Tower。 AWS CloudFormation コンソールまたは AWS Command Line Interface () を使用することもできますAWS CLI。テンプレートは、デプロイする前に変更できます。この方法は、より柔軟で大規模なデプロイに適しています。

--show-template オプションを使用してブートストラップテンプレートを取得してローカルマシンに保存する例を次に示します。

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

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

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

CDK を使用してこのテンプレートをデプロイするにはCLI、以下を実行します。

$ cdk bootstrap --template bootstrap-template.yaml

を使用してテンプレート AWS CLI をデプロイする例を次に示します。

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

を使用して複数の環境 CloudFormation StackSets をブートストラップする方法については、AWS クラウドオペレーションと移行ブログのAWS CDK 「 AWS アカウント を使用するための複数のブートストラップ CloudFormation StackSets」を参照してください。

環境をブートストラップするタイミング

環境にデプロイする前に、各環境をブートストラップする必要があります。ブートストラップされていない環境に CDK スタックをデプロイしようとすると、次のようなエラーが表示されます。

$ cdk deploy ✨ Synthesis time: 2.02s ❌ Deployment failed: Error: BootstrapExampleStack: SSM parameter /cdk-bootstrap/hnb659fds/version not found. Has the environment been bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)

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

ブートストラップスタックを更新する

CDK チームは定期的にブートストラップテンプレートを新しいバージョンに更新します。この場合、ブートストラップスタックを更新することをお勧めします。ブートストラッププロセスをカスタマイズしていない場合は、最初に環境をブートストラップするために実行したのと同じ手順に従って、ブートストラップスタックを更新できます。詳細については、「ブートストラップテンプレートのバージョン履歴」を参照してください。

ブートストラップをカスタマイズする

デフォルトのブートストラップテンプレートがニーズに合わない場合は、次の方法で環境へのリソースのブートストラップをカスタマイズできます。

  • cdk bootstrap コマンドでコマンドラインオプションを使用する – この方法は、コマンドラインオプションでサポートされる小さな特定の変更を行うのに最適です。

  • デフォルトのブートストラップテンプレートを変更してデプロイする – この方法は、複雑な変更を行う場合や、ブートストラップ中にプロビジョニングされたリソースの設定を完全に制御したい場合に最適です。

ブートストラップのカスタマイズの詳細については、「」を参照してくださいAWS CDK ブートストラップをカスタマイズする

CDK パイプラインによるブートストラップ

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

Policy contains a statement with one or more invalid principals

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

ブートストラップスタックの削除からの保護

ブートストラップスタックが削除されると、CDK デプロイをサポートするために環境に最初にプロビジョニングされた AWS リソースも削除されます。これにより、パイプラインは動作しなくなります。この場合、復旧のための一般的な解決策はありません。

環境がブートストラップされたら、環境のブートストラップスタックを削除して再作成しないでください。代わりに、 cdk bootstrap コマンドを再度実行して、ブートストラップスタックを新しいバージョンに更新してみてください。

ブートストラップスタックが誤って削除されないように、終了保護を有効にするには、 cdk bootstrap コマンドで --termination-protectionオプションを指定することをお勧めします。新規または既存のブートストラップスタックで終了保護を有効にできます。終了保護を有効にする手順については、「ブートストラップスタック の終了保護を有効にする」を参照してください。

ブートストラップテンプレートのバージョン履歴

ブートストラップテンプレートはバージョニングされ、それ 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 Amazon S3 アセットのアップロードが、一般的に参照される暗号化 SCP によって拒否されないように修正しました。
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 AccessControl プロパティがテンプレートから削除されたバージョン 18 に加えられた変更を元に戻しました。(#27964
20 2.119.0 AWS CloudFormation デプロイ IAM ロールに ssm:GetParametersアクションを追加します。詳細については、「#28336」を参照してください。

レガシーから最新のブートストラップテンプレートへのアップグレード

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

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

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

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

Security Hub の検出結果に対処する

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

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

デプロイロール (DeploymentActionRole) は、暗号化されたデータを読み取るアクセス許可を付与します。これは、CDK Pipelines によるクロスアカウントデプロイに必要です。このロールのポリシーは、すべてのデータにアクセス許可を付与するわけではありません。Amazon S3 および から暗号化されたデータを読み取るアクセス許可を付与するのは AWS KMS、それらのリソースがバケットまたはキーポリシーを通じて許可する場合のみです。

以下は、ブートストラップテンプレートからのデプロイロール内のこれら 2 つのステートメントのスニペットです。

DeploymentActionRole: Type: AWS::IAM::Role Properties: ... Policies: - PolicyDocument: Statement: ... - Sid: PipelineCrossAccountArtifactsBucket Effect: Allow Action: - s3:GetObject* - s3:GetBucket* - s3:List* - s3:Abort* - s3:DeleteObject* - s3:PutObject* Resource: "*" Condition: StringNotEquals: s3:ResourceAccount: Ref: AWS::AccountId - Sid: PipelineCrossAccountArtifactsKey Effect: Allow Action: - kms:Decrypt - kms:DescribeKey - kms:Encrypt - kms:ReEncrypt* - kms:GenerateDataKey* Resource: "*" Condition: StringEquals: kms:ViaService: Fn::Sub: s3.${AWS::Region}.amazonaws.com ...

Security Hub がこれにフラグを付けるのはなぜですか?

ポリシーには、 Condition句とResource: *組み合わせた が含まれます。Security Hub はワイルドカードにフラグ*を付けます。このワイルドカードは、アカウントがブートストラップされた時点で、アー CodePipeline ティファクトバケットの CDK Pipelines によって作成された AWS KMS キーがまだ存在しないため、ARN によってブートストラップテンプレートで参照できないために使用されます。さらに、Security Hub は、このフラグを立てるときに Condition句を考慮しません。これは、 AWS KMS キー AWS アカウント と同じ からのResource: *リクエストConditionに制限されます。これらのリクエストは、 AWS KMS キー AWS リージョン と同じ の Amazon S3 から送信する必要があります。

この検出結果を修正する必要がありますか?

ブートストラップテンプレートの AWS KMS キーを過度に許容するように変更していない限り、デプロイロールは必要以上のアクセスを許可しません。したがって、この検出結果を修正する必要はありません。

この検出結果を修正するにはどうすればよいですか?

この検出結果の修正方法は、クロスアカウントデプロイに CDK Pipelines を使用するかどうかによって異なります。

Security Hub の検出結果を修正し、クロスアカウントデプロイに CDK Pipelines を使用するには
  1. まだデプロイしていない場合は、 cdk bootstrap コマンドを使用して CDK ブートストラップスタックをデプロイします。

  2. まだ作成していない場合は、CDK を作成してデプロイしますPipeline。手順については、「CDK Pipelines を使用した継続的インテグレーションとデリバリー (CI/CD)」を参照してください。

  3. CodePipeline アーティファクトバケットの AWS KMS キー ARN を取得します。このリソースはパイプラインの作成時に作成されます。

  4. CDK ブートストラップテンプレートのコピーを取得して変更します。以下は、 を使用した例です AWS CDK CLI。

    $ cdk bootstrap --show-template > bootstrap-template.yaml
  5. PipelineCrossAccountArtifactsKey ステートメントを ARN 値に置き換えてResource: *、テンプレートを変更します。

  6. テンプレートをデプロイしてブートストラップスタックを更新します。CDK を使用した例を次に示しますCLI。

    $ cdk bootstrap aws://account-id/region --template bootstrap-template.yaml
クロスアカウントデプロイに CDK Pipelines を使用していない場合に Security Hub の検出結果を修正するには
  1. CDK ブートストラップテンプレートのコピーを取得して変更します。CDK を使用した例を次に示しますCLI。

    $ cdk bootstrap --show-template > bootstrap-template.yaml
  2. テンプレートから PipelineCrossAccountArtifactsBucketおよび PipelineCrossAccountArtifactsKeyステートメントを削除します。

  3. テンプレートをデプロイしてブートストラップスタックを更新します。CDK を使用した例を次に示しますCLI。

    $ cdk bootstrap aws://account-id/region --template bootstrap-template.yaml

考慮事項

ブートストラップは環境内のリソースをプロビジョニングするため、これらのリソースを で使用すると AWS 料金が発生する可能性があります AWS CDK。