CloudFormtion スタックのステータスが失敗またはロールバックで終了した場合に SNS トピックに通知する EventBridge ルールを AWS CDK で作成する

CloudFormtion スタックのステータスが失敗またはロールバックで終了した場合に SNS トピックに通知する EventBridge ルールを AWS CDK で作成する

Clock Icon2025.06.19

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CloudFormation によるスタックのデプロイが失敗またはロールバックで終了した場合に、通知などですぐに気づけるようにしたい場合があります。特に CI/CD パイプラインなどで自動デプロイを行っている場合、与り知らぬうちにデプロイが正常に行えない状態に陥っていた!なんてことが無いように、スタックの状態を監視できるようにしておくことが重要です。

そこで今回は、AWS CloudFormation スタックのステータスが失敗またはロールバックで終了した場合に SNS トピックに通知する EventBridge ルールを AWS CDK で作成してみました。

やってみた

CDK 実装

AWS CDK の実装コードは以下の通りです。

lib/main-stack.ts
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as sns from "aws-cdk-lib/aws-sns";
import * as subscriptions from "aws-cdk-lib/aws-sns-subscriptions";
import * as events from "aws-cdk-lib/aws-events";
import * as targets from "aws-cdk-lib/aws-events-targets";

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

    const SUBSCRIPTION_EMAIL_ADDRESS =
      process.env.SUBSCRIPTION_EMAIL_ADDRESS || "";

    /**
     * SNS トピックを作成
     */
    const topic = new sns.Topic(this, "Topic");

    /**
     * SNS トピックにEメールサブスクリプションを追加
     */
    topic.addSubscription(
      new subscriptions.EmailSubscription(SUBSCRIPTION_EMAIL_ADDRESS)
    );

    /**
     * CloudFormation スタックのステータスが失敗またはロールバックで終了した場合にイベントをキャッチする EventBridge ルールを作成
     */
    const rule = new events.Rule(this, "Rule", {
      eventPattern: {
        // @see https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/event-detail-stack-status-change.html
        source: ["aws.cloudformation"],
        detailType: ["CloudFormation Stack Status Change"],
        detail: {
          "status-details": {
            // @see https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/view-stack-events.html#cfn-console-view-stack-data-resources-status-codes
            status: [
              "CREATE_FAILED",
              "DELETE_FAILED",
              "IMPORT_ROLLBACK_COMPLETE",
              "IMPORT_ROLLBACK_FAILED",
              "ROLLBACK_COMPLETE",
              "ROLLBACK_FAILED",
              "UPDATE_FAILED",
              "UPDATE_ROLLBACK_COMPLETE",
              "UPDATE_ROLLBACK_FAILED",
            ],
          },
        },
      },
    });

    /**
     * EventBridge ルールに SNS トピックをターゲットとして追加
     */
    rule.addTarget(new targets.SnsTopic(topic));
  }
}

CloudFormation スタックのイベントパターンは以下のドキュメントで確認できます。このパターンに沿うように EventBridge ルールを設定します。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/event-detail-stack-status-change.html

さらに特定のステータス時にのみ通知を行うため、status-details.status の値に失敗またはロールバックのステータスコードを指定しています。スタックステータスコードの一覧は以下のドキュメントで確認できます。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/view-stack-events.html#cfn-console-view-stack-data-resources-status-codes

上記を CDK スタックをデプロイします。

動作確認

動作確認として、意図的に CloudFormation スタックのデプロイを失敗させてみます。例えば、グローバルでユニークでな名前を要求するリソース(S3 バケットなど)を作成しようとすると、同じ名前のバケットが存在する場合にデプロイが失敗します。

実際に名前が重複する S3 バケットを作成しようとすると、以下のように CREATE_FAILED エラーが発生し、スタックデプロイは UPDATE_ROLLBACK_COMPLETE で終了しました。

すると、EventBridge ルールにマッチして SNS トピックに通知が送信されます。SNS トピックのサブスクリプションに登録したメールアドレスに以下のようなスタックの失敗を知らせるメールがすぐに届きました。

{
  "version": "0",
  "id": "11bdb510-074d-69fa-6aa0-7a780e7d4818",
  "detail-type": "CloudFormation Stack Status Change",
  "source": "aws.cloudformation",
  "account": "XXXXXXXXXXXX",
  "time": "2025-06-19T12:45:36Z",
  "region": "ap-northeast-1",
  "resources": [
    "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/Main/01ab87c0-03e8-11f0-9141-0ea4b6a23d7f"
  ],
  "detail": {
    "stack-id": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/Main/01ab87c0-03e8-11f0-9141-0ea4b6a23d7f",
    "client-request-token": "update5bde2636-b335-447a-94f2-029b78e71d6d",
    "status-details": {
      "status": "UPDATE_ROLLBACK_COMPLETE",
      "detailed-status": "",
      "status-reason": ""
    }
  }
}

今回届いたのは UPDATE_ROLLBACK_COMPLETE ステータスに対するメールのみでした。つまり CREATE_FAILEDUPDATE_FAILED などの途中経過ではなく、最終的なステータスに対してのみ通知が来るということです。1回のデプロイに対して複数の通知が来ることは無いのは助かりますね。

おわりに

CloudFormation スタックのステータスが失敗またはロールバックで終了した場合に SNS トピックに通知する EventBridge ルールを AWS CDK で作成してみました。

ちなみに今回の構成は、以下のブログで紹介されていたものを参考に、CDK で実装したものです。

https://dev.classmethod.jp/articles/format-and-notify-cloudformation-stack-failures/

また EventBridge + SNS トピックの組み合わせの CDK 実装は以下のブログで実装した時のものを参考にしました。

https://dev.classmethod.jp/articles/security-hub-findings-notification-eventbridge-rules-input-transformer-aws-cdk/

本記事がどなたかの参考になれば幸いです。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.