如何仅在DynamoDB嵌套数组新增对象时触发AWS Lambda函数
问题
我正在为DynamoDB事件触发的AWS Lambda函数创建过滤规则,只希望当对象中databases数组新增元素时触发函数。
DynamoDB中存储的对象简化结构如下:
{ "databases": [ { "file_name": "db.ods", "upload_date": "2023-05-30T12:39:22.000Z", "url": "https://an-s3-path/db.ods" } ], "updated_at": "2023-05-30T12:38:54.000Z", "created_at": "2023-05-30T12:38:54.000Z" }
目前已配置两个过滤规则:
- 仅在记录创建或更新时触发(删除时不触发):
{ "eventName": [ "INSERT", "MODIFY" ] } - 检查
databases下的url字段存在:{ "dynamodb": { "databases": { "url": [{"exists": true}] } } }
但现在需要精准检测是否向databases数组添加了新对象,推测需要对比新旧值,但不清楚如何实现。查阅AWS官方文档后,仅找到eq、contains、exists等数值对比运算符,没有找到嵌套对象/数组变化检测的相关内容。
解决方案
要精准检测databases数组是否新增元素,需借助DynamoDB Streams事件的新旧数据镜像(OldImage、NewImage),结合过滤规则的逻辑运算符实现:
核心逻辑
- INSERT事件:新记录的
databases数组非空且包含有效URL,即视为新增数据库(因为是首次创建的记录) - MODIFY事件:对比新旧镜像中
databases数组的长度,新数组长度大于旧数组长度时,判定为新增了元素
完整过滤规则
将以下规则组合使用(过滤规则默认是逻辑AND关系,嵌套的or/and用于实现分支判断):
{ "eventName": ["INSERT", "MODIFY"], "or": [ { "and": [ {"eventName": ["INSERT"]}, {"dynamodb": {"NewImage": {"databases": {"L": [{"url": [{"exists": true}]}]}}}} ] }, { "and": [ {"eventName": ["MODIFY"]}, {"dynamodb": {"OldImage": {"databases": {"L": [{"exists": true}]}}}}, {"dynamodb": {"NewImage": {"databases": {"L": [{"url": [{"exists": true}]}]}}}}, {"dynamodb": {"NewImage": {"databases": {"L": {"size": [">", {"dynamodb": {"OldImage": {"databases": {"L": {"size": true}}}}}]}}}}} ] } ] }
规则细节解释
L是DynamoDB对数组类型(List)的标识,用于指定数组字段的类型size运算符用于获取数组的长度,通过对比新旧镜像的数组长度,判断是否有元素新增- 对于MODIFY事件,先确保新旧镜像中都存在
databases数组,避免因数组从无到有或被删除导致的判断错误 - 规则中整合了
url存在检查,确保新增的数组元素包含有效URL,匹配你之前的需求
内容的提问来源于stack exchange,提问作者Joel García
相关产品推荐
相关产品推荐

