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

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

清除资源

如果您不想保留为本教程创建的资源,可以立即将其删除。通过删除您不再使用的 AWS 资源,可防止您的 AWS 账户产生不必要的费用。

删除 Lambda 函数

  1. 打开 Lambda 控制台的“函数”页面

  2. 选择您创建的函数。

  3. 依次选择 ActionsDelete

  4. 选择删除

删除执行角色

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

  2. 选择您创建的执行角色。

  3. 选择删除角色

  4. 选择 Yes, delete (是,删除)

删除 DynamoDB 表

  1. 打开 DynamoDB 控制台的“表”页面

  2. 选择您创建的表。

  3. 选择 Delete

  4. 在文本框中输入 delete

  5. 选择 Delete