Amazon EventBridge のイベント記録/再生機能を使ってアカウント発行イベントを使いまわしてみた

アカウント発行イベント、使い回しませんか
2021.09.17

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

こんにちは、大前です。

Control Tower で AWS アカウントを新規発行した際の CloudWatch イベントを利用した検証をする機会があったのですが、検証の為に何回も AWS アカウントを作成するのは嫌だなぁと思っていたところ、去年あった以下のアップデートを思い出しました。

詳細は上記ブログを参照いただければと思いますが、EventBridge ではイベントを記録/再生する事ができる様になっています。

これを利用すれば検証の為に何度も AWS アカウントを作成する事が不要になりそうだったので、EventBridge のイベント記録機能を利用して、アカウント発行イベントを使いまわせるのか試してみました。

やってみた

EventBridge イベント記録の準備

まず、EventBridge でイベントを記録する為の設定を行います。

EventBridge の「アーカイブ」から、「アーカイブを作成」  

「名前」「説明」「保持期間」を指定し、「次へ」

今回はアカウント発行のイベントだけ記録できれば良いので、「イベントパターンマッチングによるイベントのフィルタリング」を選択し、「パターンビルダー」を選びます。

今回は Control Tower の Account Factory からアカウントを作成した時に発生するイベントを拾う様に設定を行います。AWS Control Tower のライフサイクルイベント - AWS Control Tower より、CreateManagedAccount が今回記録したいイベントである事がわかるので、「パターンビルダー」にて以下の設定を行い、アーカイブ設定を保存します。

  • サービスプロバイダー ... AWS
  • AWS のサービスの名前 ... Control Tower
  • イベントタイプ ... AWS Service Event via CloudTrail
  • 特定のイベント ... CreateManagedAccount

アーカイブ設定を作成後、EventBridge のルールが追加されている事が確認できます。

検証用のアクション(SNS メール送信)の設定

続いて、確認の為にイベントが発火されたら SNS 経由でメールを送信する様に設定を行います。

SNS より、「トピックの作成」

「タイプ」は "スタンダード"、「名前」を入力して作成します。

作成されたトピックを開き、「サブスクリプションの作成」

先ほど作成したトピックの ARN を選択し、「プロトコル」に "Eメール"、「エンドポイント」には自分のメールアドレスを記載しておきます。

登録したメールアドレスにメールがくるのでサブスクリプションの承認を行い、ステータスが確認済みになったことを確認します。


続いて、EventBridge の「ルールを作成」から、SNS へのメール送信を行う為のルールを作成します。

ルール名を入力

"イベントパターン" を選択し、先ほどと同様に CreateManagedAccount のイベントを指定します。

「ターゲット」に "SNS トピック" を選択し、「トピック」には上記で作成したものを指定します。

これで事前準備は完了となります。

アカウント発行イベントを発生させる

続いて、EventBridge にイベントを記録する為に、アカウントの作成を行います。

Control Tower から「Account Factory」→「アカウントの登録」

必要な情報を記入し、「アカウントの登録」を実行します。今回は "event-test" という名前のアカウントを新規作成しました。

しばらく待つと、Control Tower の管理画面上で対象のアカウントが問題なく作成された事が確認できます。

メールを確認すると、設定した通りに CreateManagedAccount イベントが SNS からメール送信されている事が確認できました。

記録された EventBridge イベントの再生

続いて、EventBridge のイベント再生機能を利用して再度 CreateManagedAccount イベントを発行できるか確認してみます。

EventBridge より「イベント」→「再生」→「新しい再生の開始」

「名前」を入力し、「ソース」には最初に作成したアーカイブ設定を指定します。

再生時間枠には、アカウント作成を実行した時刻を挟む様に設定を行い、「再生を開始」を実行します。

少し待つと、「ステータス」が "完了済み" になります。

メールを再度確認すると、再び CreateManagedAccount イベントがメール送信されている事が確認できました。

これで、アカウント発行のイベントを好きな時に再生する事ができる様になりました!

その他

本題とはそれますが、今回 CreateManaged Account イベントを 2回メールで受け取りましたが、内容が微妙に異なっていたので、備忘録として記載したいと思います。

Json の内容はほぼ同じではありますが、一部異なる部分もあるので、イベントの中身を参照する処理を行う場合は気をつけるべきポイントかもしれません。

アカウント作成を実際に実施した際のイベント

{
    "version": "0",
    "id": "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
    "detail-type": "AWS Service Event via CloudTrail",
    "source": "aws.controltower",
    "account": "000000000000",
    "time": "2021-09-17T07:27:23Z",
    "region": "ap-northeast-1",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",
        "userIdentity": {
            "accountId": "000000000000",
            "invokedBy": "AWS Internal"
        },
        "eventTime": "2021-09-17T07:27:23Z",
        "eventSource": "controltower.amazonaws.com",
        "eventName": "CreateManagedAccount",
        "awsRegion": "ap-northeast-1",
        "sourceIPAddress": "AWS Internal",
        "userAgent": "AWS Internal",
        "requestParameters": null,
        "responseElements": null,
        "eventID": "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
        "readOnly": false,
        "eventType": "AwsServiceEvent",
        "managementEvent": true,
        "recipientAccountId": "000000000000",
        "serviceEventDetails": {
            "createManagedAccountStatus": {
                "organizationalUnit": {
                    "organizationalUnitName": "Sandbox",
                    "organizationalUnitId": "ou-xxxx-xxxxxxxx"
                },
                "account": {
                    "accountName": "event-test",
                    "accountId": "000000000000"
                },
                "state": "SUCCEEDED",
                "message": "AWS Control Tower successfully created an enrolled account.",
                "requestedTimestamp": "2021-09-17T07:15:13+0000",
                "completedTimestamp": "2021-09-17T07:27:23+0000"
            }
        },
        "eventCategory": "Management"
    }
}

EventBridge のイベント再生から生成したイベント

{
    "version": "0",
    "id": "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
    "detail-type": "AWS Service Event via CloudTrail",
    "source": "aws.controltower",
    "account": "000000000000",
    "time": "2021-09-17T07:27:23Z",
    "region": "ap-northeast-1",
    "replay-name": "playback-CreateManagedAccount-01",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",
        "userIdentity": {
            "accountId": "000000000000",
            "invokedBy": "AWS Internal"
        },
        "eventTime": "2021-09-17T07:27:23Z",
        "eventSource": "controltower.amazonaws.com",
        "eventName": "CreateManagedAccount",
        "awsRegion": "ap-northeast-1",
        "sourceIPAddress": "AWS Internal",
        "userAgent": "AWS Internal",
        "eventID": "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
        "readOnly": false,
        "eventType": "AwsServiceEvent",
        "managementEvent": true,
        "recipientAccountId": "000000000000",
        "serviceEventDetails": {
            "createManagedAccountStatus": {
                "organizationalUnit": {
                    "organizationalUnitName": "Sandbox",
                    "organizationalUnitId": "ou-xxxx-xxxxxxxx"
                },
                "account": {
                    "accountName": "event-test",
                    "accountId": "000000000000"
                },
                "state": "SUCCEEDED",
                "message": "AWS Control Tower successfully created an enrolled account.",
                "requestedTimestamp": "2021-09-17T07:15:13+0000",
                "completedTimestamp": "2021-09-17T07:27:23+0000"
            }
        },
        "eventCategory": "Management"
    }
}

おわりに

EventBridge のイベント記録/再生機能を利用して、AWS アカウント発行イベントという実際の作業を何度も行うのが難しいイベントを使いまわせる様にしてみました。

イベント記録/再生の機能は知っていましたが今まで使った事がなかったので、こういった時に役に立つんだなーと学ぶ事ができ、よかったです。


以上、AWS 事業本部の大前でした。

参考