教程:将 AWS Lambda 与 Amazon DynamoDB 流结合使用
在本教程中,您将创建一个 Lambda 函数来处理来自 Amazon DynamoDB 流的事件。
先决条件
本教程假设您对基本 Lambda 操作和 Lambda 控制台有一定了解。如果您尚不了解,请按照开始使用 Lambda中的说明创建您的第一个 Lambda 函数。
要完成以下步骤,您需要命令行终端或 Shell 以运行命令。命令和预期输出在单独的数据块中列出:
this is a command
您应看到以下输出:
this is output
对于长命令,使用转义字符 (\
) 将命令拆分到多行中。
在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux
创建执行角色
创建执行角色,向您的函数授予访问 AWS 资源的权限。
创建执行角色
-
打开 IAM 控制台中的“角色”页面
。 -
选择 Create role (创建角色)。
-
创建具有以下属性的角色。
-
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"); };
创建函数
-
将示例代码复制到名为
index.js
的文件中。 -
创建部署程序包。
zip function.zip index.js
-
使用
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 表
-
打开 DynamoDB 控制台
。 -
选择 Create Table。
-
使用以下设置创建表。
-
表名称 –
lambda-dynamodb-stream
-
主键 –
id
(字符串)
-
-
选择 Create。
启用流
-
打开 DynamoDB 控制台
。 -
选择表。
-
选择 lambda-dynamodb-stream 表。
-
在 Overview (概述) 选项卡下,选择 Manage stream (管理流)。
-
选择 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 函数。
-
在 DynamoDB 控制台中,在表中添加、更新和删除项目。DynamoDB 会将这些操作的记录写入流。
-
AWS Lambda 轮询该流,当检测到流有更新时,它会通过传递在流中发现的事件数据来调用您的 Lambda 函数。
-
您的函数运行并在 Amazon CloudWatch 中创建日志。您可以验证 Amazon CloudWatch 控制台中报告的日志。
清除资源
如果您不想保留为本教程创建的资源,可以立即将其删除。通过删除您不再使用的 AWS 资源,可防止您的 AWS 账户产生不必要的费用。
删除 Lambda 函数
-
打开 Lambda 控制台的“函数”页面
。 -
选择您创建的函数。
-
依次选择 Actions 和 Delete。
-
选择删除。
删除执行角色
-
打开 IAM 控制台的“角色”页面
。 -
选择您创建的执行角色。
-
选择删除角色。
-
选择 Yes, delete (是,删除)。
删除 DynamoDB 表
-
打开 DynamoDB 控制台的“表”页面
。 -
选择您创建的表。
-
选择 Delete。
-
在文本框中输入
delete
。 -
选择 Delete。