Amazon EventBridge のパートナー連携先にMomentoが正式に登録されました!
Amazon EventBridge はもともとイベントの送出先に汎用のHTTPSエンドポイントをサポートしていたため、MomentoのHTTP APIを使うことで、EventBridgeが直接Lambdaを介さずにMomento Cache や Momento Topics に値を書き込むことは可能でした。

今回EventBridgeの接続先パートナーソースとして正式にMomentoが加わったことによりその利用が加速されるものと思われます。
これを受けてMomento側ではAmazon DynamoDBと連携するウェブアプリサンプルを公開してくれています。
ただこれらのサンプルはAWS CDKを用いていたりCloudFormationスタックで必要なものが全て構築されるため、AWSに詳しくないとその構築手順などがわかりづらかったりします。(現に私も構成や設定方法を理解するのに数時間ドはまりしました・・・)
と、いうことでEventBridge から Momento Cache に値を書き込むシンプルな環境の構築手順です。
接続、APIの送信先、ルール
EventBridgeでは接続、APIの送信先、ルールの3つを用いて設定を行います。まずはこの3つの関係をおさらいしておきます。
- 接続: EventBridgeから接続するMomentoを設定しAPI Keyをセットします
- APIの送信先: Momentoに接続する際の具体的な送付先URLをセットします
- ルール: EventBridgeのバスに特定のイベントが挿入された際に、その接続を用いてどのAPIの送信先にどういうメッセージを送出するかを設定します
さっそくやってみる
ではやっていきましょう。まずは以下のものが作成されている前提です。
- Momento Cache
- API Key
不明な場合はこちらを参考にしてください。
https://zenn.dev/momentobigfun/articles/aa24ff7817e06c
接続

接続を作成をクリックします。

適当な名前を付けパートナーからMomentoを選択します。

Authorizationというキー名でAPI Key をセットし作成をクリックします。

APIの送信先
API送信先を作成をクリックします。

適当な名前を付けAPI送信先エンドポイントにhttps://api.cache.cell-ap-northeast-1-1.prod.a.momentohq.com/cache/*と入力します。

PUTを選択します。

接続タイプで先ほど作成した接続を選択し、作成をクリックします。

ルール
ルールを作成する前に適当なS3バケットを作成しておきます。全てデフォルトで問題ありません。作成されたらバケットのプロパティタブでAmazon EventBridgeをオンにしておきます。


ルールを作成をクリックします。

適当な名前を付け次へをクリックします。
イベントパターンを以下の通り設定してS3の全てのイベントでこのルールが起動するようにします。

ターゲットでは先ほど作成したMomentoを選択します。


Momento側のキャッシュの名前空間をパスパラメータとして設定します。

必ずMomento側に存在しているCacheを指定してください。

クエリ文字列パラメータを以下のようにセットします。

cacheNameが重複していることがわかります。実はパスパラメータで指定される文字列は使用されません。ただし空欄では設定できないためわかりやすいようにCacheの名前空間を入力しているだけです。
追加設定から入力で定数(JSON)を選びます。

{"message": "test"}と入力しておきます。次へを2回、ルールを更新を1回クリックします。
次にCloudshellを開いて以下を実行します。
echo "test" > testfile.txt
aws s3 cp testfile.txt s3://YOUR_BUCKET_NAME
YOUR_BUCKET_NAMEはさっき作成したS3バケットの名前にしておきます。以下の通りMomento側でメッセージが飛んできていることがわかります。

メッセージのカスタマイズ
今のテストではあらかじめセットした定数の文字列をCacheに書き込んでいますが、当然実際の利用では変数に格納された値を用います。
入力の変数画面から今度は定数(JSON)ではなく入力トランスフォーマーを選択します。

ターゲットトランスフォーマーに以下を指定します。{"message":"$.detail.object.key"}

これはEventBusに入力されたJSONからdetail.object.keyの値を抜き出してMomentoのmessageに渡す、という意味です。テンプレートには変数名であるmessageを入力します。

確認をクリックした後ルールを更新をクリックします。再度CloudshellでS3へのファイルアップロードを実行すると以下となります。

これはS3から送出される以下の値を受け取り必要な値を抜き出しMomentoのmessageにセットしています。
{
"version":"0",
"id":"9b45cb47-3952-9b23-227b-0afcfb929f13",
"detail-type":"Object Created",
"source":"aws.s3",
"account":"917561075114",
"time":"2024-08-18T09:28:07Z",
"region":"ap-northeast-1",
"resources":[
"arn:aws:s3:::r2hkameda"
],
"detail":{
"version":"0",
"bucket":{
"name":"r2hkameda"
},
"object":{
"key":"testfile.txt",
"size":5,
"etag":"d8e8fca2dc0f896fd7cb4cb0031ba249",
"sequencer":"0066C1BEA78FE1EEA0"
},
"request-id":"5Y8Q6N6WECDG8AD6",
"requester":"917561075114",
"source-ip-address":"35.74.245.234",
"reason":"PutObject"
}
}
Discussion