CloudFormationのスタックのイベントをEventBridgeのソースとして設定できるようになりました

EventBridgeのソースとしてCloudformationが設定できるようになったアップデートに関する記事です。
2022.08.17

皆さんこんにちは
クラメソのスジェです。
2022年7月20日にCloudFormationに関するアップデートがありました。

これからCloudFormationで作成したリソースの更新をEventBridgeのトリガーに知っていすることができます。
今回はその機能についてみてみます。

アップデート前は?

すでにCloudFormationのスタックのイベントはSNSで通知することができるようになっています。

作成後のリソース更新についてはドリフト検査で確認できました。

アップデート後

AWS CloudFormation ベースのスタックとリソースに対する変更を、Amazon EventBridge のイベント通知として利用できるようになりました。これらのイベント通知を使用して、疎結合のイベント駆動型アプリケーションを構築およびスケールできます。ポーリング用のカスタムコードの記述が不要になり、ポーリングが空の結果を返した場合のコンピューティングコストを節約できます。- アップデートニュース

スタックやリソースの更新をAWS Eventbridgeのトリガーとして設定できるようになりましたので、更新事項を定期的に確認する必要がなくなったし、このような更新をトリガーとして他リソースの作業もさせるようになりました。

やってみる

EventBridgeでルールを作成する際、イベントソースとしてAWS CloudFormation を指定すると完了です。 コンソール基準で詳細な説明は下記の通りです。今回は通知を受信するターゲットをAWS SNSとして作成します。

  1. AWS EventBridgeにアクセスします。
  2. サイドバーの「ルール」メニューで「ルールを作成」をクリックして新しいルールを作成します。
  3. 名前、説明を記入し、ルールタイプは「イベントパターンを持つルール」をチェックします。
  4. イベントソースはイメージのように設定します。必要な監視内容に応じてイベントタイプを選びます。私はすべてのイベントを受信するように設定しました。受信するイベントごとにフォーマットに差がありますので、イベントタイプごとにルールを作成することをお勧めします。書くイベントタイプの概要は下記の通りです。
    • Resource status Change : 基本リソースのプロパティを変更するスタックで実行されたアップデート
    • Stack status Change : ユーザによってプロビジョニングされたスタックのステータスが変更されるアップデート
    • Drift detection status Change : スタックのドリフト検出アップデート
    • イベントタイプの詳細な説明は公式ドキュメントをご参照ください
  5. イベントを受信するターゲットを設定します。
  6. タグを設定してから、全体の設定値を検討します。問題なければ作成します。

するとイメージのように作成されます。

比べてみよう

CloudFormationの通知と比べてみます。
結論からお話ししますと下記の通りです。

  • CloudFormationの通知はスタックのステータスに関する内容だけ受信される
  • EventBridge - SNSの通知はスタック以外に更新されたリソースなどの情報も受信される
  • EventBridgeで通知を受信する場合はメッセージのフォーマットが必要

スタックアップデート

スタックにタグを追加したら受信される通知を見てみます。

  • CloudFormationの通知
    StackId='arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3'
    Timestamp='2022-08-02T09:16:51.583Z'
    EventId='d8188db0-1243-11ed-913d-0e3662eb906b'
    LogicalResourceId='testtt'
    Namespace='------------'
    PhysicalResourceId='arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3'
    PrincipalId='------------------------:------------'
    ResourceProperties='null'
    ResourceStatus='UPDATE_COMPLETE'
    ResourceStatusReason=''
    ResourceType='AWS::CloudFormation::Stack'
    StackName='testtt'
    ClientRequestToken='Console-UpdateStack-208c2505-8a64-0721-4b82-13c7ba9a2253'

スタックのステータスが更新されるたびに通知が受信されます。スタックに関する内容だけ受信されます。

  • EventBridgeの通知
    {
    "version":"0",
    "id":"ed4fcedc-8247-f247-b124-d22d04ce2c0e",
    "detail-type":"CloudFormation Stack Status Change",
    "source":"aws.cloudformation",
    "account":"------------",
    "time":"2022-08-02T09:16:51Z",
    "region":"ap-northeast-1",
    "resources":[
    "arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3"
    ],
    "detail":{
    "stack-id":"arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3",
    "client-request-token":"Console-UpdateStack-208c2505-8a64-0721-4b82-13c7ba9a2253",
    "status-details":{
    "status":"UPDATE_COMPLETE","status-reason":""
    }
    }}

同様にスタックのステータスが更新されたら通知が受信されます。また、EventBridgeの通知内容も受信されました。
EventBridgeで作成したルールの「ターゲット」- 「追加設定」-「ターゲット入力を設定」でメッセージのフォーマットを変更しないと、1行にすべてのメッセージが受信されます。
それで1つのルールですべてのイベントを受信するように設定すると入力フォーマットを修正するのがややこしくなります。

リソース変更

スタックの作成したEC2インスタンスのタイプを更新した後、受信される通知を見てみます。

  • CloudFormationの通知

「スタック更新」と同じくスタックのステータスに関して通知が受信されます。

  • EventBridgeの通知
    {
    "version":"0",
    "id":"2c8def39-9ce8-4f4a-2621-57d8312f3c18",
    "detail-type":"CloudFormation Resource Status Change",
    "source":"aws.cloudformation","account":"------------",
    "time":"2022-08-02T09:16:48Z","region":"ap-northeast-1",
    "resources":[
    "arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3"
    ],
    "detail":{
    "stack-id":"arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3",
    "logical-resource-id":"WebServerInstance",
    "physical-resource-id":"i-010fecf3-------",
    "resource-type":"AWS::EC2::Instance",
    "client-request-token":"Console-UpdateStack-208c2505-8a64-0721-4b82-13c7ba9a2253",
    "status-details":{
    "status":"UPDATE_COMPLETE","status-reason":""}
    }}

今回はすべてのイベントを受信するように設定しましたので、スタックのステータス更新以外にも更新されたリソースの情報も受信されました。
どんなリソースが更新されたのかは確認できましたが、更新された設定値は確認できません。

ドリフト変更

最後にスタックで作成したインスタンスのタイプをコンソールで更新した後、ドリフト検出をやってみます。

  • CloudFormationの通知

何の通知も受信されませんでした。

  • EventBridgeの通知
    {
    "version":"0",
    "id":"072a0155-9894-5567-a4c8-eee9977a6031",
    "detail-type":"CloudFormation Drift Detection Status Change",
    "source":"aws.cloudformation",
    "account":"------------",
    "time":"2022-08-02T09:41:59Z",
    "region":"ap-northeast-1",
    "resources":[
    "arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3"
    ],
    "detail":{
    "stack-id":"arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3",
    "stack-drift-detection-id":"5adbb6c0-1247-11ed-a0c6-06d70e0e53bd",
    "status-details":{
    "stack-drift-status":"",
    "detection-status":"DETECTION_IN_PROGRESS"
    },
    "drift-detection-details":{
    "drifted-stack-resource-count":-1
    }
    }}

    「リソース更新」と同様にスタックのステータス以外にもドリフトに関する内容も受信されます。

まとめ

今回は単純にSNSをターゲットとしてメッセージを確認しましたが、EventBridgeのトリガーを利用して様々な応用ができると思いました。

お読みいただきありがとうございます。
誤字脱字、内容フィードバックはいつもありがとうございます。must01940 gmailでお願いします。