Amazon Event BridgeのSchema Registryのコードバインディングを試してみた

Amazon Event BridgeのSchema Registryにイベントデータのコードバインディングがあるので試してみます。今回は自作のJSON形式からスキーマが生成できるので、自作のJSONを取り込んでからコードバインディングを使用してみます。
2020.04.30

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

はじめに

CX事業本部東京オフィスの佐藤智樹です。

「Amazon Event BridgeのSchema Registryでイベントのスキーマ定義のJSONとコードバインディングできるソースの作成が自動でできる」そんな話をServerlessMeetupかどこかで聞きました。これがあれば新しいAWSサービスやAPIとLambdaを繋ぐ際に毎回スキーマ定義やイベントの型定義を書くのから開放されますとの触れ込みでした。

BlackBeltでの紹介は以下のスライドの80ページ付近です。

何がどこまでできるか分からないので試しに使ってみます。今回の記事はAmazon Event BridgeのBlackBeltを読んでSchema Registryのコードバインディングについて気になっていた人やLambdaのイベントをコードで定義する時「スキーマ定義とコードバインディング自動生成されたら楽じゃね?」と思った人の参考になるようにどこまでできそうなのか簡単に操作して確かめたいと思います。

作成方法としてはSaaSと連携用の生成済みスキーマを使用するか独自のスキーマを生成することでコードバインディングをダウンロードすることができます。本記事では独自のJSONからスキーマを作成して自動生成されるコードバインディングのソースを使用してみます。

Amazon Event Bridgeについて

Amazon EventBridge は、独自のアプリケーション、統合 Software-as-a-Service (SaaS) アプリケーション、および AWS のサービスからのデータを使用して、アプリケーションを簡単に接続することを可能にするサーバーレスイベントバスです。EventBridge は、Zendesk、Datadog、Pagerduty などのイベントソースからリアルタイムデータのストリームを配信し、そのデータを AWS Lambda などのターゲットにルーティングします。

Amazon EventBridge (サーバーレスイベントバスでアプリ同士を簡単に接続) | AWS

上記の通り、SaaSからのイベントや独自のアプリからのイベントをLambdaにルーティングやイベントのパースができるサービスです。その中でSchema RegistryはEventBridge内でやりとりされるデータのスキーマを管理できる機能です。Schema Registryの1機能として提供されているのがコードバインディング用のソース提供です。使用しているスキーマ定義をダウンロードできたりイベント定義のクラスファイルを使用したりできます。

JSONからスキーマの生成

データバインディングを使うため独自のSchema Registry を生成します。以下の画面から「スキーマを作成」を選択します。

するとスキーマ作成画面に入るので、「新規スキーマレジストリ」で適当な名前で作成し、スキーマ名にも適当な名前を入力します。

次に以下のように「JSONから検出」を選択します。任意のJSONを貼り付けて「スキーマを検出」を押下すると画面右側のスキーマ定義が自動生成されます。

ちなみに貼り付けたJSONがこちら

{
  "uuid":"3f8bcd7a-9a35-43fa-9845-0a6a9c21d51d",
  "sub":"entry",
  "myNumber":12345
}

出力されたスキーマ定義がこちらです。イベント配下をajvなどのスキーマバリデータで使えそうです。

{
  "openapi": "3.0.0",
  "info": {
    "version": "1.0.0",
    "title": "Event"
  },
  "paths": {},
  "components": {
    "schemas": {
      "Event": {
        "type": "object",
        "required": ["sub", "myNumber", "uuid"],
        "properties": {
          "myNumber": {
            "type": "number"
          },
          "sub": {
            "type": "string"
          },
          "uuid": {
            "type": "string"
          }
        }
      }
    }
  }
}

最後に右下にある「作成」ボタンを押せば完了です。

コードバインディングのダウンロード

作成後スキーマ画面に作成した「schema-sample」ができています。まずこのスキーマをクリックします。

画面に「コードバインディングのダウンロード」があるのでこちらをクリックします。

言語選択の画面が出るので今回はTypeScrptを選択してファイルをダウンロードします。

セットアップ

ダウンロードしたファイルを見ると「schema」というディレクトリがあるのでVScodeで開きます。

中のEvent.tsというファイルがコードバインディング用のファイルです。中身は以下のようなクラスファイルです。

export class Event {
  'myNumber': number;
  'sub': string;
  'uuid': string;

    private static discriminator: string | undefined = undefined;

    private static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
        {
            "name": "myNumber",
            "baseName": "myNumber",
            "type": "number"
        },
        {
            "name": "sub",
            "baseName": "sub",
            "type": "string"
        },
        {
            "name": "uuid",
            "baseName": "uuid",
            "type": "string"
        }    ];

    public static getAttributeTypeMap() {
        return Event.attributeTypeMap;
    }
}

TypeScriptを使用するため以下のコマンドで「tsconfig.json」を生成します。

$ tsc --init

コードバインディングを試す

適当にコードバインディングを試す用のファイル「CodeBindingSample.ts」を作成します。そこへ以下のようにコードを打ち込みます。

import {Event} from './Event'
const event = new Event();

これで準備ができたので以下のように打つとコードバインディングがでます。

また型情報に一致しない場合(今回はmyNumberが数値型)はエラーがでるので型チェックができます。

感想

まだ出たばかりの機能なので機能紹介自体は割とあっさり目の紹介になりました。コードバインディングに関して普段はTypeScriptでLambdaを使用する場合だと以下のようにInterfaceで型定義をしてeventに型当てはめてコードバインディングしています。なので、自動生成されるコードも以下のようなInterfaceの方が良いのではと個人的には思いました。

export interface Event {
  uuid: string;
  sub: string;
  myNumber: number;
}

上記の項目数ぐらいなら問題ないですが複雑なスキーマ階層を必須項目意識しながら定義するのは地味に時間がかかるので、いろんなプロジェクトで毎回書く必要が無くなるのは良いかなと思います。

後今回触れませんでしたが、生成されたファイルの中にあるmarshallerのディレクトリは何に使って良いのか分からなかったので紹介できませんでした。どう使ってもらいたい機能なのか動画でもブログでも良いので情報が欲しい…

Schema Registry自体はこれからの機能なので今後も変更があればウォッチしていきたいと思います。

参考

ブログなどの情報がほぼ無いので以下の動画を参考にしました。