これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
このトピックでは、 AWS CDKに関する次の問題のトラブルシューティング方法について説明します。
を更新すると AWS CDK、 AWS CDK ツールキット (CLI) は AWS コンストラクトライブラリとの不一致を報告します。
Toolkit のバージョン AWS CDK ( cdk
コマンドを提供します) は、メインの AWS コンストラクトライブラリモジュール のバージョンと少なくとも同じである必要がありますaws-cdk-lib
。Toolkit は下位互換性があるように設計されています。最新の 2.x バージョンの Toolkit は、ライブラリの任意の 1.x または 2.x リリースで使用できます。このため、このコンポーネントをグローバルにインストールして最新の状態に保つことをお勧めします。
npm update -g aws-cdk
複数のバージョンの AWS CDK Toolkit を使用する必要がある場合は、特定のバージョンのツールキットをプロジェクトフォルダにローカルにインストールします。
TypeScript または JavaScript を使用している場合、プロジェクトディレクトリに CDK Toolkit のバージョニングされたローカルコピーが既に含まれています。
別の言語を使用している場合は、 を使用して AWS CDK Toolkit をインストールnpm
し、 -g
フラグを省略して目的のバージョンを指定します。以下に例を示します。
npm install aws-cdk@2.0
ローカルにインストールされた AWS CDK Toolkit を実行するには、 のみnpx aws-cdk
ではなく コマンドを使用しますcdk
。以下に例を示します。
npx aws-cdk deploy MyStack
npx aws-cdk
ツールキットが存在する場合、 はローカルバージョンの AWS CDK Toolkit を実行します。プロジェクトにローカルインストールがない場合、グローバルバージョンに戻ります。cdk
が常にこの方法で呼び出されるように、シェルエイリアスを設定すると便利な場合があります。
alias cdk="npx aws-cdk"
(リストに戻る)
AWS CDK スタックをデプロイすると、NoSuchBucket
エラーが表示されます。
AWS 環境がブートストラップされていないため、デプロイ中にリソースを保持する Amazon S3 バケットがありません。次のコマンドを使用し、ステージングバケットやその他の必要なリソースを作成できます。
cdk bootstrap aws://
ACCOUNT-NUMBER
/REGION
予期しない AWS 料金が発生しないように、 AWS CDK は環境を自動的にブートストラップしません。デプロイする各環境を明示的にブートストラップする必要があります。
デフォルトでは、ブートストラップリソースは現在の AWS CDK
アプリケーションのスタックで使用されるリージョンに作成されます。または、ローカル AWS プロファイルで指定されたリージョン ( によって設定aws configure
) で、そのプロファイルのアカウントを使用して作成されます。コマンドラインに、次のように別のアカウントおよびリージョンを指定できます。(アプリのディレクトリにない場合、アカウントおよびリージョンを指定する必要があります)
cdk bootstrap aws://
ACCOUNT-NUMBER
/REGION
詳細については、「AWS CDK ブートストラップ」を参照してください。
(リストに戻る)
AWS CDK スタックをデプロイすると、 というforbidden: null
メッセージが表示されます。
ブートストラップリソースを必要とするスタックをデプロイしていますが、書き込み許可のない IAM ロールまたはアカウントを使用しています。(アセットを含むか、50K を超える AWS CloudFormation テンプレートを合成するスタックをデプロイする場合、ステージングバケットは使用されます) エラーメッセージに記載されているバケットに対して s3:*
アクションを実行する許可を持つアカウントまたはロールを使用します。
(リストに戻る)
AWS CDK スタックを合成すると、 というメッセージが表示されます。 --app is required either in command-line, in cdk.json or in ~/.cdk.json
このメッセージは通常、 を発行するときに AWS CDK プロジェクトのメインディレクトリにないことを意味しますcdk synth
。cdk init
コマンドによって作成されたこのディレクトリcdk.json
の ファイルには、 AWS CDK アプリケーションを実行 (および合成) するために必要なコマンドラインが含まれています。例えば、TypeScript アプリの場合、デフォルトの cdk.json
は次のようになります。
{
"app": "npx ts-node bin/my-cdk-app.ts"
}
AWS CDK ツールキットがcdk.json
そこで見つけてアプリを正常に実行できるように、プロジェクトのメインディレクトリでのみcdk
コマンドを発行することをお勧めします。
これが何らかの理由で実用的でない場合、 AWS CDK Toolkit は他の 2 つの場所でアプリケーションのコマンドラインを検索します。
-
ホームディレクトリの
cdk.json
で -
-a
オプションを使用してcdk synth
コマンド自体で
例えば、次のように TypeScript アプリからスタックを合成できます。
cdk synth --app "npx ts-node my-cdk-app.ts" MyStack
(リストに戻る)
AWS CDK スタックを合成するときに、テンプレートに含まれるリソースが多すぎるため AWS CloudFormation 、エラーが表示されます。
は AWS CloudFormation template AWS CDK を生成してデプロイします。 AWS CloudFormation スタックに含めることができるリソースの数にはハード制限があります。を使用すると AWS CDK、この制限に対して予想よりも速く実行できます。
注記
この書き込みでは、 AWS CloudFormation リソースの制限は 500 です。現在のリソース制限については、「AWS CloudFormation クォータ」を参照してください。
AWS コンストラクトライブラリの高レベルのインテントベースのコンストラクトは、ログ記録、キー管理、認可、およびその他の目的に必要な補助リソースを自動的にプロビジョニングします。例えば、あるリソースに別のリソースへのアクセスを許可すると、関連サービスが通信するために必要な IAM オブジェクトが生成されます。
経験上、インテントベースのコンストラクトを実際に使用すると、コンストラクトごとに 1~5 AWS CloudFormation リソースになりますが、これは異なる場合があります。サーバーレスアプリケーションの場合、API エンドポイントあたり 5~8 AWS リソースが一般的です。
抽象化のレベルが高いパターンを使用すると、コード数を減らしてさらに多くの AWS リソースを定義できます。例えば例: を使用して AWS Fargate サービスを作成する AWS CDK、 の AWS CDK コードは、3 つのコンストラクトのみを定義しながら、50 を超える AWS CloudFormation リソースを生成します。
AWS CloudFormation リソース制限を超えると、 AWS CloudFormation 合成中にエラーが発生します。スタックが制限の 80% を超えると、 は警告 AWS CDK を発行します。スタックに maxResources
プロパティを設定するか、maxResources
を 0 に設定して検証を無効にすることにより、別の制限を適用できます。
ヒント
次のユーティリティスクリプトを使用し、合成された出力のリソースの正確な数を取得できます。(すべての AWS CDK 開発者には Node.js が必要なため、スクリプトは JavaScript.)
// rescount.js - count the resources defined in a stack
// invoke with: node rescount.js <path-to-stack-json>
// e.g. node rescount.js cdk.out/MyStack.template.json
import * as fs from 'fs';
const path = process.argv[2];
if (path) fs.readFile(path, 'utf8', function(err, contents) {
console.log(err ? `${err}` :
`${Object.keys(JSON.parse(contents).Resources).length} resources defined in ${path}`);
}); else console.log("Please specify the path to the stack's output .json file");
スタックのリソース数が制限に近づいたら、再設計を検討してスタックに含まれるリソースの数を減らしてください。例えば、Lambda 関数をいくつか組み合わせるか、スタックを複数のスタックに分割することができます。CDK はスタック間のリファレンスをサポートしているため、ユーザーに合った方法でアプリの機能をさまざまなスタックに分割できます。
注記
AWS CloudFormation エキスパートは、リソース制限のソリューションとしてネストされたスタックの使用を提案することがよくあります。は、 NestedStackコンストラクトを介してこのアプローチ AWS CDK をサポートします。
(リストに戻る)
Auto Scaling グループまたは VPC に 3 つ (またはそれ以上) のアベイラビリティーゾーンを指定したが、2 つしかデプロイされない
要求するアベイラビリティーゾーンの数を取得するには、スタックの env
プロパティでアカウントおよびリージョンを指定します。両方を指定しない場合、 AWS CDKはデフォルトでスタックを環境に依存しないものとして合成します。その後、 を使用してスタックを特定のリージョンにデプロイできます AWS CloudFormation。一部のリージョンには 2 つのアベイラビリティーゾーンしかないため、環境に依存しないテンプレートは 3 つ以上は使用しません。
注記
以前、リージョンは 1 つのアベイラビリティーゾーンのみで起動することがありました。環境に依存しない AWS CDK スタックは、そのようなリージョンにデプロイできません。ただし、この記述では、すべての AWS リージョンに少なくとも 2 つの AZs。
この動作を変更するには、スタックの availablilityZones
(Python: availability_zones
) プロパティを上書きし、使用するゾーンを明示的に指定します。
合成時にスタックのアカウントおよびリージョンを指定し、任意のリージョンにデプロイする柔軟性を維持する方法の詳細については、「の環境 AWS CDK」を参照してください。
(リストに戻る)
cdk destroy
を発行しても、S3 バケット、DynamoDB テーブル、その他のリソースが削除されない
デフォルトでは、ユーザーデータを含むことができるリソースには RETAIN
の removalPolicy
(Python: removal_policy
) プロパティがあり、スタックが廃棄されたときにリソースは削除されません。代わりに、リソースはスタックから切り離された状態になります。その後、スタックが廃棄された後にリソースを手動で削除する必要があります。これを行わない限り、スタックの再デプロイは失敗します。デプロイ中に作成される新しいリソースの名前が、孤立したリソースの名前と競合するためです。
リソースの削除ポリシーを DESTROY
に設定する場合、スタックが廃棄されるとそのリソースは削除されます。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class CdkTestStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
}
}
注記
AWS CloudFormation は空でない Amazon S3 バケットを削除することはできません。Amazon S3 バケットの削除ポリシーを DESTROY
に設定し、データが含まれている場合、バケットを削除できないため、スタックを破棄しようとすると失敗します。バケットの autoDeleteObjects
プロパティを true
に設定することにより、 AWS CDK がバケット内のオブジェクトを削除してから破棄できます。
(リストに戻る)