Amazon Interactive Video Service ストリームチャットのメッセージレビューハンドラをつかってみた
いわさです。
先日、Amazon IVSのストリームチャット機能をご紹介しました。
その際はメッセージレビューハンドラという機能を無効化していたのですが、本日はこちらを有効化して試してみました。
メッセージレビューハンドラ
メッセージレビューハンドラを使うことで、送信されたメッセージを配信する前に、Lambdaによるレビューハンドラーが実行されます。
この処理でメッセージやユーザーの属性をチェックし、テキストを編集やメタデータの追加、配信の許可や拒否を行うことが出来ます。
ハンドラーへのリクエストイベントは以下の形式とされています。
これらの情報を使ってカスタム処理を行います。
{ "Content": "string", "MessageId": "string", "RoomArn": "string", "Attributes": {"string": "string"}, "Sender": { "Attributes": { "string": "string" }, "UserId": "string", "Ip": "string" } }
また、ハンドラーが返却する形式は以下である必要があります。
ContentとReviewResultは必須です。
Attributesはオプションでレビューハンドラーによって属性を設定したり出来ます。
{ "Content": "string", "ReviewResult": "string", "Attributes": {"string": "string"}, }
やってみる
では実際に試してみます。
Lambda関数を用意しましょう。公式ドキュメントのサンプルはGoだったのですが、Node.jsにしました。
前述のとおり、決まった形式でレスポンスをしてやれば良いので、今回は以下を行うようにしてみました。
- テキストの
classmethod
を********
に置換する - テキストに
iwasa
が含まれていたら配信を拒否する - 全ての配信メッセージに
HogeAttribute
という属性を追加する
exports.handler = async (event) => { var result = {}; result.Content = event.Content.replace('classmethod', '***********'); result.ReviewResult = event.Content.match('iwasa') ? "DENY" : "ALLOW"; result.Attributes = {}; result.Attributes.HogeAttribute = "pass lamba" return result; };
Lambda関数作成後、IVSのルーム編集画面からメッセージハンドラを有効化しましょう。
なお、ここではLambda関数が正常に処理されなかった場合に、配信を許可するのか拒否するのかを設定します。
ここで関数を選択すると、自動でリソースベースポリシーが関数に設定されます。
前回の記事で作成したHTMLクライアントコードのメッセージ受信イベントで、今回メッセージハンドラで追加したカスタム属性も表示するように修正します。
: connection.onmessage = (event) => { const data = JSON.parse(event.data); $("#received").append("<div><div>" + data.Content + "</div><div>" + data.Attributes.HogeAttribute + "</div></div>"); }; :
テキストを普通に入力
まずは特にテキストの加工対象とならないメッセージを送信してみます。
メッセージが送信されており、レビューハンドラで追加したカスタム属性も表示されるようになりました。
テキストを置換
次はclassmethod
を含むテキストを送信してみましょう。
期待どおり置換されたテキストとなって配信されました。
テキストを拒否する
iwasa
が含まれるテキストの場合はレビューハンドラで拒否されるので、配信されないはずです。
試してみましょう。
配信されていないですね。良いですね。
さいごに
本日は、Amazon IVS ストリームチャット機能のチャットレビューハンドラ機能を試してみました。
なお、本日動作確認を行った際のevent
オブジェクトを確認してみると以下のようになっていました。
{ "MessageId": "5ELM0NzqfKuG", "Content": "ccc", "Attributes": {}, "RoomArn": "arn:aws:ivschat:us-west-2:123456789012:room/mMYeyyGX2OVt", "Sender": { "UserId": "hoge123456", "Ip": "203.0.113.1", "Attributes": {} } }
Senderから、トークンに紐づくUserIdや送信元のパブリックIPアドレスが取得出来ます。
IPアドレスやユーザーIDを使ってブラックリスト/ホワイトリストを運用したり、ユーザー別にメッセージ送信件数を記録してレート制限したり請求関係に使ったりなど、夢が広がりますね。