本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:将 Amazon Lambda 与 Amazon DynamoDB Streams 结合使用
在本教程中,您将创建 Lambda 函数处理来自 Amazon DynamoDB Streams 的事件。
先决条件
本教程假设您对 Lambda 基本操作和 Lambda 控制台有一定了解。如果您还没有了解,请按照 使用控制台创建 Lambda 函数 中的说明创建您的第一个 Lambda 函数。
要完成以下步骤,您需要 Amazon Command Line Interface(Amazon CLI)版本 2。在单独的数据块中列出了命令和预期输出:
aws --version
您应看到以下输出:
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
对于长命令,使用转义字符 (\
) 将命令拆分为多行。
在 Linux 和 macOS 中,可使用您首选的 shell 和程序包管理器。
注意
在 Windows 中,操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令(例如 zip
)。安装 Windows Subsystem for Linux
创建执行角色
创建执行角色,向您的函数授予访问 Amazon 资源的权限。
创建执行角色
-
在 IAM 控制台中,打开 Roles(角色)页面
。 -
选择创建角色。
-
创建具有以下属性的角色。
-
Trusted entity(可信任的实体)– Lambda。
-
权限 — AWSLambdaDynamoDBExecutionRole.
-
Role name(角色名称)–
lambda-dynamodb-role
。
-
AWSLambdaDynamoDBExecutionRole具有该函数从 DynamoDB 读取项目并将日志写入日志所需的权限。 CloudWatch
创建函数
以下示例代码接收 DynamoDB 事件输入并对其所包含的消息进行处理。举例来说,该代码将一些传入的事件数据写入 CloudWatch 日志。
注意
有关使用其他语言的示例代码,请参阅 示例 函数代码。
例 index.mjs
console.log('Loading function'); export const handler = (event, context, callback) => { console.log(JSON.stringify(event, null, 2)); event.Records.forEach(record => { console.log(record.eventID); console.log(record.eventName); console.log(`DynamoDB Record: ${JSON.stringify(record.dynamodb)}`); }); callback(null, "message"); };
创建函数
-
将示例代码复制到名为
index.mjs
的文件中。 -
创建部署程序包。
zip function.zip index.mjs
-
使用
create-function
命令创建 Lambda 函数。aws lambda create-function --function-name ProcessDynamoDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::
111122223333
:role/lambda-dynamodb-role
测试 Lambda 函数
在本步骤中,您将使用 invoke
Amazon 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 \ --cli-binary-format raw-in-base64-out \ --payload file://input.txt outputfile.txt
如果使用 cli-binary-format 版本 2,则 Amazon CLI 选项是必需的。要将其设为默认设置,请运行 aws configure set cli-binary-format raw-in-base64-out
。有关更多信息,请参阅版本 2 的 Amazon Command Line Interface 用户指南中的 Amazon CLI 支持的全局命令行选项。
函数在响应正文中返回字符串 message
。
在 outputfile.txt
文件中验证输出。
创建启用流的 DynamoDB 表
创建启用流的 Amazon DynamoDB 表。
创建 DynamoDB 表
-
打开 DynamoDB 控制台
。 -
选择 Create Table。
-
使用以下设置创建表。
-
Table name(表名称)-
lambda-dynamodb-stream
-
Primary key(主键)–
id
(字符串)
-
-
选择创建。
启用流
-
打开 DynamoDB 控制台
。 -
选择表。
-
选择 lambda-dynamodb-stream 表。
-
在 Exports and streams(导出和流)下,选择 DynamoDB stream details(DynamoDB 流详细信息)。
-
选择启用。
-
选择 Enable stream(启用流)。
记下流 ARN。在下一步中将该流与 Lambda 函数关联时,您将需要此类信息。有关启用流的更多信息,请参阅使用 DynamoDB Streams 捕获表活动。
在 Amazon Lambda 中添加事件源
在 Amazon Lambda 中创建事件源映射。此事件源映射将 DynamoDB Streams 与 Lambda 函数关联。创建此事件源映射后,Amazon Lambda 即开始轮询该流。
运行以下 Amazon 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 Streams 和 Lambda 函数之间创建映射。您可将一个 DynamoDB Streams 关联到多个 Lambda 函数,也可将同一个 Lambda 函数关联到多个流。但是,Lambda 函数将共享其所共享的流的读取吞吐量。
您可以通过运行以下命令获取事件源映射的列表。
aws lambda list-event-source-mappings
该列表返回您创建的所有事件源映射,而对于每个映射,它都显示 LastProcessingResult
等信息。该字段用于在出现任何问题时提供信息性消息。No records processed
(指示 Amazon Lambda 未开始轮询或流中没有任何记录)和 OK
(指示 Amazon Lambda 已成功读取流中的记录并已调用 Lambda 函数)等值表示未出现任何问题。如果出现问题,您将收到一条错误消息。
如果您有大量事件源映射,请使用函数名称参数缩窄结果范围。
aws lambda list-event-source-mappings --function-name ProcessDynamoDBRecords
测试设置
测试 end-to-end 体验。当您更新表时,DynamoDB 会将事件记录写入流。当 Amazon Lambda 轮询该流时,它将在流中检测新记录并通过向该函数传递事件来代表您调用 Lambda 函数。
-
在 DynamoDB 控制台中,添加、更新、删除表中的项目。DynamoDB 会将这些操作记录写入流。
-
Amazon Lambda 会轮询该流,当检测到流有更新时,它会通过传递在流中发现的事件数据来调用 Lambda 函数。
-
您的函数在 Amazon 中运行并创建日志 CloudWatch。您可以验证在 Amazon CloudWatch 控制台中报告的日志。
清除资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入
delete
,然后选择删除。
删除执行角色
-
打开 IAM 控制台的角色页面
。 -
选择您创建的执行角色。
-
选择删除。
-
在文本输入字段中输入角色名称,然后选择删除。
删除 DynamoDB 表
-
打开 DynamoDB 控制台中 Tables page
(表页面)。 -
选择您创建的表。
-
选择 Delete(删除)。
-
在文本框中输入
delete
。 -
选择 Delete table (删除表)。