您可以使用事件筛选,控制 Lambda 将流或队列中的哪些记录发送给函数。有关事件筛选工作原理的一般信息,请参阅 控制 Lambda 向您的函数发送的事件。
本节重点介绍 Amazon MSK 事件源的事件筛选。
Amazon SQS 事件筛选基础知识
假设 Amazon SQS 队列包含以下 JSON 格式的消息。
{
"RecordNumber": 1234,
"TimeStamp": "yyyy-mm-ddThh:mm:ss",
"RequestCode": "AAAA"
}
此队列的示例记录将如下所示。
{
"messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
"receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
"body": "{\n "RecordNumber": 1234,\n "TimeStamp": "yyyy-mm-ddThh:mm:ss",\n "RequestCode": "AAAA"\n}",
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1545082649183",
"SenderId": "AIDAIENQZJOLO23YVJ4VO",
"ApproximateFirstReceiveTimestamp": "1545082649185"
},
"messageAttributes": {},
"md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue",
"awsRegion": "us-west-2"
}
要根据 Amazon SQS 消息的内容进行筛选,请使用 Amazon SQS 消息记录中的 body
键。假设您只想处理 Amazon SQS 消息中 RequestCode
为“BBBB”的记录。FilterCriteria
对象将如下所示。
{
"Filters": [
{
"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"
}
]
}
为了更清楚起见,以下是在纯 JSON 中展开的筛选条件 Pattern
的值。
{
"body": {
"RequestCode": [ "BBBB" ]
}
}
您可以使用控制台、AWS CLI 或 AWS SAM 模板添加筛选条件。
要使用控制台添加此筛选条件,请按照 将筛选条件附加到事件源映射(控制台) 中的说明,为筛选条件输入以下字符串。
{ "body" : { "RequestCode" : [ "BBBB" ] } }
假设您希望函数只处理 RecordNumber
大于 9999 的记录。FilterCriteria
对象将如下所示。
{
"Filters": [
{
"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"
}
]
}
为了更清楚起见,以下是在纯 JSON 中展开的筛选条件 Pattern
的值。
{
"body": {
"RecordNumber": [
{
"numeric": [ ">", 9999 ]
}
]
}
}
您可以使用控制台、AWS CLI 或 AWS SAM 模板添加筛选条件。
要使用控制台添加此筛选条件,请按照 将筛选条件附加到事件源映射(控制台) 中的说明,为筛选条件输入以下字符串。
{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
对于 Amazon SQS,消息正文可以是任何字符串。但如果您的 FilterCriteria
期望 body
为有效的 JSON 格式,则可能会导致问题。反之亦然:如果传入的消息正文为 JSON 格式,但筛选条件期望 body
为纯字符串,这可能会导致出现意外行为。
要避免此问题,请确保 FilterCriteria
中的正文格式与您从队列中收到的消息中的 body
的期望格式一致。在筛选消息之前,Lambda 会自动评估传入消息正文的格式以及 body
的筛选条件模式的格式。如果不一致,Lambda 将会删除此消息。下表汇总了此评估:
传入消息 body 格式 |
筛选条件模式 body 格式 |
导致的操作 |
---|---|---|
纯字符串 |
纯字符串 |
Lambda 根据您的筛选条件进行筛选。 |
纯字符串 |
数据属性中没有筛选条件模式 |
Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。 |
纯字符串 |
有效 JSON |
Lambda 将会丢弃消息。 |
有效 JSON |
纯字符串 |
Lambda 将会丢弃消息。 |
有效 JSON |
数据属性中没有筛选条件模式 |
Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。 |
有效 JSON |
有效 JSON |
Lambda 根据您的筛选条件进行筛选。 |