この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
AWSで使いたいサービスが使いたいリージョンでまだ使えないなどの理由で、同じシステム内のリソースを別々のリージョンに展開せざるを得ないことがあるかと思います。
その際にAWS CDKのApp Constructをリージョンの数だけ用意するのはいささか不便です。分けなくて良いならまとめたいですよね。
そこで今回は、AWS CDKで同じApp Construct内のStackを別々のリージョンにデプロイできるのか試してみました。
環境
$ npm ls aws-cdk --depth=0
project@0.1.0 /path/to/project
└── aws-cdk@2.29.1
やってみた
CdkAppStack
を東京リージョン(ap-northeast-1
)に、CdkAppStack2
を北大西洋リージョン(us-east-1
)にそれぞれデプロイしたいとします。
その場合のApp Constructは次のようになります。
bin/aws-cdk-v2-project.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkAppStack } from '../lib/cdk-app-stack';
import { CdkAppStack2 } from '../lib/cdk-app-stack-2';
const app = new cdk.App();
new CdkAppStack(app, 'CdkAppStack', {
env: { region: 'ap-northeast-1' },
});
new CdkAppStack2(app, 'CdkAppStack2', {
env: { region: 'us-east-1' },
});
- Stackの
env.region
プロパティを指定することにより、Stack毎にDeploy先のリージョンを指定することができます。- 指定しなければAWSの認証情報(ProfileやAssumeRole時の指定)またはコマンド引数で指定したリージョンが使用されてしまいます。
両StackをCDK Deployします。
cdk deploy --all
AWS上のStack一覧を確認すると、CdkAppStack
はap-northeast-1
、CdkAppStack2
はus-east-1
とそれぞれ期待したリージョンへStackがDeployできていることが確認できました!
$ aws cloudformation list-stacks \
--query 'StackSummaries[?contains(StackName, `CdkAppStack`)].StackName' \
--stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE \
--region ap-northeast-1
[
"CdkAppStack"
]
$ aws cloudformation list-stacks \
--query 'StackSummaries[?contains(StackName, `CdkAppStack`)].StackName' \
--stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE \
--region us-east-1
[
"CdkAppStack2"
]
パラメータ入出力によるクロススタック参照はできなかった
Stack間でパラメータの参照を行いたい場合はどうでしょう。(クロススタック参照)
bin/aws-cdk-v2-project.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkAppStack } from '../lib/cdk-app-stack';
import { CdkAppStack2 } from '../lib/cdk-app-stack-2';
const app = new cdk.App();
const cdkAppStack = new CdkAppStack(app, 'CdkAppStack', {
env: { region: 'ap-northeast-1' },
});
new CdkAppStack2(app, 'CdkAppStack2', {
env: { region: 'us-east-1' },
topicName: cdkAppStack.topicName,
});
Deployしてみるとクロススタック参照できないためエラーとなりました。
$ cdk deploy --all
Error: Resolution error: Resolution error: Resolution error: Resolution error: Cannot use resource 'CdkAppStack/topic' in a cross-environment fashion, the resource's physical name must be explicit set or use `PhysicalName.GENERATE_IF_NEEDED`.
リージョンが異なるためStack間のパラメータ入出力ができないのは当然と言えば当然です。
どうしてもやりたいのであればカスタムConstructを使用した下記方法などを取る必要があります。
参考
- Filtering AWS CLI output - AWS Command Line Interface
- Query Contains Examples with AWS CLI | bobbyhadz
- Using shorthand syntax with the AWS CLI - AWS Command Line Interface
- list-stacks — AWS CLI 2.7.12 Command Reference
以上