AWS Lambda DynamoDB触发器过滤规则未生效的原因排查
我的配置与问题
通过AWS控制台为DynamoDB触发器添加了以下JSON过滤规则:
- 规则1:
{"eventName": [ "MODIFY" ]}
- 规则2:
{"dynamodb":{"NewImage":{"answer":{"S":["Example"]}}}}
- 检查
answer字段存在的规则:
{"dynamodb":{"NewImage":{"answer":[{"exists":true}]}}}
实际运行中发现,当answer字段值不是'Example',或者该字段根本不存在时,Lambda还是会被触发。
以下是部分触发事件示例:
{ "Records": [ { "eventID": "....", "eventName": "MODIFY", "eventVersion": "1.1", "eventSource": "aws:dynamodb", "awsRegion": "eu-central-1", "dynamodb": { "ApproximateCreationDateTime": 1661168370, "Keys": { "id": { "S": "...." } }, "NewImage": { "createdAt": { "S": "2022-08-22T09:52:39.891Z" }, "answer": { "S": "AUT" }, ....
可能的失效原因
1. 字符串匹配语法错误
规则2里,你用{"S":["Example"]}来匹配字符串值,但DynamoDB过滤规则中,字符串类型的匹配直接写字符串值即可,不需要用数组包裹。正确写法应该是:
{"dynamodb":{"NewImage":{"answer":{"S":"Example"}}}}
错误的数组写法会导致规则无法正确匹配实际事件中的单字符串值,甚至可能因为语法错误让规则直接失效,允许所有事件通过。
2. 字段存在性检查语法错误
检查answer字段存在的规则写法有误,正确的存在性检查是把{"exists": true}作为字段的值,而不是用数组包裹。正确写法:
{"dynamodb":{"NewImage":{"answer":{"exists":true}}}}
数组包裹的写法不符合规则语法,会导致过滤逻辑失效。
3. 多规则逻辑关系理解错误
如果是在控制台添加了多条独立规则,要注意:多条规则之间是OR关系,不是AND。也就是说,只要满足任意一条规则,事件就会触发Lambda。
比如你同时加了规则1(仅过滤MODIFY事件)和规则2(匹配answer=Example),那么所有MODIFY事件都会触发Lambda——因为规则1已经满足了,规则2相当于没起作用。
如果需要同时满足「是MODIFY事件」且「answer字段存在且值为Example」,必须把所有条件合并到同一个规则里:
{ "eventName": [ "MODIFY" ], "dynamodb": { "NewImage": { "answer": { "S": "Example", "exists": true } } } }
4. 控制台配置时的JSON转义问题
在AWS控制台输入规则时,如果手动输入的是带有HTML转义字符的JSON(比如你示例里的"),会导致规则解析错误。必须输入标准的JSON格式,直接用双引号,不要转义。
5. 触发器配置未生效
修改过滤规则后,可能需要等待1-2分钟让配置同步生效。另外要检查触发器状态是否为「启用」,有没有重新关联Lambda函数时出现配置错误。
内容的提问来源于stack exchange,提问作者Chris

