对 DynamoDB 事件源使用事件筛选
您可以使用事件筛选,控制 Lambda 将流或队列中的哪些记录发送给函数。有关事件筛选工作原理的一般信息,请参阅 控制 Lambda 向您的函数发送的事件。
本节重点介绍 DynamoDB 事件源的事件筛选。
DynamoDB 事件
假设您有一个 DynamoDB 表,其中包含主键 CustomerName
、属性 AccountManager
和 PaymentTerms
。下面显示了来自 DynamoDB 表流的示例记录。
{ "eventID": "1", "eventVersion": "1.0", "dynamodb": { "ApproximateCreationDateTime": "1678831218.0", "Keys": { "CustomerName": { "S": "AnyCompany Industries" }, "NewImage": { "AccountManager": { "S": "Pat Candella" }, "PaymentTerms": { "S": "60 days" }, "CustomerName": { "S": "AnyCompany Industries" } }, "SequenceNumber": "111", "SizeBytes": 26, "StreamViewType": "NEW_IMAGE" } } }
要根据 DynamoDB 表中的键和属性值进行筛选,请使用记录中的 dynamodb
键。以下部分提供了不同筛选条件类型的示例。
使用表键进行筛选
假设您希望函数仅处理主键 CustomerName
为“AnyCompany Industries”的记录。FilterCriteria
对象将如下所示。
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }" } ] }
为了更清楚起见,以下是在纯 JSON 中展开的筛选条件 Pattern
的值。
{ "dynamodb": { "Keys": { "CustomerName": { "S": [ "AnyCompany Industries" ] } } } }
您可以使用控制台、AWS CLI 或 AWS SAM 模板添加筛选条件。
使用表格属性进行筛选
借助 DynamoDB,您还可以使用 NewImage
和 OldImage
键来筛选属性值。假设您要筛选最新表格图像中 AccountManager
属性为“Pat Candella”或“Shirley Rodriguez”的记录。FilterCriteria
对象将如下所示。
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }" } ] }
为了更清楚起见,以下是在纯 JSON 中展开的筛选条件 Pattern
的值。
{ "dynamodb": { "NewImage": { "AccountManager": { "S": [ "Pat Candella", "Shirley Rodriguez" ] } } } }
您可以使用控制台、AWS CLI 或 AWS SAM 模板添加筛选条件。
使用布尔表达式进行筛选
您也可以使用布尔 AND 表达式创建筛选器。这些表达式可能同时包含表的键和属性参数。假设您想要筛选 AccountManager
的 NewImage
值为“Pat Candella”且 OldImage
值为“Terry Whitlock”的记录。FilterCriteria
对象将如下所示。
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } }" } ] }
为了更清楚起见,以下是在纯 JSON 中展开的筛选条件 Pattern
的值。
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } }, "dynamodb": { "OldImage": { "AccountManager": { "S": [ "Terry Whitlock" ] } } } }
您可以使用控制台、AWS CLI 或 AWS SAM 模板添加筛选条件。
注意
DynamoDB 事件筛选不支持使用数字运算符(数字相等和数字范围)。即使表中的项目存储为数字,这些参数也会转换为 JSON 记录对象中的字符串。
使用 Exists 运算符
鉴于 DynamoDB 中 JSON 事件对象的结构方式,使用 Exists 运算符需要特别小心。Exists 运算符仅适用于事件 JSON 中的叶节点,若筛选条件模式使用 Exists 来测试中间节点,则不会起作用。请考虑以下 DynamoDB 表项目:
{ "UserID": {"S": "12345"}, "Name": {"S": "John Doe"}, "Organizations": {"L": [ {"S":"Sales"}, {"S":"Marketing"}, {"S":"Support"} ] } }
您可能需要创建如下所示的筛选条件模式来测试包含 "Organizations"
的事件:
{ "dynamodb" : { "NewImage" : { "Organizations" : [ { "exists": true } ] } } }
不过,此筛选条件模式永远不会返回匹配项,因为 "Organizations"
不是叶节点。以下示例展示了如何正确使用 Exists 运算符来构造所需的筛选条件模式:
{ "dynamodb" : { "NewImage" : {"Organizations": {"L": {"S": [ {"exists": true } ] } } } } }
用于 DynamoDB 筛选的 JSON 格式
要正确筛选 DynamoDB 源中的事件,数据字段及其筛选条件 (dynamodb
) 都必须为有效的 JSON 格式。如果任一字段不为有效的 JSON 格式,Lambda 将会丢弃消息或引发异常。下表汇总了具体行为:
传入数据格式 | 数据属性中的筛选条件模式格式 | 导致的操作 |
---|---|---|
有效 JSON |
有效 JSON |
Lambda 根据您的筛选条件进行筛选。 |
有效 JSON |
数据属性中没有筛选条件模式 |
Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。 |
有效 JSON |
非 JSON |
Lambda 在事件源映射创建或更新时引发异常。数据属性的筛选条件模式必须为有效的 JSON 格式。 |
非 JSON |
有效 JSON |
Lambda 将丢弃记录。 |
非 JSON |
数据属性中没有筛选条件模式 |
Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。 |
非 JSON |
非 JSON |
Lambda 在事件源映射创建或更新时引发异常。数据属性的筛选条件模式必须为有效的 JSON 格式。 |