🌍️

【AWS CDK】東京・大阪リージョンに同じ構成をデプロイするマルチリージョン対応

に公開

はじめに

AWS CDKを使って、東京リージョンと大阪リージョンに同じ構成をデプロイする機会がありました。
その際、マルチリージョン対応にあたってスタック構成やリソースの共通化に工夫した点を、
CDK テンプレートに最初からコメントアウトで用意されているSQSキューの共通化を例に備忘録として残しておきたいと思います。

cdk init app --language typescriptを実行すると、最初にこんなコメントが表示されます。

// The code that defines your stack goes here

// example resource
// const queue = new sqs.Queue(this, 'CdkTestQueue', {
//   visibilityTimeout: cdk.Duration.seconds(300)
// });

このキューの作成を共通化させて、東京リージョンと大阪リージョンで同じ構成を作れるようにしていきます。

ディレクトリ構成

今回の構成では、東京リージョン・大阪リージョンそれぞれにスタックを用意し、
共通のリソース作成メソッドをlib/resources/配下に切り出して再利用できるようにしました。
ディレクトリ構成は以下のようになっています。

/.
├── bin
│   └── cdk-multi-region.ts       # エントリポイント(東京・大阪スタックを呼び出し)
├── cdk.json
├── lib
│   ├── stacks
│   │   ├── tokyo-region-stack.ts # 東京リージョン用スタック
│   │   └── osaka-region-stack.ts # 大阪リージョン用スタック
│   └── resources
│       └── sqs
│           └── queue.ts          # 共通SQS作成処理
├── package-lock.json
├── package.json
└── tsconfig.json

SQS作成処理の共通化

共通のSQSキューを作成するメソッドは、lib/resources/sqs/queue.tsに記載しました。
これにより、スタックごとにキュー名などの設定だけを渡せば、同じ構成がつくられるようになります。

以下が共通化したメソッドの中身です。
関数名はcreateQueueとしています。

queue.ts
import { Construct } from 'constructs';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import { Duration } from 'aws-cdk-lib';

interface CreateQueueProps {
  queueName: string;
  visibilityTimeoutSeconds?: number;
}

export const createQueue = (scope: Construct, id: string, props: CreateQueueProps): sqs.Queue => {
  return new sqs.Queue(scope, id, {
    queueName: props.queueName,
    visibilityTimeout: Duration.seconds(props.visibilityTimeoutSeconds ?? 300),
  });
};

東京リージョンスタックでの呼び出し

先程のcreateQueueメソッドをimportで読み込み、東京リージョン用のスタックからSQSキューを作成してみます。

tokyo-region-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { createQueue } from '../resources/sqs/queue';

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

    createQueue(this, 'TokyoQueue', {
      queueName: 'tokyo-app-queue',
      visibilityTimeoutSeconds: 300,
    });
  }
}

同様に、大阪リージョン用スタックでもqueueNameを'osaka-app-queue'変えるだけで大阪リージョン向けのキューの作成ができるようになります。

マルチリージョンデプロイのエントリポイント

bin/cdk-multi-region.ts では、東京リージョンと大阪リージョンそれぞれに対応するスタックを定義しています。
各スタックにenvにリージョンを指定することでマルチリージョンでデプロイできるようにしています。

cdk-multi-region.ts
import * as cdk from 'aws-cdk-lib';
import { TokyoRegionStack } from '../lib/stacks/tokyo-region-stack';
import { OsakaRegionStack } from '../lib/stacks/osaka-region-stack';

const app = new cdk.App();

new TokyoRegionStack(app, 'CdkMultiRegionStackTokyo', {
  env: {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: 'ap-northeast-1', // 東京リージョン
  },
});

new OsakaRegionStack(app, 'CdkMultiRegionStackOsaka', {
  env: {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: 'ap-northeast-3', // 大阪リージョン
  },
});

さいごに

今回は AWS CDK の初期テンプレートにあるSQSキューの定義をベースに、マルチリージョン構成とリソースの共通化の工夫について書いてみました。
CDKでマルチリージョン対応する際の参考に、少しでもなれば嬉しいです!

Discussion