Amazon EventBridgeのSchema Registryのクロスアカウントのイベント検出を試してみた

2021.09.26

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

どうも!西村祐二です。

少し前になりますが、2021/9/3にAmazon EventBridgeに下記のアップデートがありました。

このアップデートによりイベントバスに公開されたクロスアカウントイベントの検出をサポートするようになりました。

Schema Registryについては下記ブログを参考にしてください。

どんな場面で嬉しい?

このアップデートによりイベント構造やスキーマを一元的に管理しやすくなります。

これにより、マルチアカウントのイベント駆動のアーキテクチャの構築や、別のアカウントから送信されたイベントのスキーマの検出が容易になります。組織内の開発者は誰でも、レジストリ内のイベントを検索してアクセスできます。レジストリでは、コードバインディングを生成することにより、コード内のオブジェクトとしてイベントとやり取りできます。好みの IDE のスキーマレジストリと対話して、コードの検証や自動補完などの機能を利用できます。

試してみる

Schema Registryのクロスアカウントイベント検出の設定方法について、ですがこのアップデートに関するドキュメントの更新はないようで、イベントバスに他アカウントからのイベントを受け付ける設定以外、特に設定は必要ない?ようです。

ドキュメント履歴-AmazonEventBridge

何か勘違いしていたら申し訳ないです。こっそり教えて下さい。

Schema Registryのリソースポリシーに何も設定しなくても大丈夫でした。

事前準備

下記のブログを参考に他アカウントからイベントバスに対してイベントを発行できるようにしておきます。

イベントバスの設定

今回、「cross-account」というイベントバスを作成しています。

また、Schema discoveryの機能を有効にしておきます。

リソースポリシーに外部アカウントからイベント発行できるように設定しておきます。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "allow_account_to_put_events",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::<外部AWSアカウントID>:root"
    },
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:ap-northeast-1:<自AWSアカウントID>:event-bus/cross-account"
  }]
}

このイベントバスに対して他アカウントからイベントを発行して、イベントのスキーマを検知するという流れになります。

ルール設定

今回、動作確認が目的なので外部アカウントから発行されたイベントをすべて、Lambdaで受けてログに出力するというものを設定しています。

これでEventBridge側の準備は完了です。

作成したイベントバスに外部AWSアカウントからイベントを発行

作成したイベントバスに対してイベント発行するための簡単なスクリプトを用意しました。

下記スクリプトをイベントバスで受け付けるように設定した外部のAWSアカウントをプロファイルに設定した後に実行します。

run.py

import json
import boto3

EVENT_BUS = "arn:aws:events:ap-northeast-1:<AWSアカウントID>:event-bus/cross-account"
events = boto3.client("events")

def get_payload():
    eventDetail = {
        "id": "test",
        "user_metadata": {"test": "test"},
    }
    return {
        "EventBusName": EVENT_BUS,
        "Detail": json.dumps(eventDetail),
        "DetailType": "testType",
        "Source": "testSource",
    }


def put_events(payload):
    res = events.put_events(Entries=payload)
    print(res)


def main():
    payload = get_payload()
    put_events([payload])


if __name__ == "__main__":
    main()
$ export AWS_PROFILE=${awsProfile}
$ python run.py

イベント検知

しばらく待つと、発行したイベントのスキーマを検知してくれます。

実際に検知し登録されたスキーマデータは下記のようになっていました。

きちんと発行したイベントのスキーマに沿って情報が登録されていました。

{
  "openapi": "3.0.0",
  "info": {
    "version": "1.0.0",
    "title": "TestType"
  },
  "paths": {},
  "components": {
    "schemas": {
      "AWSEvent": {
        "type": "object",
        "required": ["detail-type", "resources", "detail", "id", "source", "time", "region", "version", "account"],
        "x-amazon-events-detail-type": "testType",
        "x-amazon-events-source": "testSource",
        "properties": {
          "detail": {
            "$ref": "#/components/schemas/TestType"
          },
          "account": {
            "type": "string"
          },
          "detail-type": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "resources": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "source": {
            "type": "string"
          },
          "time": {
            "type": "string",
            "format": "date-time"
          },
          "version": {
            "type": "string"
          }
        }
      },
      "TestType": {
        "type": "object",
        "required": ["user_metadata", "id"],
        "properties": {
          "user_metadata": {
            "$ref": "#/components/schemas/User_metadata"
          },
          "id": {
            "type": "string"
          }
        }
      },
      "User_metadata": {
        "type": "object",
        "required": ["test"],
        "properties": {
          "test": {
            "type": "string"
          }
        }
      }
    }
  }
}

VSCodeから検知したイベントスキーマを利用

検知したスキーマはVSCode上で問題なく利用できました。

利用しているプラグインのAWS Toolkitは下記ドキュメントを参照ください。

さいごに

Amazon EventBridge スキーマレジストリのクロスアカウントのイベント検出を試してみました。

特段、難しい設定は不要でイベントバスに他アカウントからのイベントを受け付けるようにするだけでスキーマを登録してくれました。

他アカウントからのイベントのスキーマも登録されるようになってより使いやすくなったのではないでしょうか。

誰かの参考になれば幸いです。

初めてSchema discoveryの機能を試して気づいたところ、今後に期待したいところ(2021/09/26現在)

今回、初めてSchema discoveryの機能を触ってみました。

備忘録兼ねて、個人的に気づいたところ、今後に期待したいところを羅列しておきます。

  • 登録されたスキーマを削除するときバージョンを一つ一つ削除していかないといけない

  • スキーマを連続して更新すると想定と違ったスキーマで登録されていることがある

  • イベント発行する際は同一リージョンでないとエラーなる

  • イベント検知までのタイムラグが大きい時がある

  • デバックが難しい、イベント検知されなかったときどこが間違ってるのか特定が難しい

参考サイト

Sending and Receiving Custom Events with AWS EventBridge Schema Registry | by Dunith Dhanushka | Event-driven Utopia | Medium