この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
先日、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
という属性を追加する
hoge.js
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クライアントコードのメッセージ受信イベントで、今回メッセージハンドラで追加したカスタム属性も表示するように修正します。
index.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を使ってブラックリスト/ホワイトリストを運用したり、ユーザー別にメッセージ送信件数を記録してレート制限したり請求関係に使ったりなど、夢が広がりますね。