Amazon Interactive Video Service ストリームチャットのメッセージレビューハンドラをつかってみた

2022.05.01

いわさです。

先日、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を使ってブラックリスト/ホワイトリストを運用したり、ユーザー別にメッセージ送信件数を記録してレート制限したり請求関係に使ったりなど、夢が広がりますね。