Lecture de flux en direct à la demande avec Amazon IVS (série en 3 parties) |
---|
1 Enregistrement automatique des flux en direct d'Amazon IVS sur S3 |
2 Comment archiver les messages de chat Web avec Amazon IVS Chat Logging |
3 Lecture de flux en direct Amazon IVS avec relecture de chat |
Dans notre dernier article , nous avons examiné comment enregistrer automatiquement les flux en direct d'Amazon Interactive Video Service (Amazon IVS) dans un compartiment Amazon Simple Storage Service (Amazon S3). Cette fonctionnalité est un outil puissant pour les plates-formes de contenu généré par l'utilisateur (UGC), car il s'agit de la première étape pour fournir une visualisation à la demande des flux en direct précédents dans une application. Mais une rediffusion d'un flux en direct est incomplète sans le contexte complet des discussions interactives qui se produisent parallèlement au flux. Dans cet article, nous allons passer à l'étape suivante pour fournir une expérience complète à la demande en apprenant à consigner les messages de chat Amazon IVS.
Semblable à la façon dont l'enregistrement automatique sur Amazon S3 nécessitait une configuration d'enregistrement, la journalisation du chat nécessite également une configuration qui définit les détails nécessaires pour une salle de chat. Gardez à l'esprit que vous pourriez également avoir besoin d'autorisations IAM supplémentaires en fonction de votre choix de destinations de journalisation.
Pour créer une configuration de journalisation avec la console Amazon IVS, cliquez sur Configurations de journalisation dans la barre latérale gauche.
Sur la page de liste des configurations de journalisation , cliquez sur Créer une configuration de journalisation .
La journalisation des discussions Amazon IVS offre plusieurs destinations pour le stockage des messages de discussion consignés. Nous pouvons choisir entre Amazon CloudWatch, Amazon Kinesis Data Firehose ou Amazon S3 comme destination de stockage pour vos journaux de discussion. Personnellement, je trouve que CloudWatch est la destination la plus pratique car je peux facilement récupérer les messages de chat via le SDK CloudWatch, alors utilisons-le pour cette démo. Reportez-vous à la documentation si vous souhaitez utiliser un Amazon Kinesis Data Firehose ou Amazon S3 comme destination dans votre application.
Remarque : Il peut y avoir un léger délai entre le moment où un message de chat est publié et son apparition sur votre destination de connexion. Pour Amazon S3, le délai peut aller jusqu'à 5 minutes, et pour Amazon CloudWatch et Amazon Kinesis Data Firehose, il peut aller jusqu'à 10 secondes.
Pour créer la configuration de cette démo, entrez un nom de configuration de journalisation (#1), sélectionnez CloudWatch comme destination (#2), sélectionnez Créer un nouveau groupe de journaux CloudWatch (#3) et entrez un nom de groupe de journaux (#4) .
Saisissez les balises facultatives, puis cliquez sur Créer une configuration de journalisation .
Tout comme avec les configurations d'enregistrement, nous pouvons profiter du SDK AWS pour créer nos configurations de journalisation. Étant donné que nous nous connectons à CloudWatch dans cet article, nous devrons utiliser le SDK CloudWatch Logs pour créer un groupe de journaux .
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);
Nous pouvons maintenant utiliser le client de chat Amazon IVS pour créer une configuration de journalisation ( 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);
Cela produira une sortie semblable à la suivante :
{ "$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" }
Nous pouvons également éventuellement créer une configuration de journalisation via l'AWS CLI. Encore une fois, nous devrons créer le groupe de journaux CloudWatch, puis transmettre le nom du nouveau groupe de journaux dans la configuration de journalisation du chat.
$ 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}
Nous pouvons désormais associer la configuration de journalisation à une salle de discussion Amazon IVS existante. Sélectionnez Salles sous Chat dans la barre latérale gauche, choisissez la salle à laquelle vous souhaitez associer la configuration, puis cliquez sur Modifier .
Sur la page de modification de la salle, faites défiler vers le bas et sélectionnez Enregistrer automatiquement les messages et les événements (#1). Dans la liste déroulante des configurations de journalisation (#2), recherchez et associez la configuration que nous avons créée ci-dessus. Notez que vous pouvez associer plusieurs configurations à une salle. Par conséquent, si vous souhaitez également vous connecter à Amazon Kinesis Data Firehose ou Amazon S3, vous pouvez créer des configurations distinctes et les associer à votre salle. Notez également que vous pouvez créer une toute nouvelle configuration directement depuis la page de la salle d'édition en cliquant sur le bouton Créer une configuration de journalisation (#3).
Association d'une configuration de journalisation à une salle de discussion Amazon IVS existante via le kit SDK AWS
En production, vous utiliserez probablement le SDK pour associer votre configuration de journalisation à une salle de discussion nouvelle ou existante. Pour ce faire, utilisez CreateRoomCommand
( docs ) ou UpdateRoomCommand
( docs ). Voici un exemple de mise à jour d'une salle de discussion existante avec une configuration de journalisation des discussions. Comme prévu, nous devrons transmettre l'ARN en tant identifier
de la salle de discussion, et tous les ARN de configuration de journalisation de discussion dans un tableau à 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);
Remarque : Vous pouvez spécifier plusieurs configurations de journalisation pour une salle de conversation. Cela vous permet d'utiliser plusieurs destinations, si vous le souhaitez. Le tableau d'identifiants de journalisation de chat que vous transmettez via le SDK à
UpdateRoomCommand
écrasera tous les identifiants existants, donc si vous ajoutez une configuration supplémentaire, assurez-vous d'inclure tous les ARN de configuration existants pour éviter de les supprimer.
À ce stade, tous les nouveaux messages publiés dans une salle de discussion Amazon IVS seront consignés à la ou aux destinations spécifiées par la ou les configurations de journalisation jointes. Comme mentionné ci-dessus, dans le cas de CloudWatch en tant que destination de journalisation, nous pouvons utiliser le SDK CloudWatch pour récupérer nos journaux de discussion pour une période donnée. Pour ce faire, nous avons besoin de logGroupName , de l'horodatage de début et de fin (au format d'horodatage Unix) et de logStreamNames . Le logStreamName sera au format : aws/IVSChatLogs/1.0/room_[suffix of chat room ARN]
. Ainsi, pour une salle de discussion avec un ARN de arn:aws:ivschat:us-east-1:[redacted]:room/0wgOPVl4ZRdu
, le logStreamName sera aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu
.
Voici comment utiliser CloudWatchLogsClient
pour construire un FilterLogEventsCommand
( docs ) qui est utilisé pour récupérer les journaux de discussion.
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));
Comment savoir quelle heure de début et de fin utiliser ? N'oubliez pas qu'Amazon IVS envoie des événements à EventBridge lors de la diffusion sur un canal. Vous pouvez utiliser une heure de début et de fin de flux si vous essayez de récupérer les journaux de discussion pour un flux en direct Amazon IVS spécifique.
Gardez à l'esprit que FilterLogEventsCommand
ne peut pas renvoyer un nombre infini d'événements. Vous devrez peut-être vérifier l'existence d'un nextToken
FilterLogEventsCommandOutput
et gérer la pagination si votre période comporte plus d'événements que ne peut en contenir une seule réponse du SDK. Reportez-vous à la documentation du SDK pour plus d'informations.
Par défaut, cette opération renvoie autant d'événements de journal que peut contenir 1 Mo (jusqu'à 10 000 événements de journal) ou tous les événements trouvés dans la plage de temps spécifiée. Si les résultats incluent un jeton, cela signifie qu'il y a plus d'événements de journal disponibles. Vous pouvez obtenir des résultats supplémentaires en spécifiant le jeton dans un appel ultérieur. Cette opération peut renvoyer des résultats vides alors que d'autres événements de journal sont disponibles via le jeton.
À ce stade, nous pouvons faire tout ce dont nous avons besoin avec le journal de discussion. N'oubliez pas que la journalisation des discussions enregistrera tous les événements publiés dans une salle de discussion Amazon IVS, y compris les événements personnalisés et les événements liés à la modération des discussions. Si nous voulions rejouer un flux de discussion, nous devrons probablement analyser un peu les événements pour nettoyer les messages modérés et construire un flux de messages "rejouable".
En savoir plus sur la modération du chat : Si vous ne les avez pas encore lus, consultez les articles de mon blog sur la modération automatisée et manuelle du chat avec le chat Amazon IVS.
Une fonction pour analyser les événements enregistrés peut ressembler à ceci. Votre kilométrage peut varier!
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; };
Cette fonction renverra un tableau adapté à la relecture du chat avec les messages modérés supprimés du journal de chat. Voici un petit exemple de ce à quoi pourrait ressembler le flux d'événements.
[ { "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" } ]
Dans cet article, nous avons appris à consigner les messages publiés dans une salle de discussion Amazon IVS. Dans notre prochain article, nous verrons comment rassembler des flux en direct enregistrés automatiquement et des messages de chat enregistrés dans une application pour créer une expérience utilisateur de relecture "à la demande" adaptée.