こんにちは、製造ビジネステクノロジー部の若槻です。
AWS CDKでは、StackProps の Environments を指定することでスタックごとにデプロイ先の AWS アカウントおよびリージョンを明示的に指定することができます。
今回は、Environments で指定したリージョンにスタックが思った通りにデプロイされない事象に遭遇しましたので、確認すべきだったポイントを共有します。
事象
AWS CDK で us-east-1 リージョンにスタックをデプロイしたいが、デフォルトリージョンである ap-northeast-1 でデプロイされてしまう事象が発生しました。
CDK スタック定義
lib/cdk-sample-stack.ts
import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps) {
super(scope, id);
new CfnOutput(this, 'Region', {
value: props.env?.region || 'No region',
});
}
}
CDK アプリ定義
スタック初期化時に env でデプロイ先のリージョンを指定しています。
bin/cdk_sample_app.ts
import { App } from 'aws-cdk-lib';
import { CdkSampleStack } from '../lib/cdk-sample-stack';
const app = new App();
new CdkSampleStack(app, 'CdkSampleStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: 'us-east-1',
},
});
デフォルトリージョンは ap-northeast-1
CDK デプロイコマンドを実行する環境のデフォルトリージョンは ap-northeast-1 です。
$ aws configure get region
ap-northeast-1
デプロイすると us-east-1 にデプロイされない
CDK デプロイコマンドを実行してスタックをデプロイすると、ap-northeast-1 にデプロイされてしまっているようです。
$ npx cdk deploy --require-approval never
✨ Synthesis time: 3.02s
CdkSampleStack: start: Building 016d37869c3df6854b1b3a92f7c6f416e3073ed806cbf5c7aec2ac3f549e3e9f:current_account-current_region
CdkSampleStack: success: Built 016d37869c3df6854b1b3a92f7c6f416e3073ed806cbf5c7aec2ac3f549e3e9f:current_account-current_region
CdkSampleStack: start: Publishing 016d37869c3df6854b1b3a92f7c6f416e3073ed806cbf5c7aec2ac3f549e3e9f:current_account-current_region
CdkSampleStack: success: Published 016d37869c3df6854b1b3a92f7c6f416e3073ed806cbf5c7aec2ac3f549e3e9f:current_account-current_region
CdkSampleStack: deploying... [1/1]
CdkSampleStack: creating CloudFormation changeset...
✅ CdkSampleStack
✨ Deployment time: 43.12s
Outputs:
CdkSampleStack.Region = us-east-1
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/CdkSampleStack/64865330-32dd-11ee-966b-0ad98d96b631
✨ Total time: 46.14s
スタックの存在確認をしてみると、us-east-1 には作成されていません。
$ aws cloudformation describe-stacks --stack-name CdkSampleStack --region us-east-1 --query 'Stacks[0].StackName' --output text
An error occurred (ValidationError) when calling the DescribeStacks operation: Stack with id CdkSampleStack does not exist
ap-northeast-1 を確認してみると、やはりこちらにスタックが作成されていました。
$ aws cloudformation describe-stacks --stack-name CdkSampleStack --region ap-northeast-1 --query 'Stacks[0].StackName' --output text
CdkSampleStack
原因、解決
元のスタック定義では super()
の部分で props
オブジェクトを渡していなかったことが原因でした。これにより StackProps インターフェースで定義されているプロパティを使えなくなっていたようです。
よって、super()
で props
を渡すように修正しました。
lib/cdk-sample-stack.ts
import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps) {
super(scope, id, props); // クラス継承で props を渡す必要があった
new CfnOutput(this, 'Region', {
value: props.env?.region || 'No region',
});
}
}
デプロイを再度実行すると、us-east-1 にスタックが作成されたようです。
$ npx cdk deploy --require-approval never
✨ Synthesis time: 3.2s
CdkSampleStack: start: Building efd7f107c674e7b421df57501f9fe3fc5bb7c2fdda9a817dfe0bf4b10695959c:XXXXXXXXXXXX-us-east-1
CdkSampleStack: success: Built efd7f107c674e7b421df57501f9fe3fc5bb7c2fdda9a817dfe0bf4b10695959c:XXXXXXXXXXXX-us-east-1
CdkSampleStack: start: Publishing efd7f107c674e7b421df57501f9fe3fc5bb7c2fdda9a817dfe0bf4b10695959c:XXXXXXXXXXXX-us-east-1
CdkSampleStack: success: Published efd7f107c674e7b421df57501f9fe3fc5bb7c2fdda9a817dfe0bf4b10695959c:XXXXXXXXXXXX-us-east-1
CdkSampleStack: deploying... [1/1]
CdkSampleStack: creating CloudFormation changeset...
✅ CdkSampleStack
✨ Deployment time: 17.01s
Outputs:
CdkSampleStack.Region = us-east-1
Stack ARN:
arn:aws:cloudformation:us-east-1:XXXXXXXXXXXX:stack/CdkSampleStack/33d9b1a0-3444-11ef-8736-0e1b773bb4d9
✨ Total time: 20.2s
ちゃんと us-east-1 にスタックが作成されていることを確認できました。
$ aws cloudformation describe-stacks --stack-name CdkSampleStack --region us-east-1 --query 'Stacks[0].StackName' --output text
CdkSampleStack
おわりに
AWS CDK スタックの Environments で指定したリージョンにスタックが思う通りにデプロイされない場合は、スタック定義の super()
で props
を渡しているか確認してみてください。
以上