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

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

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

先决条件

本教程假设您对基本 Lambda 操作和 Lambda 控制台有一定了解。如果尚不了解,请按照开始使用 AWS Lambda中的说明创建您的第一个 Lambda 函数。

为了遵循本指南中的步骤,您需要命令行终端或外壳,以便运行命令。命令显示在列表中,以提示符 ($) 和当前目录名称(如果有)开头:

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

对于长命令,使用转义字符 (\) 将命令拆分到多行中。

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

创建执行角色

创建执行角色,向您的函数授予访问 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 nodejs12.x \ --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

函数在响应正文中返回字符串 message

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 控制台中报告的日志。