AWS CDK で複数環境にデプロイしているリソースを片方の環境のみ削除してみた
こんにちは!製造ビジネステクノロジー部の小林です。
AWS CDK を利用していると、一つのスタックを複数の環境にデプロイして、同じ実装を使い回すことがあると思います。しかし、特定の環境でのみ不要になったリソースを削除しようとした際、どのようにすればよいか困ったことはないでしょうか。
今回は、AWS CDK で複数環境にデプロイしているリソースのうち、特定の環境のリソースだけを削除する方法をご紹介します。
前提条件
- AWS CDK プロジェクトが構築済みであること
- 本記事では TypeScript を使用した CDK プロジェクトを想定しています
- 環境変数によるデプロイの切り替えができること
- dev や stg といった環境変数を使い、各環境へのデプロイを制御できる状態である必要があります
- CI/CD環境でのデプロイを前提とします
- 本記事では、GitHub Actions を使用して開発環境と検証環境の2つのワークフローが存在することを前提とします。これにより、ローカルでのAWS認証設定を気にすることなく、複数のAWSアカウントへのデプロイを想定しています
やってみた
今回は開発環境(dev)のリソースを削除し、検証環境(stg)のリソースを残す実装を行ってみます。解決策としては、リソースを削除したい環境に「空のスタック」をデプロイすることです。
具体的には、デプロイ実行時に環境変数をチェックし、stg 環境では通常通りリソースを作成し、dev 環境ではスタックの中身を空にするように実装します。
これにより、CDK は dev 環境に存在するリソースをスタックの定義から見つけられなくなり、リソースを削除するための変更セットを生成します。
実装例
以下に、このアプローチを適用した CDK プロジェクトの例を紹介します。
リポジトリ構成
multi-env
├── bin/
│ ├── multi-env.ts
│ └── parameter.ts
├── lib/
│ ├── constructs/
│ │ ├── api-gateway.ts
│ │ ├── lambda.ts
│ │ ├── macie.ts
│ │ └── s3.ts
│ └── multi-env-stack.ts
└── ...
環境ごとの設定ファイル
bin/parameter.ts では、dev と stg の AWS アカウント情報を定義しています。(アカウントIDはダミーです)
export interface EnvConfig {
account: string;
region: string;
}
export const envConfigs: Record<string, EnvConfig> = {
dev: {
account: '111111111111',
region: 'ap-northeast-1'
},
stg: {
account: '222222222222',
region: 'ap-northeast-1'
}
};
スタックの実装
lib/multi-env-stack.ts が今回の中心となるロジックです。
このスタックでは、環境変数で渡されたキーが stg の場合のみ、S3、Lambda、API Gateway、Macie といった各リソースのConstructをインスタンス化します。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { S3Construct } from './constructs/s3';
import { LambdaConstruct } from './constructs/lambda';
import { ApiGatewayConstruct } from './constructs/api-gateway';
import { MacieConstruct } from './constructs/macie';
export interface MultiEnvStackProps extends cdk.StackProps {
envKey: string;
}
export class MultiEnvStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: MultiEnvStackProps) {
super(scope, id, props);
const { envKey } = props;
/**
* 開発環境(dev)は空のスタックを作成してリソースを削除する
*/
if (envKey === "dev") {
return;
}
// S3バケット作成
const s3Construct = new S3Construct(this, 'S3Resources', {
envKey: envKey
});
// Lambda関数作成
const lambdaConstruct = new LambdaConstruct(this, 'LambdaResources', {
envKey: envKey
});
// API Gateway作成
const apiGatewayConstruct = new ApiGatewayConstruct(this, 'ApiGatewayResources', {
envKey: envKey,
apiHandlerFunction: lambdaConstruct.apiHandlerFunction
});
// Macie設定
const macieConstruct = new MacieConstruct(this, 'MacieResources', {
envKey: envKey
});
}
}
下記のソースで、開発環境(dev)のデプロイ実行時に空のスタックを作成し、リソースを削除します。
/**
* 開発環境(dev)は空のスタックを作成してリソースを削除する
*/
if (envKey === "dev") {
return;
}
デプロイ方法
本記事では、CI/CDワークフロー(GitHub Actions)を通じてデプロイを行うことを想定しています。
具体的には、stg環境にデプロイするワークフローでは、cdk deploy --context env=stg --allのようなコマンドを実行します。GitHub Actions の OIDC 認証を利用することで、devアカウントとstgアカウントへのAssumeRoleを自動的に行いデプロイが実行できます。
dev環境のリソースを削除する
dev環境のリソースを削除したい場合は、dev環境向けのCI/CDワークフローを実行します。
この際、multi-env-stack.ts のif (envKey === "dev")によって空のスタックがデプロイされるため、dev環境に存在するリソースはすべて削除されます。stg環境には影響はありません。
おわりに
今回は、AWS CDK で複数環境にデプロイしているリソースのうち、片方の環境のリソースを削除する方法をご紹介しました。この方法ではリソースを削除した環境のスタックは残存しています。必要に応じてコマンドもしくはコンソールから削除してください。
この記事が皆様のお役に立てれば幸いです。