Amazon EventBridgeにイベントをパブリッシュするためのMomentoトピックの構成
Momento webhooksは、トピックをステートレスコンシューマーに接続するサーバーレスな方法です。以下は、メッセージをAmazon EventBridgeバスに載せるパブリックURLを持つAWS Lambda関数をデプロイする方法のガイドになります。
このページでは、EventBridgeとMomentoを接続するための汎用パターンを紹介します。
より具体的な例としては、DynamoDB-Momento EventBridge Demoをご覧ください! このプロジェクトでは、DynamoDB StreamsとAWS EventBridgeを使ってMomentoにライトスルーキャッシュを作成する方法を紹介します。 このアプリを使うと、DynamoDBテーブルのアイテムを作成・更新・削除し、その変更をリアルタイムにキャッシュ/トピックに反映させることができます。
Architecture
Webhookハンドラのゴールは、Momentoからの通知を可能な限り迅速かつ安全に処理することであり、最終的な宛先はAWS EventBridgeです。メッセージをバスに乗せることで、そのデータをどう扱うかの可能性が大きく広がります。メッセージは、より耐久性のあるストレージに永続化されたり、他のコンシューマーに伝搬されて、さらなるアクションを実行することもできます。
ハンドラーのインストール
プロセスを開始する前に、以下の手順に従って準備を完了してください。
- MomentoのWebhookを作成する。Webhook Destinationは、CloudFormationがデプロイされたら更新されるので、https://none.com のようなダミーの値を設定します。
- CloudFormationを実行できるAWSアカウントを設定する。CloudFormationテンプレートは以下のタスクを実行します:
- ラムダ関数のデプロイ
- 関数のIAMロールを作成
- ラムダ関数のURLを作成
- デッドレターキュー(DLQ)として機能するSQSキューを作成
- (オプション)
default
イベントバスが使用されますが、代替のイベントバスが必要な場合は、事前に作成する必要があります。
- Lambda関数のURLを含むCloudFormationの出力でMomentoのWebhookを更新
ワンクリックCloudFormationでLambda関数をデプロイ
Momentoは、リソースをデプロイするためのCloudFormationスタックを提供するだけでなく、LambdaのWebhookハンドラを構築する際の重労働を引き受けています。デプロイを開始するには、このボタンをクリックするだけです。
スタックのデプロイにはAWS Consoleへのサインインが必要です。それが完了すると、CloudFormation Create Stack画面が表示されるはずです。
インフラを立ち上げるための細かい部分はスタックがやってくれます、以下は入力が必要です。
- Stack Name: デプロイ時のスタック名。
- Parameters
- EventBridgeBus: カスタムバスを使用する場合は、ここに名前を入力します。デフォルトでは `default`` のバスが使用されます。
- MomentoSecretString: Momento がペイロ ードの署名に使用し、Webhook POST の HTTP ヘッダーの一部として送信する秘密の文字列。この秘密文字列は、Momento Webhook Consoleで利用可能です。以下の画面からコピーして、このパラメータに貼り付けます。
Momento webhookのURLを更新する
デプロイが完了したら、CloudFormationの出力からFunction URLを取り出し、MomentoコンソールのMomento webhook URLを上の画像のように更新します。以下はCloudFormation Outputの内容です:
ペイロードの検証
この Webhook ハンドラの最終的な宛先は AWS EventBridge です。EventBridgeで作業する場合、Rulesは、何がフィルタリングされ、どのターゲットにメッセージが提供されるかを決定する設定ポイントです。
Momento LambdaのWebhookハンドラは、Webhookからの各イベントを以下のような構造でEvent Busに置きます。
イベントの例
以下は、Momento webhook からトリガーされる EventBridge メッセージのペイロードのサンプルです。これはテンプレートであり、具体的な値は実装によって異なることに注意してください。
{
"version": "0",
"id": "7c7ce805-51c3-4a66-b6e0-39e4e558e6d8",
"detail-type": "sample-a#sample-a",
"source": "Momento",
"account": "252703795646",
"time": "2024-01-13T14:56:16Z",
"region": "us-west-2",
"resources": [],
"detail": {
"cache": "sample-a",
"topic": "sample-a",
"event_timestamp": 1705157775308,
"publish_timestamp": 1705157775308,
"topic_sequence_number": 2,
"token_id": "",
"text": "{\"someKey\":\"someValue\"}"
}
}