メインコンテンツまでスキップ

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です。メッセージをバスに乗せることで、そのデータをどう扱うかの可能性が大きく広がります。メッセージは、より耐久性のあるストレージに永続化されたり、他のコンシューマーに伝搬されて、さらなるアクションを実行することもできます。

Webhook architecture

ハンドラーのインストール

プロセスを開始する前に、以下の手順に従って準備を完了してください。

  1. MomentoのWebhookを作成する。Webhook Destinationは、CloudFormationがデプロイされたら更新されるので、https://none.com のようなダミーの値を設定します。
  2. CloudFormationを実行できるAWSアカウントを設定する。CloudFormationテンプレートは以下のタスクを実行します:
    • ラムダ関数のデプロイ
    • 関数のIAMロールを作成
    • ラムダ関数のURLを作成
    • デッドレターキュー(DLQ)として機能するSQSキューを作成
    • (オプション) default イベントバスが使用されますが、代替のイベントバスが必要な場合は、事前に作成する必要があります。
  3. Lambda関数のURLを含むCloudFormationの出力でMomentoのWebhookを更新

ワンクリックCloudFormationでLambda関数をデプロイ

Momentoは、リソースをデプロイするためのCloudFormationスタックを提供するだけでなく、LambdaのWebhookハンドラを構築する際の重労働を引き受けています。デプロイを開始するには、このボタンをクリックするだけです。CloudFormation One-Click

スタックのデプロイにはAWS Consoleへのサインインが必要です。それが完了すると、CloudFormation Create Stack画面が表示されるはずです。

CloudFormation Create

インフラを立ち上げるための細かい部分はスタックがやってくれます、以下は入力が必要です。

  • Stack Name: デプロイ時のスタック名。
  • Parameters
    • EventBridgeBus: カスタムバスを使用する場合は、ここに名前を入力します。デフォルトでは `default`` のバスが使用されます。
    • MomentoSecretString: Momento がペイロードの署名に使用し、Webhook POST の HTTP ヘッダーの一部として送信する秘密の文字列。この秘密文字列は、Momento Webhook Consoleで利用可能です。以下の画面からコピーして、このパラメータに貼り付けます。

Momento Webhook Secret

Momento webhookのURLを更新する

デプロイが完了したら、CloudFormationの出力からFunction URLを取り出し、MomentoコンソールのMomento webhook URLを上の画像のように更新します。以下はCloudFormation Outputの内容です:

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\"}"
}
}

イベントの構造

EventBridge メッセージのプロパティを、それらが提供する機能とともに以下に示します。

detail-type

detail-type は、キャッシュとトピック・ソースに基づいてメッセージをフィルタリングするために使用されます。Webhook ハンドラは複数の Webhook のための単一のゲートウェイとして使用できるので、特定の値を特定のターゲットに送るために EventBridge でフィルタリングすると便利です。この値は常に {cache-name}#{topic-name} の形式で連結された文字列となり、Webhook ペイロードから取得されます。動的な値の真ん中にある # に注意してください。

ソース

送信元は常に Momento となります。このプロパティはメッセージの発信元を決定するのに役立ちます。

詳細

メッセージの詳細には、ウェブフックから提供された実際のペイロードが含まれます。メッセージから要素を削除しないことで、最大限の詳細がすべての消費アプリケーションに提供されます。参考までに、Momento webhook のペイロードフィールドは ここに記述されています。

検討事項

このLambda webhookハンドラーをデプロイする際に考慮しなければならない実装の詳細が2つあります。

  1. ハンドラは公開されたタイムスタンプが60秒より古いリクエストを拒否 するように設計されている。これは、リプレイ攻撃 においてハンドラに古いメッセージを送りつけることを防ぐのに役立ちます。
  2. Lambda関数は、ARM64とGravitonチップセット用に構築されたAmazon Managed Linux 2環境にデプロイされています。Rust用に構築されたAWS SDKを使用して、Rustからネイティブにコンパイルされています。

EventBridgeバスにパブリッシュするWebhookハンドラーを使えば、拡張性は無限大です。純粋にサーバーレスの実装を活用することで、リソースは必要に応じて拡張され、メッセージが消費されない場合のコストは0ドルです。