[AWS CDK] 同じApp Construct内で異なるリージョンのStackをデプロイできるのか試してみた

結論:できました。
2022.07.03

この記事は公開されてから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一覧を確認すると、CdkAppStackap-northeast-1CdkAppStack2us-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を使用した下記方法などを取る必要があります。

参考

以上