これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
を使用して環境をブートストラップする際の一般的な問題をトラブルシューティングします AWS Cloud Development Kit (AWS CDK)。
ブートストラップの概要については、「AWS CDK ブートストラップ」を参照してください。
ブートストラップの手順については、「で使用する環境をブートストラップする AWS CDK」を参照してください。
デフォルトのテンプレートを使用してブートストラップすると、Amazon S3 バケットの CREATE_FAILED エラーが発生します。
デフォルトのブートストラップテンプレートで AWS CDK コマンドラインインターフェイス (CDKCLI) cdk bootstrap
コマンドを使用してブートストラップすると、次のエラーが表示されます。
CREATE_FAILED | AWS::S3::Bucket |
BucketName
already exists
トラブルシューティングの前に、最新バージョンの CDK CLI を使用していることを確認してください。
-
バージョンを確認するには、
cdk --version
を実行します。 -
最新バージョンをインストールするには、
npm install -g aws-cdk
を実行します。
最新バージョンをインストールしたら、環境のブートストラップを再試行してください。それでも同じエラーが表示される場合は、トラブルシューティングを続行します。
一般的な原因
環境をブートストラップすると、 はブートストラップリソースIDs AWS CDK を生成します。詳細については、「ブートストラップ中に作成されたリソース ID」を参照してください。
他のブートストラップリソースとは異なり、Amazon S3 バケット名はグローバルです。つまり、各バケット名は、パーティション AWS リージョン 内のすべての AWS アカウント で一意である必要があります。詳細については、「Amazon S3 ユーザーガイド」の「バケットの概要」を参照してください。したがって、このエラーの最も一般的な原因は、バケット名として生成された物理 ID がパーティション内のどこかに既に存在することです。これは、アカウント内または別のアカウント内である可能性があります。
バケット名の例を示します: cdk-hnb659fds-assets-012345678910-us-west-1
。可能性は低いですが、修飾子とアカウント ID が名前の一部であるため、Amazon S3 バケットのこの名前が別の AWS アカウントによって使用されている可能性があります。バケット名はグローバルにスコープされているため、同じパーティション内の別のアカウントで使用されている場合は使用できません。ほとんどの場合、同じ名前のバケットがアカウント内のどこかに存在する可能性があります。これは、ブートストラップしようとしているリージョン、または別のリージョンにある可能性があります。
通常、解決方法は、このバケットをアカウント内で見つけて、そのバケットの操作を決定するか、ブートストラップをカスタマイズして別の名前のブートストラップリソースを作成することです。
解決方法
まず、同じ名前のバケットが 内に存在するかどうかを確認します AWS アカウント。有効なアクセス許可を持つ AWS ID を使用して、アカウント内の Amazon S3 バケットを検索するには、次の方法でこれを行うことができます。
-
AWS Command Line Interface (AWS CLI)
aws s3 ls
コマンドを使用して、すべてのバケットのリストを表示します。 -
Amazon S3 コンソール
を使用して、アカウント内の各リージョンのバケット名を検索します。
同じ名前のバケットが存在する場合は、そのバケットが使用されているかどうかを判断します。使用していない場合は、バケットを削除し、環境を再度ブートストラップすることを検討してください。
同じ名前のバケットが存在し、削除しない場合は、アカウント内のブートストラップスタックに既に関連付けられているかどうかを確認します。複数のリージョンをチェックする必要がある場合があります。Amazon S3 バケット名のリージョンは、必ずしもバケットがそのリージョンにあることを意味するわけではありません。CDKToolkit
ブートストラップスタックに関連付けられているかどうかを確認するには、リージョンごとに次のいずれかを実行できます。
-
コマンドを使用して AWS CLI
aws cloudformation describe-stack-resources --stack-name
、ブートストラップスタック内のリソースを表示し、バケットが一覧表示されているかどうかを確認します。CDKToolkit
--regionRegion
-
AWS CloudFormation コンソール
で、 CDKToolkit
スタックを見つけます。次に、[リソース] タブで、バケットが存在するかどうかを確認します。
バケットがブートストラップスタックに関連付けられている場合は、ブートストラップスタックがブートストラップしようとしているのと同じリージョンにあるかどうかを確認します。その場合、環境はすでにブートストラップされているため、CDK を使用して環境にアプリケーションをデプロイできるはずです。Amazon S3 バケットが別のリージョンのブートストラップスタックに関連付けられている場合は、何をすべきかを決定する必要があります。解決方法としては、既存の Amazon S3 バケットの名前変更、使用されていない場合の現在の Amazon S3 バケットの削除、作成しようとしている Amazon S3 バケットの新しい名前の使用などがあります。
アカウントで同じ名前の Amazon S3 バケットを見つけることができない場合、別のアカウントに存在する可能性があります。これを解決するには、ブートストラップをカスタマイズして、すべてのブートストラップリソースまたは Amazon S3 バケットに対してのみ新しい名前を作成する必要があります。すべてのブートストラップリソースに新しい名前を作成する場合は、修飾子を変更できます。Amazon S3 バケットのみの新しい名前を作成する場合は、新しいバケット名を指定できます。
ブートストラップをカスタマイズするには、CDK CLI の cdk bootstrap
コマンドで オプションを使用するか、ブートストラップテンプレートを変更します。手順については、AWS CDK ブートストラップをカスタマイズする を参照してください。
ブートストラップをカスタマイズする場合は、アプリケーションを適切にデプロイするためには、事前に同じ変更を合成に適用する必要があります。手順については、CDK スタック合成をカスタマイズする を参照してください。
たとえば、cdk bootstrap
で新しい修飾子を指定できます。
$
cdk bootstrap --qualifier
abcde0123
この変更で作成される Amazon S3 バケット名の例を次に示します: cdk-abcde0123-assets-012345678910-us-west-1
。ブートストラップ中に作成されたすべてのブートストラップリソースは、この修飾子を使用します。
CDK アプリを開発するときは、シンセサイザーでカスタム修飾子を指定する必要があります。これにより、CDK は合成とデプロイ中にブートストラップリソースを識別するのに役立ちます。スタックインスタンスのデフォルトのシンセサイザーをカスタマイズする例を以下に示します。
new MyStack(this, 'MyStack', {
synthesizer: new DefaultStackSynthesizer({
qualifier: 'abcde0123',
}),
});
CDK プロジェクトの cdk.json
ファイルで新しい修飾子を指定することもできます。
{
"app": "...",
"context": {
"@aws-cdk/core:bootstrapQualifier": "abcde0123"
}
}
Amazon S3 バケット名のみを変更するには、--bootstrap-bucket-name
オプションを使用できます。以下に例を示します。
$
cdk bootstrap --bootstrap-bucket-name
'my-new-bucket-name'
CDK アプリを開発するときは、シンセサイザーで新しいバケット名を指定する必要があります。スタックインスタンスのデフォルトのシンセサイザーをカスタマイズする例を以下に示します。
new MyStack(this, 'MyStack', {
synthesizer: new DefaultStackSynthesizer({
fileAssetsBucketName: 'my-new-bucket-name',
}),
});
予防
使用する AWS 環境ごとに事前にブートストラップすることをお勧めします。詳細については、「環境をブートストラップするタイミング」を参照してください。特に Amazon S3 バケットの命名問題の場合、これにより各 AWS 環境に Amazon S3 バケットが作成され、他のユーザーが Amazon S3 バケット名を使用できなくなります。