CDK で3つ以上の AZ に Subnet を作成するにはアカウントとリージョンを必ず指定する必要があります

はじめに

テントの中から失礼します、CX事業本部のてんとタカハシです!

CDK で3つ以上の AZ に Subnet を作成しようと思ったら上手くいかず、少しハマりました。その時の解決方法について、記事にしていこうと思います。答えは CDK の公式ドキュメントに書いてありました。

環境

環境は下記の通りです。

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H2

$ cdk --version
1.85.0 (build 5f44668)

スタックの実装

まず CDK のプロジェクトを作ってから、単純に3つの AZ に Subnet を作ろうとしてみます。

lib/vpc-subnet-sample-stack.ts

import * as cdk from '@aws-cdk/core';
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class VpcSubnetSampleStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new Vpc(this, 'Vpc', {
      cidr: '10.0.0.0/16',
      enableDnsHostnames: true,
      enableDnsSupport: true,
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'PublicSubnet',
          subnetType: SubnetType.PUBLIC,
        },
      ],
      // 3つの AZ に Subnet 作っちゃうぞ、てへ
      maxAzs: 3,
    });
  }
}

デプロイしてから作成された Subnet を確認してみると、あれれ〜おかしいぞ〜? Subnet が2つしか作られていないじゃないかあ。

解決方法

公式のドキュメントに、「2つ以上の AZ を使用するには、アカウントとリージョンを必ず指定してね」って書いてありました。

Be aware that environment-agnostic stacks will be created with access to only 2 AZs, so to use more than 2 AZs, be sure to specify the account and region on your stack.

AWS CDK Reference Documentation

なので、スタックを作成する際に、アカウントとリージョンを指定してあげます。

bin/vpc-subnet-sample.ts

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { VpcSubnetSampleStack } from '../lib/vpc-subnet-sample-stack';

const app = new cdk.App();
new VpcSubnetSampleStack(app, 'VpcSubnetSampleStack', {
  // これを追加してあげる
  env: {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: process.env.CDK_DEFAULT_REGION,
  },
});

これでデプロイすると、3つの AZ に1つずつ Subnet が作成されるようになりました。やったぜ。

おわりに

困った時はちゃんとドキュメントを読みましょうね案件でした。

今回は以上になります。最後まで読んで頂きありがとうございました!