paint-brush
如何使用 Amazon IVS 聊天记录存档网络聊天消息经过@amazonivs
385 讀數
385 讀數

如何使用 Amazon IVS 聊天记录存档网络聊天消息

太長; 讀書

在上一篇文章中,我们研究了如何将 Amazon Interactive Video Service (Amazon IVS) 直播流自动录制到 Amazon Simple Storage Service (Amazon S3) 存储桶。下一步,我们将通过学习如何记录 Amazon IVS 聊天消息来提供完整的按需体验。我们可以选择 Amazon CloudWatch、Amazon Kinesis Firehose 或 Amazon S3 作为聊天记录的存储目的地。
featured image - 如何使用 Amazon IVS 聊天记录存档网络聊天消息
Amazon Interactive Video Service (IVS)  HackerNoon profile picture
0-item


使用 Amazon IVS 进行点播直播流媒体播放(3 部分系列)

1 自动录制 Amazon IVS 直播流到 S3

2 如何使用 Amazon IVS 聊天记录存档网络聊天消息

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 控制台创建日志记录配置,请单击左侧栏中的日志记录配置

Logging configurations列表页面上,单击Create logging configuration

Amazon IVS 聊天记录提供了多个用于存储记录的聊天消息的目的地。我们可以选择 Amazon CloudWatch、Amazon Kinesis Data Firehose 或 Amazon S3 作为聊天记录的存储目的地。我个人认为 CloudWatch 是最方便的目的地,因为我可以通过 CloudWatch SDK 轻松检索聊天消息,所以让我们将其用于此演示。如果您想在应用程序中使用 Amazon Kinesis Data Firehose 或 Amazon S3 作为目的地,请参阅文档


注意:在发布聊天消息和它出现在您的记录目的地之间可能会有轻微的延迟。对于 Amazon S3,延迟可能长达 5 分钟,对于 Amazon CloudWatch 和 Amazon Kinesis Data Firehose,延迟可能长达 10 秒。


要为此演示创建配置,请输入日志记录配置名称(#1),选择 CloudWatch 作为目标(#2),选择创建新的 CloudWatch 日志组(#3),然后输入日志组名称(#4) .


输入任何可选的标签,然后单击创建日志记录配置


使用 AWS 开发工具包创建日志记录配置

就像记录配置一样,我们可以利用 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)直接从编辑室页面创建全新的配置。


通过 AWS 开发工具包将日志记录配置与现有的 Amazon IVS 聊天室相关联

在生产中,您可能会使用 SDK 将您的日志记录配置与新的或现有的聊天室相关联。为此,请使用CreateRoomCommand ( docs ) 或UpdateRoomCommand ( docs )。下面是使用聊天记录配置更新现有聊天室的示例。正如预期的那样,我们需要将 ARN 作为聊天室的identifier传递,并将数组中的任何/所有聊天记录配置 ARN 传递给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 传递给UpdateRoomCommand聊天记录标识符数组将覆盖任何现有标识符,因此如果您要添加其他配置,请确保包含任何现有配置 ARN 以避免删除它们。

检索聊天记录

此时,所有发布到 Amazon IVS 聊天室的新消息都将记录到附加的日志记录配置指定的目的地。如上所述,在 CloudWatch 作为日志记录目的地的情况下,我们可以使用 CloudWatch SDK 来检索给定时间段内的聊天记录。为此,我们需要logGroupName 、开始和结束时间戳(以 Unix 时间戳格式)和logStreamNameslogStreamName 的格式为: aws/IVSChatLogs/1.0/room_[suffix of chat room ARN] 。因此,对于 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 在流式传输到通道时会将事件发送到 EventBridge 。如果您尝试检索特定 Amazon IVS 实时流的聊天记录,则可以使用流开始和结束时间。


请记住, FilterLogEventsCommand不能返回无限数量的事件。您可能必须检查FilterLogEventsCommandOutput是否存在nextToken并处理分页,如果您的时间段内的事件多于 SDK 的单个响应所能容纳的事件数。有关详细信息,请参阅 SDK 文档


默认情况下,此操作会返回 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 聊天室的消息。在我们的下一篇文章中,我们将着眼于将自动录制的实时流和记录的聊天消息汇集在一个应用程序中,以创建合适的“点播”重播用户体验。