AWS CDK で複数環境にデプロイしているリソースを片方の環境のみ削除してみた

AWS CDK で複数環境にデプロイしているリソースを片方の環境のみ削除してみた

2025.08.02

こんにちは!製造ビジネステクノロジー部の小林です。

AWS CDK を利用していると、一つのスタックを複数の環境にデプロイして、同じ実装を使い回すことがあると思います。しかし、特定の環境でのみ不要になったリソースを削除しようとした際、どのようにすればよいか困ったことはないでしょうか。
スクリーンショット 2025-08-02 20.50.07

今回は、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はダミーです)

bin/parameter.ts
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をインスタンス化します。

lib/multi-env-stack.ts
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 で複数環境にデプロイしているリソースのうち、片方の環境のリソースを削除する方法をご紹介しました。この方法ではリソースを削除した環境のスタックは残存しています。必要に応じてコマンドもしくはコンソールから削除してください。
この記事が皆様のお役に立てれば幸いです。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.