您可以使用事件筛选,控制 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" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }
使用表格属性进行筛选
借助 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 模板添加筛选条件。
要使用控制台添加此筛选条件,请按照 将筛选条件附加到事件源映射(控制台) 中的说明,为筛选条件输入以下字符串。
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }
使用布尔表达式进行筛选
您也可以使用布尔 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" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }
注意
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 格式。 |