AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

教程:将 AWS Lambda 与 Amazon DynamoDB 流结合使用

在本教程中,您将创建一个 Lambda 函数来处理来自 Amazon DynamoDB 流的事件。

先决条件

This tutorial assumes that you have some knowledge of basic Lambda operations and the Lambda console. If you haven't already, follow the instructions in 开始使用 AWS Lambda to create your first Lambda function.

To follow the procedures in this guide, you will need a command line terminal or shell to run commands. Commands are shown in listings preceded by a prompt symbol ($) and the name of the current directory, when appropriate:

~/lambda-project$ this is a command this is output

For long commands, an escape character (\) is used to split a command over multiple lines.

On Linux and macOS, use your preferred shell and package manager. On Windows 10, you can install the Windows Subsystem for Linux to get a Windows-integrated version of Ubuntu and Bash.

创建执行角色

创建执行角色,向您的函数授予访问 AWS 资源的权限。

创建执行角色

  1. 打开 IAM 控制台中的“角色”页面

  2. 选择 Create role (创建角色)

  3. 创建具有以下属性的角色。

    • Trusted entity (可信任的实体) – Lambda.

    • 权限AWSLambdaDynamoDBExecutionRole

    • 角色名称 (角色名称)lambda-dynamodb-role

AWSLambdaDynamoDBExecutionRole 具有该函数从 DynamoDB 中读取项目并将日志写入 CloudWatch Logs 所需的权限。

创建函数

以下示例代码接收 DynamoDB 事件输入并对其所包含的消息进行处理。为了展示这个过程,代码会将一些传入的事件数据写入 CloudWatch Logs。

注意

有关使用其他语言的示例代码,请参阅 示例函数代码

例 index.js

console.log('Loading function'); exports.handler = function(event, context, callback) { console.log(JSON.stringify(event, null, 2)); event.Records.forEach(function(record) { console.log(record.eventID); console.log(record.eventName); console.log('DynamoDB Record: %j', record.dynamodb); }); callback(null, "message"); };

创建函数

  1. 将示例代码复制到名为 index.js 的文件中。

  2. 创建部署程序包。

    $ zip function.zip index.js
  3. 使用 create-function 命令创建 Lambda 函数。

    $ aws lambda create-function --function-name ProcessDynamoDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs8.10 \ --role arn:aws:iam::123456789012:role/lambda-dynamodb-role

测试 Lambda 函数。

在本步骤中,您将使用 invoke AWS Lambda CLI 命令和以下示例 DynamoDB 事件手动调用您的 Lambda 函数。

例 input.txt

{ "Records":[ { "eventID":"1", "eventName":"INSERT", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"111", "SizeBytes":26, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"2", "eventName":"MODIFY", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"222", "SizeBytes":59, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"3", "eventName":"REMOVE", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "SequenceNumber":"333", "SizeBytes":38, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" } ] }

执行下面的 invoke 命令。

$ aws lambda invoke --function-name ProcessDynamoDBRecords --payload file://input.txt outputfile.txt

函数在响应正文中返回字符串消息 (代码中 context.succeed() 中的消息)。

outputfile.txt 文件中验证输出。

创建一个 DynamoDB 表(启用流)

创建一个启用了 Amazon DynamoDB 表。

创建 DynamoDB 表

  1. 打开 DynamoDB 控制台

  2. 选择 Create Table

  3. 使用以下设置创建表。

    • 表名称lambda-dynamodb-stream

    • 主键id(字符串)

  4. 选择 Create

启用流

  1. 打开 DynamoDB 控制台

  2. 选择

  3. 选择 lambda-dynamodb-stream 表。

  4. Overview (概述) 选项卡下,选择 Manage stream (管理流)

  5. 选择 Enable

记下流 ARN。在下一步中将该流与您的 Lambda 函数关联时,您将需要此类信息。有关启用流的更多信息,请参阅使用 DynamoDB 流捕获表活动

在 AWS Lambda 中添加事件源。

在 AWS Lambda 中创建事件源映射。此事件源映射将 DynamoDB 流与您的 Lambda 函数关联。创建此事件源映射后,AWS Lambda 即开始轮询该流。

运行以下 AWS CLI create-event-source-mapping 命令。命令执行后,记下 UUID。在任何命令中,如删除事件源映射时,您都需要该 UUID 来引用事件源映射。

$ aws lambda create-event-source-mapping --function-name ProcessDynamoDBRecords \ --batch-size 100 --starting-position LATEST --event-source DynamoDB-stream-arn

这会在指定的 DynamoDB 流和 Lambda 函数之间创建映射。您可将一个 DynamoDB 流关联到多个 Lambda 函数,也可将同一个 Lambda 函数关联到多个流。但是,Lambda 函数将共享它们共享的流的读取吞吐量。

您可以通过运行以下命令获取事件源映射的列表。

$ aws lambda list-event-source-mappings

该列表返回您创建的所有事件源映射,而对于每个映射,它都显示 LastProcessingResult 等信息。该字段用于在出现任何问题时提供信息性消息。No records processed(指示 AWS Lambda 未开始轮询或流中没有任何记录)和 OK(指示 AWS Lambda 已成功读取流中的记录并调用了您的 Lambda 函数)等值表示未出现任何问题。如果出现问题,您将收到一条错误消息。

如果您有大量事件源映射,请使用函数名称参数缩窄结果范围。

$ aws lambda list-event-source-mappings --function-name ProcessDynamoDBRecords

测试设置

测试端到端体验。执行表更新时,DynamoDB 会将事件记录写入流。AWS Lambda 轮询该流时,它将在流中检测新记录并通过向该函数传递事件来代表您执行 Lambda 函数。

  1. 在 DynamoDB 控制台中,添加、更新、删除表中的项目。DynamoDB 会将这些操作记录写入流。

  2. AWS Lambda 轮询该流,当检测到流有更新时,它会通过传递在流中发现的事件数据来调用您的 Lambda 函数。

  3. 您的函数将执行并在 Amazon CloudWatch 中创建日志。您可以验证 Amazon CloudWatch 控制台中报告的日志。