[AWS CDK] Environments で指定したリージョンにスタックがデプロイされない場合の確認ポイント

2024.06.27

こんにちは、製造ビジネステクノロジー部の若槻です。

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 を渡しているか確認してみてください。

以上