教程:将 Amazon Lambda 与 Amazon DocumentDB 流结合使用
在本教程中,您将创建一个基本的 Lambda 函数,该函数会消耗来自 Amazon DocumentDB(与 MongoDB 兼容)更改流的事件。要完成本教程,您需要经历以下阶段:
-
设置 Amazon DocumentDB 集群,连接到该集群,并在其上激活更改流。
-
创建 Lambda 函数,并将 Amazon DocumentDB 集群配置为函数的事件源。
-
通过将项目插入到 Amazon DocumentDB 数据库中来测试设置。
创建 Amazon DocumentDB 集群
-
打开 Amazon DocumentDB 控制台
。在集群下,选择创建。 -
使用以下配置创建集群:
-
对于集群类型,选择基于实例的集群。这是默认选项。
-
在集群配置下,确保已选择引擎版本 5.0.0。这是默认选项。
-
在实例配置下:
-
对于数据库实例类,选择内存优化类。这是默认选项。
-
对于常规副本实例数,请选择 1。
-
对于实例类,使用默认选择。
-
-
在身份验证下,输入主要用户的用户名,然后选择自行管理。输入密码,然后确认密码。
-
保留所有其他默认设置。
-
-
选择创建集群。
在 Secrets Manager 中创建密钥
在 Amazon DocumentDB 创建您的集群时,请创建一个 Amazon Secrets Manager 密钥来存储数据库凭证。在稍后的步骤中创建 Lambda 事件源映射时,您将提供此密钥。
在 Secrets Manager 中创建密钥
-
打开 Secrets Manager
控制台并选择存储新密钥。 -
对于选择密钥类型,请选择以下选项之一:
-
在基本详细信息下:
-
密钥类型:用于 Amazon DocumentDB 数据库的凭证
-
在凭证下,输入用于创建 Amazon DocumentDB 集群的相同用户名和密码。
-
数据库:选择 Amazon DocumentDB 集群。
-
选择下一步。
-
-
-
对于配置密钥,请选择以下选项之一:
-
密钥名称:
DocumentDBSecret
-
选择下一步。
-
-
选择下一步。
-
选择 Store (存储)。
-
刷新控制台以验证
DocumentDBSecret
密钥是否成功存储。
记下密钥 ARN。您将在后面的步骤中用到它。
连接到集群
使用 Amazon CloudShell 连接到 Amazon DocumentDB 集群
-
在 Amazon DocumentDB 管理控制台上的集群下,找到您创建的集群。单击集群旁边的复选框,选择您的集群。
-
选择连接到集群。将出现 CloudShell 运行命令屏幕。
-
在新环境名称字段中,输入唯一的名称,例如“test”,然后选择创建并运行。
-
出现提示时请输入密码。当提示符变成
rs0 [direct: primary] <env-name>>
时,您成功连接到您的 Amazon DocumentDB 集群。
激活更改流
在本教程中,您将跟踪对 Amazon DocumentDB 集群中 docdbdemo
数据库 products
集合的更改。您可以通过激活更改流来完成此操作。
在集群内创建新数据库
-
运行以下命令,创建名为
docdbdemo
的新数据库:use docdbdemo
-
在终端窗口中,使用以下命令将记录插入到
docdbdemo
中:db.products.insertOne({"hello":"world"})
您应看到类似如下的输出:
{ acknowledged: true, insertedId: ObjectId('67f85066ca526410fd531d59') }
-
接下来,使用以下命令激活
docdbdemo
数据库products
集合上的更改流:db.adminCommand({modifyChangeStreams: 1, database: "docdbdemo", collection: "products", enable: true});
应看到类似如下内容的输出:
{ "ok" : 1, "operationTime" : Timestamp(1680126165, 1) }
创建接口 VPC 端点
接下来,创建接口 VPC 端点,以确保 Lambda 和 Secrets Manager(稍后用于存储集群访问凭证)能够连接到默认 VPC。
创建接口 VPC 端点
-
打开 VPC 控制台
。在左侧菜单的虚拟私有云下,选择端点。 -
选择创建端点。使用以下配置创建端点:
-
对于名称标签,输入
lambda-default-vpc
。 -
对于服务类别,选择 Amazon 服务。
-
对于服务,在搜索框中输入
lambda
。选择格式为com.amazonaws.<region>.lambda
的服务。 -
对于 VPC,选择您的 Amazon DocumentDB 集群所在的 VPC。这通常是默认 VPC。
-
对于子网,选中每个可用区旁边的复选框。为每个可用区选择正确的子网 ID。
-
对于 IP 地址类型,选择 IPv4。
-
对于安全组,选择 Amazon DocumentDB 集群使用的安全组。这通常是
default
安全组。 -
保留所有其他默认设置。
-
选择创建端点。
-
-
再次选择创建端点。使用以下配置创建端点:
-
对于名称标签,输入
secretsmanager-default-vpc
。 -
对于服务类别,选择 Amazon 服务。
-
对于服务,在搜索框中输入
secretsmanager
。选择格式为com.amazonaws.<region>.secretsmanager
的服务。 -
对于 VPC,选择您的 Amazon DocumentDB 集群所在的 VPC。这通常是默认 VPC。
-
对于子网,选中每个可用区旁边的复选框。为每个可用区选择正确的子网 ID。
-
对于 IP 地址类型,选择 IPv4。
-
对于安全组,选择 Amazon DocumentDB 集群使用的安全组。这通常是
default
安全组。 -
保留所有其他默认设置。
-
选择创建端点。
-
本教程的集群设置部分到此完成。
创建执行角色
在接下来的一组步骤中,您将创建 Lambda 函数。首先,您需要创建执行角色,以向函数授予访问集群的权限。为此,您可以先创建 IAM policy,然后将此策略附加到 IAM 角色。
创建 IAM policy
-
在 IAM 控制台中打开策略页面
,然后选择创建策略。 -
选择 JSON 选项卡。在以下策略中,将语句最后一行中的 Secrets Manager 资源 ARN 替换为之前的密钥 ARN,然后将策略复制到编辑器中。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "LambdaESMNetworkingAccess", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeVpcs", "ec2:DeleteNetworkInterface", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "kms:Decrypt" ], "Resource": "*" }, { "Sid": "LambdaDocDBESMAccess", "Effect": "Allow", "Action": [ "rds:DescribeDBClusters", "rds:DescribeDBClusterParameters", "rds:DescribeDBSubnetGroups" ], "Resource": "*" }, { "Sid": "LambdaDocDBESMGetSecretValueAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "
arn:aws:secretsmanager:us-east-1:123456789012:secret:DocumentDBSecret
" } ] } -
选择下一步:标签,然后选择下一步:审核。
-
对于 Name (名称),请输入
AWSDocumentDBLambdaPolicy
。 -
选择创建策略。
创建 IAM 角色
-
在 IAM 控制台中打开角色页面
,然后选择创建角色。 -
对于选择可信实体,请选择以下选项之一:
-
可信实体类型:Amazon 服务
-
服务或使用案例:Lambda
-
选择下一步。
-
-
对于添加权限,选择刚刚创建的
AWSDocumentDBLambdaPolicy
策略以及AWSLambdaBasicExecutionRole
,以向函数授予写入 Amazon CloudWatch Logs 的权限。 -
选择下一步。
-
对于 Role name(角色名称),输入
AWSDocumentDBLambdaExecutionRole
。 -
请选择 Create role(创建角色)。
创建 Lambda 函数
本教程使用 Python 3.13 运行时系统,但我们还提供了适用于其他运行时系统的示例代码文件。您可以选择以下框中的选项卡,查看适用于您感兴趣的运行时系统的代码。
代码接收 Amazon DocumentDB 事件输入并对其所包含的消息进行处理。
创建 Lambda 函数
-
打开 Lamba 控制台的 Functions page
(函数页面)。 -
选择 Create function(创建函数)。
-
选择从头开始编写。
-
在基本信息中,执行以下操作:
-
对于函数名称,输入
ProcessDocumentDBRecords
。 -
对于运行时,选择 Python 3.13。
-
对于架构,选择 x86_64。
-
-
在更改默认执行角色选项卡中,执行以下操作:
-
展开选项卡,然后选择使用现有角色。
-
选择您之前创建的
AWSDocumentDBLambdaExecutionRole
。
-
-
选择创建函数。
要部署函数代码
-
在下框中选择 Python 选项卡并复制代码。
-
在 Lambda 控制台的代码源窗格中,将代码粘贴到代码编辑器中,替换 Lambda 创建的代码。
-
在部署部分,选择部署以更新函数的代码:
创建 Lambda 事件源映射
创建事件源映射,将 Amazon DocumentDB 更改流与 Lambda 函数相关联。创建此事件源映射后,Amazon Lambda 即开始轮询该流。
创建事件源映射
-
在 Lambda 控制台中打开函数页面
。 -
选择您之前创建的
ProcessDocumentDBRecords
函数。 -
选择配置选项卡,然后从左侧菜单中选择触发器。
-
选择添加触发器。
-
在触发器配置下,为源选择 Amazon DocumentDB。
-
使用以下配置创建事件源映射:
-
Amazon DocumentDB 集群:选择之前创建的集群。
-
数据库名称:docdbdemo
-
集合名称:产品
-
批处理大小:1
-
起始位置:最新
-
身份验证:BASIC_AUTH
-
Secrets Manager 密钥:选择 Amazon DocumentDB 集群的密钥。其名称类似于
rds!cluster-12345678-a6f0-52c0-b290-db4aga89274f
。 -
批处理时段:1
-
完整文档配置:UpdateLookup
-
-
选择添加。创建事件源映射可能需要花费几分钟的时间。
测试函数
等待事件源映射达到已启用状态。这个过程可能需要几分钟。然后,通过插入、更新和删除数据库记录来测试端到端设置。开始前的准备工作:
-
在 CloudShell 环境中重新连接到 Amazon DocumentDB 集群。
-
运行以下命令以确保使用的是
docdbdemo
数据库:use docdbdemo
在 docdbdemo
数据库的 products
集合中插入记录:
db.products.insertOne({"name":"Pencil", "price": 1.00})
通过查看 CloudWatch Logs 来验证函数是否成功处理该事件。您会看到如下日志条目:

使用以下命令更新您刚刚插入的记录:
db.products.updateOne( { "name": "Pencil" }, { $set: { "price": 0.50 }} )
通过查看 CloudWatch Logs 来验证函数是否成功处理该事件。您会看到如下日志条目:

使用以下命令删除您刚刚更新的记录:
db.products.deleteOne( { "name": "Pencil" } )
通过查看 CloudWatch Logs 来验证函数是否成功处理该事件。您会看到如下日志条目:

故障排除
如果您在函数的 CloudWatch 日志中没有看到任何数据库事件,请检查以下各项:
-
确保 Lambda 事件源映射(也称为触发器)处于已启用状态。创建事件源映射可能需要几分钟时间。
-
如果事件源映射已启用,但您仍然无法在 CloudWatch 中看到数据库事件:
-
确保事件源映射中的数据库名称设置为
docdbdemo
。 -
检查事件源映射上次处理结果字段中是否显示以下消息:“问题:连接错误。您的 VPC 必须能够连接到 Lambda 和 STS,以及 Secrets Manager(如果需要身份验证)。” 如果看到此错误,请确保您已创建 Lambda 和 Secrets Manager VPC 接口端点,并且这些端点使用与 Amazon DocumentDB 集群相同的 VPC 和子网。
-
清除资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon Web Services 账户 产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入
confirm
,然后选择删除。
删除执行角色
-
打开 IAM 控制台的角色页面
。 -
选择您创建的执行角色。
-
选择删除。
-
在文本输入字段中输入角色名称,然后选择删除。
删除 VPC 端点
-
打开 VPC 控制台
。在左侧菜单的虚拟私有云下,选择端点。 -
选择您创建的端点。
-
选择 Actions(操作)、Delete VPC Endpoint(删除 VPC 端点)。
-
在文本输入字段中输入
delete
。 -
选择删除。
删除 Amazon DocumentDB 集群
-
选择您为本教程创建的 Amazon DocumentDB 集群,并禁用删除保护。
-
在主集群页面中,再次选择 Amazon DocumentDB 集群。
-
依次选择操作、删除。
-
对于创建最终集群快照,选择否。
-
在文本输入字段中输入
delete
。 -
选择删除。
在 Secrets Manager 中删除密钥
-
选择您为本教程创建的密钥。
-
依次选择操作、删除密钥。
-
选择计划删除。