对 Amazon SQS 事件源使用事件筛选 - AWS Lambda

对 Amazon SQS 事件源使用事件筛选

您可以使用事件筛选,控制 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 模板添加筛选条件。

Console

要使用控制台添加此筛选条件,请按照 将筛选条件附加到事件源映射(控制台) 中的说明,为筛选条件输入以下字符串。

{ "body" : { "RequestCode" : [ "BBBB" ] } }
AWS CLI

要使用 AWS Command Line Interface(AWS CLI)创建包含这些筛选条件的新事件源映射,请运行以下命令。

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'

要将这些筛选条件添加到现有事件源映射中,请运行以下命令。

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
AWS SAM

要使用 AWS SAM 添加此筛选条件,请将以下代码段添加到事件源的 YAML 模板中。

FilterCriteria: Filters: - Pattern: '{ "body" : { "RequestCode" : [ "BBBB" ] } }'

假设您希望函数只处理 RecordNumber 大于 9999 的记录。FilterCriteria 对象将如下所示。

{ "Filters": [ { "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }" } ] }

为了更清楚起见,以下是在纯 JSON 中展开的筛选条件 Pattern 的值。

{ "body": { "RecordNumber": [ { "numeric": [ ">", 9999 ] } ] } }

您可以使用控制台、AWS CLI 或 AWS SAM 模板添加筛选条件。

Console

要使用控制台添加此筛选条件,请按照 将筛选条件附加到事件源映射(控制台) 中的说明,为筛选条件输入以下字符串。

{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
AWS CLI

要使用 AWS Command Line Interface(AWS CLI)创建包含这些筛选条件的新事件源映射,请运行以下命令。

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'

要将这些筛选条件添加到现有事件源映射中,请运行以下命令。

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
AWS SAM

要使用 AWS SAM 添加此筛选条件,请将以下代码段添加到事件源的 YAML 模板中。

FilterCriteria: Filters: - Pattern: '{ "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 根据您的筛选条件进行筛选。