[AWS CDK] 同じApp Construct内で異なるリージョンのStackをデプロイできるのか試してみた
こんにちは、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は次のようになります。
#!/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間でパラメータの参照を行いたい場合はどうでしょう。(クロススタック参照)
#!/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
以上