Amazon Web Services ブログ

新情報 – Amazon EventBridge スキーマレジストリが一般公開



Amazon EventBridge は、アプリケーションを簡単に接続できるようにするサーバーレスイベントバスです。AWS サービスのデータ、独自のアプリケーション、Software-as-a-Service (SaaS) パートナーとの統合を使用できます。昨年の re:Invent では、EventBridge スキーマレジストリと検出のプレビューで、イベントの構造 (スキーマ) を中央に保存する方法を導入しました。また、Java、Python、Typescript 用にイベントを処理するコードを生成することにより、コード内のイベントの使用を簡素化しました。

本日より、EventBridge スキーマレジストリが一般公開され、リソースポリシーのサポートが追加されたことをお知らせいたします。リソースポリシーにより、異なる AWS アカウントと組織間でスキーマリポジトリを共有できます。このようにして、異なるチームの開発者は、別のチームが共有レジストリに追加したスキーマを検索して使用できます。

EventBridge スキーマレジストリリソースポリシーの使用
企業は、一般的にさまざまなサービスに取り組んでいるさまざまな開発チームを抱えています。より具体的な例を示すために、互いに通信を行う必要があるサービスに取り組んでいる 2 つのチームを見てみましょう。

  • CreateAccount 開発チームは、ウェブ/モバイルクライアントからリクエストを受信して、会社の新しい顧客アカウントを作成するフロントエンド API に取り組んでいます。
  • FraudCheck 開発チームは、新しく作成されたアカウントのデータをチェックするバックエンドサービスに取り組み、それらが偽物であるリスクを推定します。

各チームは、独自の AWS アカウントを使用してアプリケーションを開発しています。 EventBridge を使用すれば、次のアーキテクチャを実装できます。

  • フロントエンドの CreateAccount アプリケーションは、Amazon API Gateway を使用して、Python で記述された AWS Lambda 関数を使ってリクエストを処理します。新しいアカウントが作成されると、Lambda 関数はカスタムイベントバスACCOUNT_CREATED イベントを発行します。
  • バックエンドの FraudCheck Lambda 関数は Java で作成されており、ACCOUNT_CREATED イベントを受信して Amazon Fraud Detector (re:Invent のプレビューで導入したフルマネージドサービス) を呼び出して、偽のアカウントであるリスクを推定します。リスクが特定のしきい値を超えている場合、Lambda 関数は予防措置を実行します。たとえば、データベースでアカウントに偽のフラグを立てたり、イベントバスに FAKE_ACCOUNT イベントを投稿したりできます。

2 つのチームが作業を調整して、イベントの構文を認識し、EventBridge を使用してそれらのイベントを処理するコードを生成する方法がありますか?

最初に、会社の組織内でアクセス許可を持つカスタムイベントバスが作成されます。

次に、CreateAccount チームは、EventBridge スキーマ検出を使用して、サービスが公開している ACCOUNT_CREATED イベントのスキーマを自動的に入力します。このイベントには、作成されたばかりのアカウントのすべての情報が含まれています。

イベント駆動型アーキテクチャでは、サービスが関心のある特定のタイプのイベントにサブスクライブできます。ACCOUNT_CREATED イベントを受信するために、イベントバス上にルールが作成され、それらのイベントを FraudCheck 関数に送信します。

CreateAccount チームは、リソースポリシーを使用して、FraudCheck チーム AWS アカウントに対して、検出されたスキーマへの読み取り専用アクセスを提供します。このポリシーのプリンシパルは、アクセス許可を取得する AWS アカウントです。リソースは、共有されているスキーマレジストリです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "GiveSchemaAccess",
      "Effect": "Allow",
      "Action": [
        "schemas:ListSchemas",
        "schemas:SearchSchemas",
        "schemas:DescribeSchema",
        "schemas:DescribeCodeBinding",
        "schemas:GetCodeBindingSource",
        "schemas:PutCodeBinding"
      ],
      "Principal": {
        "AWS": "123412341234"
      },
      "Resource": [
        "arn:aws:schemas:us-east-1:432143214321:schema/discovered-schemas",
        "arn:aws:schemas:us-east-1:432143214321:schema/discovered-schemas*"
      ]
    }
  ]
}

これで、FraudCheck チームは、検出されたスキーマのコンテンツで ACCOUNT_CREATED イベントを検索できます。リソースポリシーを使用すれば、アカウントや組織全体でレジストリを使用できるようになりますが、コンソールに自動的に表示されることはありません。共有レジストリにアクセスするには、FraudCheck チームが AWS コマンドラインインターフェイス (CLI) を使用して、レジストリの完全な ARN を指定する必要があります。

aws schemas search-schemas \
    --registry-name arn:aws:schemas:us-east-1:432143214321:registry/discovered-schemas \
    --keywords ACCOUNT_CREATED

このようにして、FraudCheck チームは CreateAccount チームによって作成されたスキーマの正確な名前を取得します。

{
    "Schemas": [
        {
            "RegistryName": "discovered-schemas",
            "SchemaArn": "arn:aws:schemas:us-east-1:432143214321:schema/discovered-schemas/CreateAccount@ACCOUNT_CREATED",
            "SchemaName": “CreateAccount@ACCOUNT_CREATED",
            "SchemaVersions": [
                {
                    "CreatedDate": "2020-04-28T11:10:15+00:00",
                    "SchemaVersion": 1
                }
            ]
        }
    ]
}

FraudCheck チームはスキーマ名を使用して、スキーマの内容を説明できます。

aws schemas describe-schema \
    --registry-name arn:aws:schemas:us-east-1:432143214321:registry/discovered-schemas \
    --schema-name CreateAccount@ACCOUNT_CREATED

結果は、OpenAPI 仕様を使用したスキーマを示しています。

{
    "Content": "{\"openapi\":\"3.0.0\",\"info\":{\"version\":\"1.0.0\",\"title\":\"CREATE_ACCOUNT\"},\"paths\":{},\"components\":{\"schemas\":{\"AWSEvent\":{\"type\":\"object\",\"required\":[\"detail-type\",\"resources\",\"detail\",\"id\",\"source\",\"time\",\"region\",\"version\",\"account\"],\"x-amazon-events-detail-type\":\"CREATE_ACCOUNT\",\"x-amazon-events-source\":\”CreateAccount\",\"properties\":{\"detail\":{\"$ref\":\"#/components/schemas/CREATE_ACCOUNT\"},\"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\"}}},\"CREATE_ACCOUNT\":{\"type\":\"object\",\"required\":[\"firstName\",\"surname\",\"id\",\"email\"],\"properties\":{\"email\":{\"type\":\"string\"},\"firstName\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"surname\":{\"type\":\"string\"}}}}}}",
    "LastModified": "2020-04-28T11:10:15+00:00",
    "SchemaArn": "arn:aws:schemas:us-east-1:432143214321:schema/discovered-schemas/CreateAccount@CREATE_ACCOUNT",
    "SchemaName": “CreateAccount@ACCOUNT_CREATED",
    "SchemaVersion": "1",
    "Tags": {},
    "Type": "OpenApi3",
    "VersionCreatedDate": "2020-04-28T11:10:15+00:00"
}

FraudCheck チームは AWS コマンドラインインターフェイス (CLI) を使用して、まだ作成されていない場合は put-code-binding コマンドを使用してコードバインディングを作成し、コードバインディングをダウンロードしてそのイベントを処理できます。

aws schemas get-code-binding-source \
    --registry-name arn:aws:schemas:us-east-1:432143214321:registry/discovered-schemas \
    --schema-name CreateAccount@ACCOUNT_CREATED \
    --language Java8 CreateAccount.zip

FraudCheck チームのもう 1 つのオプションは、検出されたスキーマのコンテンツをコピーして貼り付け (JSON 文字列のエスケープを解除した後)、AWS アカウントに新しいカスタムスキーマを作成することです。

スキーマが独自のアカウントにコピーされると、FraudCheck チームは AWS Toolkit IDE プラグインを使用してスキーマを表示し、コードバインディングをダウンロードして、IDE から直接サーバーレスアプリケーションを生成できます。 EventBridge チームは、別のアカウントのスキーマレジストリを使用する機能を AWS Toolkit に追加するための作業を行っています。この作業により、このステップがより簡単になります。ご期待下さい!

多くの場合、お客様は、異なる AWS アカウントを持つ特定のチームにイベントバスの管理を任せています。この投稿では簡素化するために CreateAccount チームが EventBridge イベントバスを構成するチームだと想定しました。より多くのアカウントを使用すると、IAM を使用してアクセス許可を簡素化し、AWS Organizations での AWS アカウントのグループとリソースを共有できます。

今すぐご利用いただけます
EventBridge スキーマレジストリが、バーレーン、ケープタウン、ミラノ、大阪、北京、寧夏を除くすべての商用リージョンで利用できるようになりました。スキーマレジストリ向けのリソースポリシーの使用方法については、ドキュメントをご覧ください

スキーマレジストリリソースポリシーを使用すれば、イベント駆動型アーキテクチャで情報を共有するさまざまなチームの作業を非常に簡単に調整できます。

この機能を使って、何を構築しようと考えているか、ぜひ教えてください。

Danilo