AWS Lambda 的列表管理器示例应用程序 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS Lambda 的列表管理器示例应用程序

列表管理器示例应用程序演示了如何使用 AWS Lambda 来处理 Amazon Kinesis 数据流中的记录。Lambda 事件源映射从流中批量读取记录并调用 Lambda 函数。该函数使用记录中的信息更新 Amazon DynamoDB 中的文档,并将其处理的记录存储在 Amazon Relational Database Service (Amazon RDS) 中。

客户端将记录发送到 Kinesis 流,该流将存储记录并使其可用于处理。Kinesis 流像队列一样用于缓冲记录,直到记录可以进行处理。与 Amazon SQS 队列不同, Kinesis 流中的记录在处理后不会被删除,因此多个使用者可以处理同一数据。Kinesis 中的记录也按顺序处理,其中队列项目可无序传送。记录将在 7 天后从流中删除。

除了处理事件的函数之外,该应用程序还包含另一个函数,用于在数据库上执行管理任务。函数代码包含在以下文件中:

使用 AWS CLI 和 AWS CloudFormation 可在数分钟内部署本示例。要在您的账户中下载、配置和部署本示例,请按照 README 中的说明操作。

架构和事件结构

本示例应用程序使用以下 AWS 服务:

  • Kinesis – 接收来自客户端的事件并临时存储这些事件以供处理。

  • AWS Lambda – 从 Kinesis 流中读取并将事件发送到函数的处理程序代码。

  • DynamoDB – 存储应用程序生成的列表。

  • Amazon RDS – 将已处理记录的副本存储在关系数据库中。

  • AWS Secrets Manager – 存储数据库密码。

  • Amazon VPC – 为函数和数据库之间的通信提供私有本地网络。

定价

标准费用适用于每项服务。

该应用程序处理来自客户端的 JSON 文档,这些文档包含更新列表所需的信息。它支持两种类型的列表:计数和排名。计数 包含添加到键的当前值(如果存在)的值。为用户处理的每个条目都会增加指定表中键的值。

以下示例显示了一个增加用户 stats 列表的 xp (经验点)值的文档。

例 记录 – 计数类型

{ "title": "stats", "user": "bill", "type": "tally", "entries": { "xp": 83 } }

排名 包含条目列表,其中的值就是这些条目的排名顺序。可以使用覆盖当前值的不同值更新排名,而不是递增排名。以下示例显示了最喜爱电影的排名:

例 记录 – 排名类型

{ "title": "favorite movies", "user": "mike", "type": "rank", "entries": { "blade runner": 1, "the empire strikes back": 2, "alien": 3 } }

Lambda 事件源映射 会批量读取流中的记录并调用处理器函数。函数处理程序收到的事件包含一个对象数组,每个对象都包含有关记录的详细信息,例如接收记录的时间、有关流的详细信息以及原始记录文档的编码表示形式。

events/kinesis.json – 记录

{ "Records": [ { "kinesis": { "kinesisSchemaVersion": "1.0", "partitionKey": "0", "sequenceNumber": "49598630142999655949899443842509554952738656579378741250", "data": "eyJ0aXRsZSI6ICJmYXZvcml0ZSBtb3ZpZXMiLCAidXNlciI6ICJyZGx5c2N0IiwgInR5cGUiOiAicmFuayIsICJlbnRyaWVzIjogeyJibGFkZSBydW5uZXIiOiAyLCAidGhlIGVtcGlyZSBzdHJpa2VzIGJhY2siOiAzLCAiYWxpZW4iOiAxfX0=", "approximateArrivalTimestamp": 1570667770.615 }, "eventSource": "aws:kinesis", "eventVersion": "1.0", "eventID": "shardId-000000000000:49598630142999655949899443842509554952738656579378741250", "eventName": "aws:kinesis:record", "invokeIdentityArn": "arn:aws:iam::123456789012:role/list-manager-processorRole-7FYXMPLH7IUS", "awsRegion": "us-east-2", "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/list-manager-stream-87B3XMPLF1AZ" }, ...

解码后,数据包含一条记录。该函数使用记录来更新用户列表和存储所有用户的累积值的聚合列表。它还将事件的副本存储在应用程序的数据库中。

使用 AWS X-Ray 进行检测

该应用程序使用 AWS X-Ray 跟踪函数调用以及函数对 AWS 服务的调用。X-Ray 使用从函数接收的跟踪数据创建服务地图,以帮助您确定错误。下面的服务地图显示了与两个 DynamoDB 表和一个 MySQL 数据库进行通信的函数。

Node.js 函数在模板中配置为进行活动跟踪,在代码中将使用 适用于 Node.js 的 AWS X-Ray 开发工具包 对其进行检测。X-Ray 开发工具包会为使用 AWS 开发工具包或 MySQL 客户端发起的每次调用记录一个子分段。

该函数使用 AWS SDK for JavaScript in Node.js 读取和写入每条记录的两个表。主表存储列表名称和用户的每个组合的当前状态。聚合表存储合并来自多个用户的数据的列表。

AWS CloudFormation 模板和其他资源

该应用程序在 Node.js 模块中实现,并使用 AWS CloudFormation 模板和 shell 脚本进行部署。应用程序模板创建两个函数、Kinesis 流、DynamoDB 表和以下支持资源。

应用程序资源

  • 执行角色 – 一个 IAM 角色,授予函数访问其他 AWS 服务的权限。

  • Lambda 事件源映射 – 从数据流中读取记录并调用该函数。

在 GitHub 上查看应用程序模板

另一个模板 template-vpcrds.yml 创建 Amazon VPC 和数据库资源。虽然可以在一个模板上创建所有资源,但将其分开可以更轻松地清理应用程序,并允许数据库与多个应用程序一起重复使用。

基础设施资源

  • VPC – 一个虚拟私有云网络,其中包含私有子网、路由表和 VPC 终端节点,允许函数在没有互联网连接的情况下与 DynamoDB 进行通信。

  • 数据库 – Amazon RDS 数据库实例和将其连接到 VPC 的子网组。