[アップデート] CloudFormation StackSets が EventBridge を介してイベント通知できるようになりました

これでやっと自動デプロイのStackSetsがコケてないかどうか通知できるぞ
2022.11.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも、ちゃだいん(@chazuke4649)です。

AWS CloudFormation StackSets が Amazon EventBridge を介してイベント通知できるようになりました!

Build event-driven applications with AWS CloudFormation StackSets event notifications in Amazon EventBridge

何が嬉しい?

今までEventBridgeが対応していたのは、CloudFormation Stack のイベントのみで StackSets は未サポートでした。これが今回 StackSets のイベントも対応されたので、StackSetsレベルのイベント通知やイベント駆動による処理をカンタンにできるようになります。

本日、AWS CloudFormation StackSetsは、 Amazon EventBridge を介してイベント通知を開始します。CloudFormation スタック セットを作成、更新、または削除した後、イベント駆動型アクションをトリガーできます。これは、CloudFormation API を介して CloudFormation スタック セットのデプロイの変更を定期的にポーリングするカスタム ソリューションを開発または維持しなくても実現できます。今回のリリースにより、AWS CloudFormation StackSets と Amazon EventBridge を使用して、複数の AWS アカウント、組織単位 (OU)、およびリージョンにわたってイベント駆動型アプリケーションを構築できます。

対応したイベントのサンプル

CloudFormation StackSet Status Change

StackSet自体のステータスであり、ACTIVEDELETED のみ。

{
  "version": "0",
  "source": "aws.cloudformation",
  "account": "123456789012",
  "id": "12345678-1234-1234-1234-111122223333",
  "region": "us-east-1",
  "detail-type": "CloudFormation StackSet Status Change",
  "time": "2022-09-31T17:00:00Z",
  "resources": ["arn:aws:cloudformation:us-east-1:123456789012:stackset/test-stack-set"],
  "detail": {
    "stack-set-arn": "arn:aws:cloudformation:us-east-1:123456789012:stackset/test-stack-set",
    "status-details": {
      "status": "ACTIVE"
    }
  }
}

CloudFormation StackSet Operation Status Change

StackSetsで実行した各オペレーションのステータスであり、 RUNNNINGSUCCEEDED FAILED など。

{
  "version": "0",
  "source": "aws.cloudformation",
  "account": "123456789012",
  "id": "12345678-1234-1234-1234-111122223333",
  "region": "us-east-1",
  "detail-type": "CloudFormation StackSet Operation Status Change",
  "time": "2022-09-31T17:00:00Z",
  "resources": ["arn:aws:cloudformation:us-east-1:123456789012:stackset/test-stack-set"],
  "detail": {
    "stack-set-arn": "arn:aws:cloudformation:us-east-1:123456789012:stackset/test-stack-set",
    "stack-set-operation-id": "12345678-1234-1234-1234-111122223333",
    "status-details": {
      "status": "RUNNING"
    }
  }
}

CloudFormation StackSet StackInstance Status Change

StackSetsにより管理されている各スタックインスタンスのステータスであり、 CURRENTOUTDATEDPENDING など。

{
  "version": "0",
  "source": "aws.cloudformation",
  "account": "123456789012",
  "id": "12345678-1234-1234-1234-111122223333",
  "region": "us-east-1",
  "detail-type": "CloudFormation StackSet StackInstance Status Change",
  "time": "2022-09-31T17:00:00Z",
  "resources": ["arn:aws:cloudformation:us-east-1:123456789012:stackset/test-stack-set"],
  "detail": {
    "stack-set-arn": "arn:aws:cloudformation:us-east-1:123456789012:stackset/test-stack-set",
    "stack-id": "arn:aws:cloudformation:us-west-1:123456789012:stack/StackSet-test-stack-set",
    "status-details": {
      "status": "OUTDATED",
      "status-reason": "User initiated operation",
      "detailed-status": "PENDING"
    }
  }
}

Managing events with AWS CloudFormation and Amazon EventBridge - AWS CloudFormation

やってみた

とてもシンプルに、CloudFormation StackSets を実行しオペレーションのステータスが変更されたら(RUNNNING,SUCCEEDED,FAILED etc)、EventBridge経由でSNSトピックに配信しEメール通知するようにしてみます。

以下を前提とします。

  • CloudFormation StackSets は構築済み

1.SNSトピック・サブスクリプションを作成する

まず、SNSトピックを作成します。

次にメールアドレスをターゲットとして、サブスクリプションを作成します。

作成後に届いたメールの確認も忘れずに。

2.EventBridgeルールを作成する

ルールタイプは「イベントパターンを持つルール」を選択し、以下の通り入力します。

イベントソースは「AWSイベント」を選択します。

サンプルイベントで StackSet Operation Status Change の内容を確認します。

イベントパターンでは、今回特にフィルタしないため、イベントタイプのデフォルトのままで進めます。

ターゲットは先ほど作成したSNSトピックを選択します。

※後ほど、入力トランスフォーマーを使用しますが、最初はまずデフォルトの状態を確認します。

準備は以上です。

3.テストする(文面加工前)

予め作成しておいたCloudFormation StackSetsにて「ドリフトの検出」を実行します。

実行後、以下メールが届きました。

確かにオペレーションのステータスが通知されています。ですが、今のままだと見づらいので少し加工します。

4.入力トランスフォーマーの設定を追加する

EventBridgeルールのターゲットにて、入力トランスフォーマーの設定を追加します。

EventBridgeの入力トランスフォーマーの説明は割愛します。以下ブログなどを参考ください。

SecurityHubからのイベントをちょっと見やすくしてEメール通知する | DevelopersIO

今回は以下の内容とします。

入力パス

{
  "version": "$.version",
  "source": "$.source",
  "account": "$.account",
  "id": "$.id",
  "region": "$.region",
  "detail-type": "$.detail-type",
  "time": "$.time",
  "resources": "$.resources",
  "arn": "$.detail.stack-set-arn",
  "stack-set-operation-id": "$.detail.stack-set-operation-id",
  "status-details": "$.detail.status-details.status"
}

入力テンプレート

実際にメール文面に表示される構文が入力テンプレートですが、今回は特に知りたい情報(オペレーションのステータス)が見やすくなるようにし、他最低限必要な情報以外は省略しました。

"Title: <detail-type>"
  
"Status: <status-details>"
  
"Time: <time>"
"Operation ID: <stack-set-operation-id>"
"Arn: <arn>"

5.テストする(文面加工後)

再度StackSetsにて「ドリフトの検出」を実行します。

ステータスが見やすくなりましたね。

おまけ

ちなみに、SNSトピックでEメール送信するのではなく、AWS Chatbotで今回の StackSet Operation Status Changes を送信すると以下のような内容でした。

肝心のステータス内容が表示されないパターンなので、ステータス内容を含めたSlack通知したい場合は、現時点ではChatbotではない方法が良さそうです。

終わりに

今回はカンタンなイベント内容の通知だけでしたが、夢が広がる待望のアップデートだったと思います。

それでは今日はこの辺で。ちゃだいん(@chazuke4649)でした。