CloudFormtion スタックのステータスが失敗またはロールバックで終了した場合に SNS トピックに通知する EventBridge ルールを AWS CDK で作成する
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS CloudFormation によるスタックのデプロイが失敗またはロールバックで終了した場合に、通知などですぐに気づけるようにしたい場合があります。特に CI/CD パイプラインなどで自動デプロイを行っている場合、与り知らぬうちにデプロイが正常に行えない状態に陥っていた!なんてことが無いように、スタックの状態を監視できるようにしておくことが重要です。
そこで今回は、AWS CloudFormation スタックのステータスが失敗またはロールバックで終了した場合に SNS トピックに通知する EventBridge ルールを AWS CDK で作成してみました。
やってみた
CDK 実装
AWS CDK の実装コードは以下の通りです。
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 ルールを設定します。
さらに特定のステータス時にのみ通知を行うため、status-details.status
の値に失敗またはロールバックのステータスコードを指定しています。スタックステータスコードの一覧は以下のドキュメントで確認できます。
上記を 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_FAILED
や UPDATE_FAILED
などの途中経過ではなく、最終的なステータスに対してのみ通知が来るということです。1回のデプロイに対して複数の通知が来ることは無いのは助かりますね。
おわりに
CloudFormation スタックのステータスが失敗またはロールバックで終了した場合に SNS トピックに通知する EventBridge ルールを AWS CDK で作成してみました。
ちなみに今回の構成は、以下のブログで紹介されていたものを参考に、CDK で実装したものです。
また EventBridge + SNS トピックの組み合わせの CDK 実装は以下のブログで実装した時のものを参考にしました。
本記事がどなたかの参考になれば幸いです。
以上