Amazon IVS を使用したオンデマンド ライブ ストリーム再生 (3 部構成) 1 Amazon IVS ライブストリームの S3 への自動記録 2 Amazon IVS チャットログを使用して Web チャットメッセージをアーカイブする方法 3 チャット リプレイを使用した Amazon IVS ライブ ストリームの再生 では、Amazon Interactive Video Service (Amazon IVS) ライブ ストリームを Amazon Simple Storage Service (Amazon S3) バケットに自動録画する方法について説明しました。この機能は、アプリケーションで以前のライブ ストリームのオンデマンド表示を提供するための最初のステップであるため、ユーザー生成コンテンツ (UGC) プラットフォームの強力なツールです。しかし、ライブ ストリームのリプレイは、ストリームと並行して発生するインタラクティブ チャットの完全なコンテキストなしでは不完全です。この投稿では、Amazon IVS チャット メッセージをログに記録する方法を学習することで、完全なオンデマンド エクスペリエンスを提供するための次のステップに進みます。 前回の投稿 ロギング構成 Amazon S3 への自動記録に記録設定が必要だったのと同様に、チャット ログにも、チャット ルームに必要な詳細を定義する設定が必要です。選択したロギング先によっては、追加の も必要になる場合があることに注意してください。 IAM アクセス許可 Amazon IVS コンソールを使用してロギング設定を作成する Amazon IVS コンソールでログ設定を作成するには、左側のサイドバーで をクリックします。 [ログ設定] リスト ページで、 をクリックします。 [ロギング構成] [ロギング構成の作成] Amazon IVS チャット ログは、ログに記録されたチャット メッセージの保存先をいくつか提供します。チャット ログの保存先として、Amazon CloudWatch、Amazon Kinesis Data Firehose、または Amazon S3 から選択できます。 CloudWatch SDK を介してチャット メッセージを簡単に取得できるため、個人的には CloudWatch が最も便利な宛先であると感じているので、このデモではそれを使用します。アプリケーションの宛先として Amazon Kinesis Data Firehose または Amazon S3 を利用する場合は、 を参照してください。 ドキュメント : チャット メッセージが投稿されてからログ出力先に表示されるまでには、わずかな遅延が生じる場合があります。 Amazon S3 の場合、遅延は最大 5 分、Amazon CloudWatch および Amazon Kinesis Data Firehose の場合、最大 10 秒です。 注 このデモの構成を作成するには、 入力し (#1)、 として CloudWatch を選択し (#2)、 選択し (#3)、 を入力します (#4)。 . ロギング構成名を 宛先 新しい CloudWatch ログ グループの作成を ログ グループ名 オプションの を入力し、 をクリックします。 タグ [Create logging configuration] AWS SDK を使用してロギング設定を作成する 設定の記録と同様に、AWS SDK を利用してログ設定を作成できます。この投稿では CloudWatch にログを記録しているため、CloudWatch Logs SDK を使用して 必要があります。 ログ グループを作成する import { CloudWatchLogsClient, CreateLogGroupCommand } from "@aws-sdk/client-cloudwatch-logs"; const cloudWatchLogsClient = new CloudWatchLogsClient(); const createLogGroupInput = { logGroupName: 'ivs-demo-chat-logging-group', }; const createLogGroupRequest = new CreateLogGroupCommand(createLogGroupInput); const createLogGroupResponse = await cloudWatchLogsClient.send(createLogGroupRequest); console.log(createLogGroupResponse); これで、Amazon IVS チャット クライアントを使用してログ設定 ( ) を作成できます。 docs import { IvschatClient, CreateLoggingConfigurationCommand } from "@aws-sdk/client-ivschat"; const ivsChatClient = new IvschatClient(); const createLoggingConfigInput = { name: 'ivs-demo-chat-logging-config-sdk', destinationConfiguration: { cloudWatchLogs: { logGroupName: 'ivs-demo-chat-logging-group' } } }; const createLoggingConfigRequest = new CreateLoggingConfigurationCommand(createLoggingConfigInput); const createLoggingConfigResponse = await ivsChatClient.send(createLoggingConfigRequest); console.log(createLoggingConfigResponse); これにより、次のような出力が生成されます。 { "$metadata": { "httpStatusCode": 200, "requestId": "[redacted]", "cfId": "[redacted]", "attempts": 1, "totalRetryDelay": 0 }, "arn": "arn:aws:ivschat:us-east-1:[redacted]:logging-configuration/[redacted]", "createTime": "2023-01-09T14:48:35.358Z", "destinationConfiguration": { "cloudWatchLogs": { "logGroupName": "ivs-demo-chat-logging-group" } }, "id": "[redacted]", "name": "ivs-demo-chat-logging-config-sdk", "state": "ACTIVE", "tags": {}, "updateTime": "2023-01-09T14:48:35.485Z" } AWS CLI を使用してログ記録設定を作成する オプションで、AWS CLI を使用してログ設定を作成することもできます。ここでも、CloudWatch ログ グループを作成し、新しいログ グループの名前をチャット ログ設定に渡す必要があります。 $ aws logs \ create-log-group \ --log-group-name ivs-demo-logging-config-log-group $ aws ivschat \ create-logging-configuration \ --name ivs-demo-logging-config \ --destination-configuration cloudWatchLogs={logGroupName=ivs-demo-logging-config-log-group} Amazon IVS コンソールを介してログ記録設定を既存の Amazon IVS チャット ルームに関連付ける ログ設定を既存の Amazon IVS チャット ルームに関連付けることができるようになりました。左側のサイドバーの で を選択し、構成を関連付けるルームを選択して、 をクリックします。 [チャット] [ルーム] [編集] ルーム編集ページで下にスクロールし、 (#1)] を選択します。 ドロップダウン (#2) で、上で作成した構成を検索して関連付けます。ルームには複数の設定を関連付けることができるため、Amazon Kinesis Data Firehose または Amazon S3 にもログを記録したい場合は、個別の設定を作成してルームに関連付けることができます。また、 ボタン (#3) をクリックして、編集ルーム ページから直接新しい構成を作成できることにも注意してください。 [メッセージとイベントを自動的にログに記録する [ログ構成] [Create logging configuration] AWS SDK を介してログ記録設定を既存の Amazon IVS チャット ルームに関連付ける 本番環境では、SDK を使用して、ロギング構成を新規または既存のチャット ルームに関連付ける可能性があります。これを行うには、 ( ) または ( ) を使用します。チャット ログ構成を使用して既存のチャット ルームを更新する例を次に示します。予想どおり、ARN をチャット ルームの として渡し、任意/すべてのチャット ログ構成 ARN を配列で に渡す必要があります。 CreateRoomCommand docs UpdateRoomCommand docs identifier loggingConfigurationIdentifiers import { IvschatClient, UpdateRoomCommand } from "@aws-sdk/client-ivschat"; const ivsChatClient = new IvschatClient(); const updateChatRoomInput = { identifier: 'arn:aws:ivschat:us-east-1:[redacted]:room/[redacted]', loggingConfigurationIdentifiers: [ 'arn:aws:ivschat:us-east-1:v:logging-configuration/[redacted]', ] }; const updateChatRoomRequest = new UpdateRoomCommand(updateChatRoomInput); const updateChatRoomResponse = await ivsChatClient.send(updateChatRoomRequest); console.log(updateChatRoomResponse); チャット ルームに対して複数のログ構成を指定できます。これにより、必要に応じて複数の宛先を使用できます。 SDK を介して に渡すチャット ロギング識別子の配列は、既存の識別子を上書きするため、追加の設定を追加する場合は、既存の設定 ARN を含めて、それらが削除されないようにしてください。 注: UpdateRoomCommand チャット ログの取得 この時点で、Amazon IVS チャット ルームに投稿されたすべての新しいメッセージは、添付されたログ設定によって指定された宛先に記録されます。前述のように、ロギング先として CloudWatch を使用する場合、CloudWatch SDK を使用して一定期間のチャット ログを取得できます。これを行うには、 、開始と終了のタイムスタンプ (Unix タイムスタンプ形式)、および が必要です。 形式になります。したがって、ARN が チャット ルームの場合、 になります。 logGroupName logStreamNames logStreamName は aws/IVSChatLogs/1.0/room_[suffix of chat room ARN] arn:aws:ivschat:us-east-1:[redacted]:room/0wgOPVl4ZRdu logStreamName は aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu CloudWatch ログに記録されたチャット メッセージの取得 を使用して、チャット ログの取得に使用される ( ) を作成する方法を次に示します。 CloudWatchLogsClient FilterLogEventsCommand docs import { CloudWatchLogsClient, FilterLogEventsCommand } from "@aws-sdk/client-cloudwatch-logs"; const cloudwatchClient = new CloudWatchLogsClient(); const filterLogEventsInput = { logGroupName: 'demo-chat-log-cw-group', logStreamNames: ['aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu'], startTime: 1672929210000, endTime: 1672929330000, }; const filterLogEventsRequest = new FilterLogEventsCommand(filterLogEventsInput); const filterLogEventsResponse = await cloudwatchClient.send(filterLogEventsRequest); const events = filterLogEventsResponse.events.map(e => JSON.parse(e.message)); に注意してください。特定の Amazon IVS ライブ ストリームのチャット ログを取得しようとしている場合は、ストリームの開始時刻と終了時刻を使用できます。 使用する開始時刻と終了時刻を知るにはどうすればよいですか? Amazon IVS は、チャネルにストリーミングするときにイベントを EventBridge に送信すること は無数のイベントを返すことができないことに注意してください。 SDK からの 1 回の応答に収まりきらないほど多くのイベントが期間にある場合は、 の存在について を確認し、ページネーションを処理する必要がある場合があります。詳細については、SDK を参照してください。 FilterLogEventsCommand nextToken FilterLogEventsCommandOutput ドキュメント デフォルトでは、この操作は 1 MB に収まる数のログ イベント (最大 10,000 ログ イベント)、または指定された時間範囲内で見つかったすべてのイベントを返します。結果にトークンが含まれている場合は、利用可能なログ イベントが他にもあることを意味します。後続の呼び出しでトークンを指定することにより、追加の結果を取得できます。この操作では、トークンを介して使用可能なログ イベントがさらにある場合でも、空の結果が返されることがあります。 この時点で、チャット ログで必要なことは何でもできます。チャット ログは、カスタム イベントやチャット モデレートに関連するイベントなど、Amazon IVS チャット ルームに投稿された ログに記録することを忘れないでください。チャット ストリームを再生したい場合は、おそらくイベントを少し解析して、モデレートされたメッセージをクリーンアップし、「再生可能な」メッセージ ストリームを構築する必要があります。 すべてのイベントを : まだ読んでいない場合は、Amazon IVS チャットを使用した および チャット モデレートに関する私のブログ投稿をチェックしてください。 チャットのモデレートの詳細 自動 手動の ログに記録されたイベントを解析する関数は、次のようになります。あなたのマイレージは異なる場合があります! const parseEvents = (events) => { let parsedEvents = []; events.forEach(e => { switch (e.type) { case 'MESSAGE': parsedEvents.push(e); break; case 'EVENT': if (e.payload.EventName === 'aws:DELETE_MESSAGE') { const existingEventIdx = parsedEvents.findIndex(parsedEvent => { return parsedEvent.payload.Id === e.payload.Attributes.MessageID }); if (existingEventIdx > -1) { parsedEvents.splice(existingEventIdx, 1); } } break; } }); return parsedEvents; }; この関数は、チャット ログからモデレートされたメッセージを削除して、チャットのリプレイに適した配列を返します。イベント ストリームがどのように見えるかの小さな例を次に示します。 [ { "event_timestamp": "2023-01-05T14:33:32.894Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "WhO6MW6iRdS5", "RequestId": "", "Attributes": { "username": "gleningp" }, "Content": "bbiab!", "SendTime": "2023-01-05T14:33:32.894089757Z", "Sender": { "UserId": "75758272-f3f2-4f65-83c5-9b8f144116b8", "Attributes": {} } }, "version": "1.0" }, { "event_timestamp": "2023-01-05T14:33:39.896Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "VwEPwPV74GN3", "RequestId": "", "Attributes": { "username": "rpeirazzia" }, "Content": "perfect", "SendTime": "2023-01-05T14:33:39.896519733Z", "Sender": { "UserId": "704D6BF8-22D2-4A52-B6A7-BDEFB115ECE5", "Attributes": {} } }, "version": "1.0" }, { "event_timestamp": "2023-01-05T14:33:47.330Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "00kqu1sPa6dF", "RequestId": "", "Attributes": { "username": "jmycroft2" }, "Content": "🔥🔥🔥", "SendTime": "2023-01-05T14:33:47.330983449Z", "Sender": { "UserId": "2F12AA2D-DF65-42CF-AE99-133A5A06F7B4", "Attributes": {} } }, "version": "1.0" } ] まとめ この投稿では、Amazon IVS チャット ルームに投稿されたメッセージをログに記録する方法を学びました。次の投稿では、自動記録されたライブ ストリームとログに記録されたチャット メッセージをアプリケーションにまとめて、適切な「オンデマンド」リプレイ ユーザー エクスペリエンスを作成する方法について説明します。