亚马逊AWS官方博客

如何部署使用 Amazon Chime 开发工具包构建的实时事件解决方案

在本教程中,我将说明如何部署交互式实时事件解决方案。通过该解决方案,演讲者可以向大量预选观众进行演示,主持人可以筛选参加广播的与会者。这个使用 Amazon Chime 开发工具包构建的交互式实时事件解决方案能应对传统在线会议平台应用于实时广播事件时的许多不足,包括出席人数限制、访问控制和参与者筛选。

这不仅是运行实时事件的可行解决方案、是构建自己的事件应用程序的起点,而且还是 Amazon Chime 开发工具包复杂用例的示例,涉及多个会议以及与其他 AWS 服务的集成。GitHub 存储库 amazon-chime-live-events 中提供了此解决方案的代码和详细的技术文档。该代码依据 Apache 许可证 2.0 获得许可。

公司、政界人士和其他公众人物举行大型聚会,并点名举手的观众提问。组织举办活动,多位演讲者轮流面向数千人进行演讲。该解决方案使您可以在线上处理这些类型的事件。

可以应用此解决方案的其他场景:

  • 问答式会议,例如市政厅。
  • 召开私人广播会议,而无需与会者创建账户。
  • 现场表演后结识名人的 VIP 体验。
  • 一个有很多观众和几个活跃参与者(例如音乐家和嘉宾演讲者)的远程仪式。

团队会议。

解决方案功能

该解决方案包含三种不同的用户体验:与会者应用程序、主持人应用程序和人才应用程序。

  • 与会者是将观看实时事件的人员。创建实时事件时,可以指定哪些与会者可以举手提问。
  • 主持人看到与会者的问题,并负责通过一对一采访来审查与会者。主持人控制将哪些与会者提升到实时广播中。
  • 人才通常是事件的主题。他们在广播的实时会议中,并且能够与进出实时会议的其他人进行交互。

主持实时事件的典型流程如下:

  • 通过触发 AWS Lambda 测试事件来生成实时事件,测试事件会从您上传到 Amazon Simple Storage Service (Amazon S3) 的 CSV 文件中读取与会者主持人人才的列表。
  • Lambda 函数会生成唯一的加入链接,以使用您喜欢的传递机制(例如电子邮件)分发给所有参与者。
  • 主持人在开始时间之前登录事件,并帮助设置人才。
  • 主持人开始广播。
  • 在广播期间,与会者单击举手按钮向主持人提交问题。

主持人登录。

  • 主持人将他们正考虑加入实时广播的与会者排成一队,并逐一采访它们。

主持人一对一采访。

  • 选定的与会者被置于虚拟休息室中,他们可以在其中观看实时广播并等待上线。
  • 主持人会在将与会者提升到实时广播时对其进行介绍,以便他们与人才或其他实时广播参与者进行交谈或互动。

主持人介绍与会者。

架构

该解决方案分为四个不同的 Web 应用程序,每个 Web 应用程序都构建为 HTML、JavaScript 和 CSS 资产的单独集合。四个应用程序是上述三个用户体验(与会者主持人人才),以及用作事件广播源的第四个应用程序。

每个应用程序都使用适用于 JavaScript 的 Amazon Chime 开发工具包和网络浏览器的 WebRTC 堆栈来加入视频会议。这些应用程序是在 React 中构建的无服务器单页应用程序,并使用 Amazon CloudFrontAWS Lambda@Edge 从 Amazon S3 提供服务。Lambda@Edge 用于根据请求 URL 确定要返回的 HTML 文件 — /attendee 将返回 attendee.html 文件。

实时会议架构。

为这些应用程序提供支持的后端堆栈遵循标准的无服务器架构。它使用 Amazon API Gateway 路由到各种 AWS Lambda 函数,这些函数访问 Amazon DynamoDB 以实现持久状态管理,并使用 Amazon Chime API 来管理视频会议。

该解决方案还使用 API Gateway 的 WebSocket API 提供双向消息传递,从而:

  • 将与会者的举手情况发送给主持人。
  • 使主持人可以远程控制与会者和人才音频和视频。
  • 传达关于何时将与会者添加到实时广播源中或将其从中删除的信息。

实时事件 Web 架构详细信息。

该解决方案的最后一部分是用于广播事件的堆栈。该堆栈在 Amazon Elastic Container Service (Amazon ECS) 中运行 Docker 容器。在事件期间,该容器在 Firefox 中运行广播应用程序。系统将抓取屏幕并将其输出到 RTMP 终端节点。RTMP 源将转码为 HTTP 实时流 (HLS),以便在与会者的事件视图中播放。

具有 RTMP 源的 ECS 实例。

身份验证

实现解决方案平衡的身份验证/授权模型使与会者单击一下即可观看广播,确保未经充分的授权或审查,任何人都无法进入实时广播会议。它不需要用户创建账户,这意味着您可以轻松使不同组的用户参与事件。

为了能够举手,每个与会者的 URL 中必须包含一个预先生成的唯一 UUID。该 UUID 是在事件之前生成的,如后文所述。您可以选择是否公开广播以允许未经授权的与会者观看;未经授权的与会者将无法举手。

主持人和人才的 URL 中也需要包含唯一 UUID,此外,还需要在事件发生前生成附加访问密钥(等效于一次性密码)并提供给他们。登录时,系统会向他们分发一个会话令牌,向他们授予参加实时广播会议的特殊权限。该解决方案使用 AWS Key Management Service (AWS KMS) 来管理我们用于生成和验证这些会话令牌的密钥。

事件主持人登录屏幕。

访问密钥为主持人和人才进入实时广播会议提供了额外的安全保护。针对与会者的额外访问控制措施是,与会者必须先由主持人进行预筛选,然后才能加入实时会议。他们在经过筛选后将获得一个令牌,使他们能够进入实时会议的休息室。主持人可以从休息室将他们添加到实时广播中。

部署解决方案

先决条件

  • 安装 Node
  • 安装 AWS CLI 的版本 2
  • 安装 AWS SAM CLI
  • 安装并运行 Docker
  • 选择以下资源的名称:
    • 部署存储桶名称:此存储桶将用于促进部署。
    • 堆栈名称:将创建的 AWS CloudFormation 部署堆栈的名称。

配置对账户的访问权限

在您的账户中禁用对 Amazon S3 的公有访问阻止,以便在部署期间正确配置 Web 资产。有关配置此设置的说明,请阅读 Amazon S3 公有访问阻止 – 为您的账户和存储桶提供又一层保护。(您可以在部署后重新启用它。)

通过运行 aws configure 并提供访问密钥和加密密钥,将 CLI 配置为使用您的 AWS 账户。有关更多详细步骤,请阅读“配置 AWS CLI”文档

如果要限制对广播输出流的访问,则需要生成一个 CloudFront 密钥对,以对用于限制访问的凭据进行签名。这将需要 root 权限以访问您的账户。阅读“为受信任的签名者创建 CloudFront 密钥对”文档,以获取生成密钥对的说明。然后,您必须以隐私增强邮件 (PEM) 格式将密钥对的私钥部分存储到 AWS Secrets Manager 中。对于下面的部署脚本,您将需要在 Secrets Manager 中安装的密钥的密钥 ID 和 ARN。

访问存储库

该解决方案作为 amazon-chime-live-events 托管在 GitHub 上。使用以下命令克隆存储库:

git clone https://github.com/aws/amazon-chime-live-events.git  

部署解决方案

注意:如果您拥有要用于此解决方案的域名,请在部署前按照 src/backend/serverless/README.md 中的步骤配置您的域和 ACM 证书。您还需要按照 GitHub README 中的说明在部署脚本中指定您的域。

导航到 src/backend/serverless 目录:

cd src/backend/serverless

使用以下示例命令部署解决方案,将参数替换为您选择的名称:

node ./deploy.js -r us-east-1 -b live-event-deployment-bucket -s live-event-stack

您必须为脚本提供以下参数:

  -r, --region                 目标区域,默认为 'us-east-1'
  -b, --s3-bucket              用于部署的 S3 存储桶
  -s, --stack-name             CloudFormation 堆栈名称

如果您选择将广播设为私有,请将密钥 ID 和在 Secrets Manager 中安装的密钥的 ARN 分别作为 --signing-key-id--signing-key-arn 传递给 deploy.js 参数。您还应该设置 --access-duration 参数,以指定希望查看者能够访问输出流的时长。将持续时间设置为足以覆盖整个事件,再加上一些缓冲时间。它默认为一天,但是您可能希望将其限制为较短的时间段。

其他可选参数在 GitHub 上的 src/backend/serverless/README.md 中列出。

创建堆栈后,CloudFormation 将输出 CloudFront 分发名称。如果在部署过程中指定了域名,则此分发名称将以传递给部署脚本的域名作为别名:

  • CloudFrontDomainName

该脚本还将分别使用以下密钥输出与会者、主持人、人才和广播 Web 应用程序的应用程序 URL:

  • AttendeeURL
  • ModeratorURL
  • TalentURL
  • BroadcastURL

该脚本还会输出两个 MediaLive 输入终端节点,您可以使用它们向其发送广播输入流。它们接受 RTMP 格式:

  • MediaLivePrimaryEndpoint
  • MediaLiveSecondaryEndpoint

这两个输出将用于以下部分,以生成您的第一个事件:

  • GenerateEventFunction
  • CustomerImportS3Bucket

此输出是将用于启动和停止广播的 AWS Lambda 函数的名称:

  • BroadcastLambdaFunction

现在,您可以在账户中重新启用对 Amazon S3 的公有访问阻止,因为仅在部署过程中才需要该功能。有关配置此设置的说明,请阅读 Amazon S3 公有访问阻止 – 为您的账户和存储桶提供又一层保护

设置事件

要生成事件,请创建三个逗号分隔值 (CSV) 格式的文件,每个文件分别对应一种参与者类型:主持人、与会者和人才。(人才文件将只有一个姓名,因为解决方案目前仅支持一名人才参与者。) 这些 CSV 的唯一必填字段是 full_name。这是最小的 CSV 文件的内容示例:

full_name
Adam Smith Alexander Hamilton Marie Curie

将三个 CSV 文件上传到在部署脚本的输出中指定了名称的 CustomerImportS3Bucket

GenerateEventFunction 也是部署脚本的输出,它是将用于生成事件的 AWS Lambda 函数的名称。在 AWS 控制台中导航到 AWS Lambda 服务。为 GenerateEventFunction Lambda 生成一个测试事件,并指定您刚刚创建的三个 CSV 文件:

{
  "attendeesKey": "Attendees.csv", "moderatorsKey": "Moderators.csv", "talentsKey": "Talents.csv"
}

运行测试事件。

Lambda 将在您将 CSV 文件上传到的同一个 CustomerImportS3Bucket 中生成四个 JSON 文件。将有三个 JSON 文件包含适用于事件所有参与者(与会者、主持人和人才)的访问信息。还有第四个 JSON 文件,该文件将具有开始广播所需的广播 URL。

以下是所生成输出的示例:

  {
 "full_name": "John Doe", "eventId": "LiveEventSample-ke40", "attendeeId": "d59f0394-9b56-48e9-9954-b2309a617220", "access_url": "http://localhost:9001/moderator.html?aId=d59f0394-9b56-48e9-9954-b2309a617220&eId=LiveEventSample-ke40&name=John%20Doe", "access_key": "jHkbdH2TJIlGfrzcWUYtUE3J"
  }

access_url 复制到您的浏览器以访问应用程序。如果要访问主持人或人才视图,您还需要复制 access_key 以登录。您可以在不同的浏览器选项卡中以不同的参与者类型登录,从而试用交互模型。以与会者和主持人的身份登录,然后从与会者的视图发送举手。您将在主持人的屏幕中看到举手信息弹出。

开始广播

在开始广播前,您将需要启动 MediaLive 实例。在 AWS 控制台中导航到 AWS Elemental MediaLive 服务,选择以您为此解决方案创建的堆栈名称为前缀的通道,然后单击开始

通过将测试事件提交给 BroadcastLambdaFunction(其名称为部署脚本的输出),可以在事件的开始和结束时开始和停止广播。

转到 AWS 控制台,然后查找 BroadcastLambdaFunction

从设置事件时在 S3 中转储的 “broadcaster” JSON 文件中获取广播 URL。另外,获取从部署脚本 MediaLivePrimaryEndpoint 输出的 RTMP 终端节点。

使用以下结构将这两个参数放入测试事件中。然后,单击测试按钮以开始广播:

 {
   "action": "start", "meetingURL": "<your-url-to-be-broadcast>", "rtmpEndpoint": "<your-rtmp-endpoint-url>"
 }

上面命令的输出是 Amazon ECS 任务 ID。它将用于停止广播。要停止广播,请试用下面输入中的任务 ID 另外创建一个测试事件,然后单击测试按钮:

 {
 "action": "stop", "taskId": "<your-ecs-task-id-or-arn>"
 }

一段短暂的延迟(通常为 20-45 秒)后,您可以在应用程序的与会者视图中看到广播流。

停止广播后,可以停止 MediaLive 实例。导航到 AWS 控制台中的 MediaLive 服务,然后单击以您为此解决方案创建的堆栈名称为前缀的通道。单击停止

清理

为了完全避免产生将来任何费用,请在试用解决方案后删除两个 CloudFormation 堆栈创建的所有资源。

为了防止创建的事件在您的账户中运行并产生费用,请从 AccessKeys DynamoDB 表中删除所有行。