【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
としています。
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キューを作成してみます。
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にリージョンを指定することでマルチリージョンでデプロイできるようにしています。
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