Lambda 事件筛选 - AWS Lambda

Lambda 事件筛选

您可以使用事件筛选,控制 Lambda 将流或队列中的哪些记录发送给函数。例如,您可以添加筛选条件,以便函数仅处理包含特定数据参数的 Amazon SQS 消息。事件筛选与事件源映射结合使用。您可以将筛选条件添加到以下 AWS 服务的事件源映射中:

  • Amazon DynamoDB

  • Amazon Kinesis Data Streams

  • Amazon MQ

  • Amazon Managed Streaming for Apache Kafka (Amazon MSK)

  • 自行管理的 Apache Kafka

  • Amazon Simple Queue Service(Amazon SQS)

Lambda 不支持 Amazon DocumentDB 的事件筛选。

默认情况下,您可以为单个事件源映射定义最多五个不同的筛选条件。筛选条件是使用逻辑运算符 OR 组合起来的。如果来自事件源的记录符合一个或多个筛选条件,则 Lambda 会将该记录包含在发送到函数的下一个事件中。如果不符合任何筛选条件,Lambda 会丢弃该记录。

注意

如果您需要为一个事件源定义 5 个以上的筛选条件,则可请求将每个事件源的限额提高到 10 个筛选条件。如果您尝试添加的筛选条件数量超过当前限额允许的数量,则在您尝试创建事件源时,Lambda 将会返回错误。

事件筛选基础知识

筛选条件 (FilterCriteria) 对象是一个由筛选条件 (Filters) 列表组成的结构。每个筛选条件都是一个用于定义事件筛选模式 (Pattern) 的结构。模式是 JSON 筛选条件规则的字符串表示。FilterCriteria 对象的结构如下所示。

{ "Filters": [ { "Pattern": "{ \"Metadata1\": [ rule1 ], \"data\": { \"Data1\": [ rule2 ] }}" } ] }

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

{ "Metadata1": [ rule1 ], "data": { "Data1": [ rule2 ] } }

筛选条件模式可以包括元数据属性和/或数据属性。可用元数据参数和数据参数的格式根据充当事件源的 AWS 服务 而有所不同。例如,假设事件源映射从 Amazon SQS 队列接收到以下记录:

{ "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n "City": "Seattle",\n "State": "WA",\n "Temperature": "46"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }
  • 元数据属性是包含有关创建记录的事件的信息的字段。在示例 Amazon SQS 记录中,元数据属性包括 messageIDeventSourceArnawsRegion 等字段。

  • 数据属性是包含流或队列中数据的记录的字段。在 Amazon SQS 事件示例中,数据字段的键是 body,数据属性是字段 CityStateTemperature

不同类型的事件源为其数据字段使用不同的键值。要对数据属性进行筛选,请确保在筛选条件的模式中使用正确的键。如需数据筛选键列表,并查看每个支持的 AWS 服务 的筛选模式示例,请参阅 使用具有不同 AWS 服务 的筛选条件

事件筛选可处理多层 JSON 筛选。例如,考虑以下来自 DynamoDB 流的记录片段:

"dynamodb": { "Keys": { "ID": { "S": "ABCD" } "Number": { "N": "1234" }, ... }

假设您只想处理排序键值 Number 为 4567 的记录。在这种情况下,您的 FilterCriteria 对象与以下类似:

{ "Filters": [ { "Pattern": "{ \"dynamodb\": { \"Keys\": { \"Number\": { \"N\": [ "4567" ] } } } }" } ] }

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

{ "dynamodb": { "Keys": { "Number": { "N": [ "4567" ] } } } }

处理不符合筛选条件的记录

处理不符合筛选条件的记录的方式取决于事件源。

  • 对于 Amazon SQS,如果消息不符合筛选条件,Lambda 会自动从队列中删除该消息。您无需在 Amazon SQS 中手动删除这些消息。

  • 对于 KinesisDynamoDB,在筛选条件处理记录后,流迭代器会跳过此记录。如果记录不符合筛选条件,您无需从事件源手动删除记录。保留期结束后,Kinesis 和 DynamoDB 会自动删除这些旧记录。如果您希望提前删除记录,请参阅更改数据保留期

  • 对于 Amazon MSK自行管理的 Apache KafkaAmazon MQ 消息,Lambda 会丢弃与筛选条件中包含的所有字段不匹配的消息。对于自行管理的 Apache Kafka,Lambda 在成功调用函数后,会为匹配和不匹配的消息提交偏移。对于 Amazon MQ,Lambda 在成功调用函数后确认匹配的消息,并在筛选不匹配的消息时确认此类消息。

筛选条件规则语法

对于筛选条件规则,Lambda 支持 Amazon EventBridge 规则,并使用与 EventBridge 相同的语法。有关更多信息,请参阅《Amazon EventBridge 用户指南》中的 Amazon EventBridge 事件模式

以下是可用于 Lambda 事件筛选的所有比较运算符的汇总。

比较运算符 示例 Rule syntax(规则语法)

Null

用户 ID 为空

"UserID": [ null ]

姓氏为空

"LastName": [""]

等于

名字为“Alice”

"Name": [ "Alice" ]

等于(忽略大小写)

名字为“Alice”

“Name”:[ { "equals-ignore-case": "alice" } ]

并且

位置为“纽约”,日期为“星期一”

"Location": [ "New York" ], "Day": ["Monday"]

Or

付款类型为“信用卡”或“借记卡”

"PaymentType": [ "Credit", "Debit"]

或(多个字段)

位置为“纽约”,或日期为“星期一”。

“$or”:[ { "Location": [ "New York" ] }, { "Day": [ "Monday" ] } ]

天气是除“下雨”以外的任何天气

"Weather": [ { "anything-but": [ "Raining" ] } ]

数值(等于)

价格为 100

"Price": [ { "numeric": [ "=", 100 ] } ]

数值(范围)

价格大于 10,且小于等于 20

"Price": [ { "numeric": [ ">", 10, "<=", 20 ] } ]

存在

产品名存在

"ProductName": [ { "exists": true } ]

不存在

产品名不存在

"ProductName": [ { "exists": false } ]

始于

地区位于美国

"Region": [ {"prefix": "us-" } ]

结束于

文件名以 .png 扩展名结尾。

“FileName”:[ { "suffix": ".png" } ]

注意

与 EventBridge 一样,对于字符串,Lambda 使用精确的逐个字符匹配,而不进行小写化或任何其他字符串标准化。此外,对于数值,Lambda 使用字符串表示。例如,300、300.0 和 3.0e2 不相等。

请注意,Exists 运算符仅适用于事件源 JSON 中的叶节点,与中间节点不匹配。例如,使用以下 JSON,筛选条件模式 { "person": { "address": [ { "exists": true } ] } }" 找不到匹配项,因为 "address" 是中间节点。

{ "person": { "name": "John Doe", "age": 30, "address": { "street": "123 Main St", "city": "Anytown", "country": "USA" } } }

将筛选条件附加到事件源映射(控制台)

按照以下步骤使用 Lambda 控制台创建包含筛选条件的新事件源映射。

使用筛选条件创建新事件源映射(控制台)
  1. 打开 Lamba 控制台的函数页面

  2. 选择要为其创建事件源映射的函数名称。

  3. Function overview(函数概览)下,选择 Add trigger(添加触发器)。

  4. 对于 Trigger configuration(触发器配置),请选择支持事件筛选的触发器类型。有关受支持的服务列表,请参阅本页开头的列表。

  5. 展开其他设置

  6. Filter criteria(筛选条件)下,选择 Add(添加),然后定义并输入筛选条件。例如,您可以输入以下筛选条件。

    { "Metadata" : [ 1, 2 ] }

    这指示 Lambda 只处理字段 Metadata 等于 1 或 2 的记录。您可以继续选择添加,以添加更多筛选条件,但不得超过最大允许数量。

  7. 添加完筛选条件后,选择保存

使用控制台输入筛选条件时,只需输入筛选条件模式,无需提供 Pattern 键或转义引号。在上述说明的第 6 步中,{ "Metadata" : [ 1, 2 ] } 对应于下面的 FilterCriteria

{ "Filters": [ { "Pattern": "{ \"Metadata\" : [ 1, 2 ] }" } ] }

在控制台中创建事件源映射后,您可以在触发器详细信息中看到格式化后的 FilterCriteria。有关使用控制台创建事件筛选条件的更多示例,请参阅 使用具有不同 AWS 服务 的筛选条件

将筛选条件附加到事件源映射(AWS CLI)

假设您希望事件源映射具有以下 FilterCriteria

{ "Filters": [ { "Pattern": "{ \"Metadata\" : [ 1, 2 ] }" } ] }

要使用 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": "{ \"Metadata\" : [ 1, 2 ]}"}]}'

create-event-source-mapping 命令将为包含指定 FilterCriteria 的函数 my-function 创建新的 Amazon SQS 事件源映射。

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

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'

请注意,要更新事件源映射,您需要其 UUID。您可以通过 list-event-source-mappings 调用获取 UUID。Lambda 还会在 create-event-source-mapping CLI 响应中返回 UUID。

要从事件源中删除筛选条件,您可以运行以下包含空 FilterCriteria 对象的 update-event-source-mapping 命令。

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria "{}"

有关使用 AWS CLI 创建事件筛选条件的更多示例,请参阅 使用具有不同 AWS 服务 的筛选条件

将筛选条件附加到事件源映射(AWS SAM)

假设您要在 AWS SAM 中配置事件源以使用以下筛选条件:

{ "Filters": [ { "Pattern": "{ \"Metadata\" : [ 1, 2 ] }" } ] }

要将这些筛选条件添加到事件源映射中,请将以下代码段插入事件源的 YAML 模板中。

FilterCriteria: Filters: - Pattern: '{"Metadata": [1, 2]}'

有关为事件源映射创建和配置 AWS SAM 模板的更多信息,请参阅《AWS SAM 开发人员指南》中的 EventSource 部分。有关使用 AWS SAM 模板创建事件筛选条件的更多示例,请参阅 使用具有不同 AWS 服务 的筛选条件

使用具有不同 AWS 服务 的筛选条件

不同类型的事件源为其数据字段使用不同的键值。要对数据属性进行筛选,请确保在筛选条件的模式中使用正确的键。下表给出了每个受支持 AWS 服务 的筛选键。

AWS 服务 筛选键
DynamoDB dynamodb
Kinesis data
Amazon MQ data
Amazon MSK value
自行管理的 Apache Kafka value
Amazon SQS body

以下部分将介绍不同类型事件源的筛选条件模式示例。还为每个受支持的服务提供支持的传入数据格式和筛选条件模式正文格式的定义。

使用 DynamoDB 筛选

假设您有一个 DynamoDB 表,其中包含主键 CustomerName、属性 AccountManagerPaymentTerms。下面显示了来自 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 模板添加筛选条件。

Console

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

{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'

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

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'
AWS SAM

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

FilterCriteria: Filters: - Pattern: '{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }'

使用表格属性进行筛选

借助 DynamoDB,您还可以使用 NewImageOldImage 键来筛选属性值。假设您要筛选最新表格图像中 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 模板添加筛选条件。

Console

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

{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'

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

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'
AWS SAM

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

FilterCriteria: Filters: - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }'

使用布尔表达式进行筛选

您也可以使用布尔 AND 表达式创建筛选器。这些表达式可能同时包含表的键和属性参数。假设您想要筛选 AccountManagerNewImage 值为“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 模板添加筛选条件。

Console

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

{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'

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

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'
AWS SAM

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

FilterCriteria: Filters: - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }'
注意

DynamoDB 事件筛选不支持使用数字运算符(数字相等和数字范围)。即使表中的项目存储为数字,这些参数也会转换为 JSON 记录对象中的字符串。

在 DynamoDB 中使用 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 格式。

使用 Kinesis 筛选

假设创建器将 JSON 格式的数据放入 Kinesis 数据流。示例记录如下所示,data 字段中的 JSON 数据会转换为 Base64 编码字符串。

{ "kinesis": { "kinesisSchemaVersion": "1.0", "partitionKey": "1", "sequenceNumber": "49590338271490256608559692538361571095921575989136588898", "data": "eyJSZWNvcmROdW1iZXIiOiAiMDAwMSIsICJUaW1lU3RhbXAiOiAieXl5eS1tbS1kZFRoaDptbTpzcyIsICJSZXF1ZXN0Q29kZSI6ICJBQUFBIn0=", "approximateArrivalTimestamp": 1545084650.987 }, "eventSource": "aws:kinesis", "eventVersion": "1.0", "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898", "eventName": "aws:kinesis:record", "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", "awsRegion": "us-east-2", "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" }

只要创建器放入流中的数据是有效的 JSON,您就可以使用 data 键,通过事件筛选来筛选记录。假设创建器将如下 JSON 格式的记录放入 Kinesis 流。

{ "record": 12345, "order": { "type": "buy", "stock": "ANYCO", "quantity": 1000 } }

要仅筛选订单类型为“购买”的记录,FilterCriteria 对象将如下所示。

{ "Filters": [ { "Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }" } ] }

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

{ "data": { "order": { "type": [ "buy" ] } } }

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

Console

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

{ "data" : { "order" : { "type" : [ "buy" ] } } }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/my-stream \ --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }"}]}'

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

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

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

FilterCriteria: Filters: - Pattern: '{ "data" : { "order" : { "type" : [ "buy" ] } } }'

要正确筛选 Kinesis 源中的事件,数据字段及其筛选条件都必须为有效的 JSON 格式。如果任一字段不为有效的 JSON 格式,Lambda 将会丢弃消息或引发异常。下表汇总了具体行为:

传入数据格式 数据属性中的筛选条件模式格式 导致的操作

有效 JSON

有效 JSON

Lambda 根据您的筛选条件进行筛选。

有效 JSON

数据属性中没有筛选条件模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

有效 JSON

非 JSON

Lambda 在事件源映射创建或更新时引发异常。数据属性的筛选条件模式必须为有效的 JSON 格式。

非 JSON

有效 JSON

Lambda 将丢弃记录。

非 JSON

数据属性中没有筛选条件模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

非 JSON

非 JSON

Lambda 在事件源映射创建或更新时引发异常。数据属性的筛选条件模式必须为有效的 JSON 格式。

筛选 Kinesis 聚合记录

使用 Kinesis,您可以将多条记录聚合到单条 Kinesis Data Streams 记录中,以提高数据吞吐量。使用 Kinesis 增强扇出功能时,Lambda 只能将筛选条件应用于聚合记录。不支持使用标准 Kinesis 筛选聚合记录。使用增强扇出功能时,您可以配置 Kinesis 专用吞吐量使用者作为 Lambda 函数的触发器。然后,Lambda 会筛选聚合记录,并仅传递符合筛选条件的记录。

要了解有关 Kinesis 记录聚合的更多信息,请参阅“Kinesis Producer Library(KPL)关键概念”页面上的聚合部分。要了解有关将 Lambda 与 Kinesis 增强扇出功能结合使用的更多信息,请参阅 AWS 计算博客上的使用 Amazon Kinesis Data Streams 增强扇出功能和 AWS Lambda 提高实时流处理性能

使用 Amazon MQ 筛选

假设 Amazon MQ 消息队列包含有效 JSON 格式或纯字符串的消息。示例记录如下所示,data 字段中的数据会转换为 Base64 编码字符串。

ActiveMQ
{ "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", "messageType": "jms/text-message", "deliveryMode": 1, "replyTo": null, "type": null, "expiration": "60000", "priority": 1, "correlationId": "myJMSCoID", "redelivered": false, "destination": { "physicalName": "testQueue" }, "data":"QUJDOkFBQUE=", "timestamp": 1598827811958, "brokerInTime": 1598827811958, "brokerOutTime": 1598827811959, "properties": { "index": "1", "doAlarm": "false", "myCustomProperty": "value" } }
RabbitMQ
{ "basicProperties": { "contentType": "text/plain", "contentEncoding": null, "headers": { "header1": { "bytes": [ 118, 97, 108, 117, 101, 49 ] }, "header2": { "bytes": [ 118, 97, 108, 117, 101, 50 ] }, "numberInHeader": 10 }, "deliveryMode": 1, "priority": 34, "correlationId": null, "replyTo": null, "expiration": "60000", "messageId": null, "timestamp": "Jan 1, 1970, 12:33:41 AM", "type": null, "userId": "AIDACKCEVSQ6C2EXAMPLE", "appId": null, "clusterId": null, "bodySize": 80 }, "redelivered": false, "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==" }

对于 Active MQ 和 Rabbit MQ 代理,您可以使用 data 键,通过事件筛选来筛选记录。假设 Amazon MQ 队列包含以下 JSON 格式的消息。

{ "timeout": 0, "IPAddress": "203.0.113.254" }

要仅筛选 timeout 字段大于 0 的记录,FilterCriteria 对象将如下所示。

{ "Filters": [ { "Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0] } } ] } }" } ] }

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

{ "data": { "timeout": [ { "numeric": [ ">", 0 ] } ] } }

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

Console

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

{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \ --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'

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

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

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

FilterCriteria: Filters: - Pattern: '{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }'

使用 Amazon MQ,您还可以筛选消息为纯字符串的记录。假设您只想处理消息以“结果:”开头的记录。FilterCriteria 对象将如下所示。

{ "Filters": [ { "Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }" } ] }

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

{ "data": [ { "prefix": "Result: " } ] }

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

Console

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

{ "data" : [ { "prefix": "Result: " } ] }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \ --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"}]}'

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

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

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

FilterCriteria: Filters: - Pattern: '{ "data" : [ { "prefix": "Result " } ] }'

Amazon MQ 消息必须是 UTF-8 编码的字符串,可以是纯字符串或 JSON 格式。这是因为 Lambda 在应用筛选条件之前将 Amazon MQ 字节数组解码为 UTF-8。如果您的消息使用另一种编码,例如 UTF-16 或 ASCII,或者消息格式与 FilterCriteria 格式不匹配,则 Lambda 仅处理元数据筛选条件。下表汇总了具体行为:

传入消息格式 消息属性的筛选条件模式格式 导致的操作

纯字符串

纯字符串

Lambda 根据您的筛选条件进行筛选。

纯字符串

数据属性中没有筛选条件模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

纯字符串

有效 JSON

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

有效 JSON

纯字符串

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

有效 JSON

数据属性中没有筛选条件模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

有效 JSON

有效 JSON

Lambda 根据您的筛选条件进行筛选。

非 UTF-8 编码字符串

JSON、纯字符串或无模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

使用 Amazon MSK 和自行管理的 Apache Kafka 筛选

假设创建器以有效的 JSON 格式或纯字符串,将消息写入 Amazon MSK 或自行管理的 Apache Kafka 集群中的主题。示例记录将如下所示,value 字段中的消息会转换为 Base64 编码字符串。

{ "mytopic-0":[ { "topic":"mytopic", "partition":0, "offset":15, "timestamp":1545084650987, "timestampType":"CREATE_TIME", "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==", "headers":[] } ] }

假设 Apache Kafka 创建器以如下 JSON 格式将消息写入主题。

{ "device_ID": "AB1234", "session":{ "start_time": "yyyy-mm-ddThh:mm:ss", "duration": 162 } }

您可以使用 value 键筛选记录。假设您只想筛选 device_ID 以字母 AB 开头的记录。FilterCriteria 对象将如下所示。

{ "Filters": [ { "Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\": \"AB\" } ] } }" } ] }

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

{ "value": { "device_ID": [ { "prefix": "AB" } ] } }

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

Console

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

{ "value" : { "device_ID" : [ { "prefix": "AB" } ] } }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:kafka:us-east-2:123456789012:cluster/my-cluster/b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \ --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\": \"AB\" } ] } }"}]}'

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

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

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

FilterCriteria: Filters: - Pattern: '{ "value" : { "device_ID" : [ { "prefix": "AB" } ] } }'

使用 Amazon MSK 和自行管理的 Apache Kafka,您还可以筛选消息为纯字符串的记录。假设您想忽略字符串为“错误”的消息。FilterCriteria 对象将如下所示。

{ "Filters": [ { "Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }" } ] }

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

{ "value": [ { "anything-but": [ "error" ] } ] }

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

Console

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

{ "value" : [ { "anything-but": [ "error" ] } ] }
AWS CLI

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

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:kafka:us-east-2:123456789012:cluster/my-cluster/b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \ --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }"}]}'

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

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

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

FilterCriteria: Filters: - Pattern: '{ "value" : [ { "anything-but": [ "error" ] } ] }'

Amazon MSK 和自行管理的 Apache Kafka 消息必须是 UTF-8 编码的字符串,可以是纯字符串或 JSON 格式。这是因为 Lambda 在应用筛选条件之前将 Amazon MSK 字节数组解码为 UTF-8。如果您的消息使用另一种编码,例如 UTF-16 或 ASCII,或者消息格式与 FilterCriteria 格式不匹配,则 Lambda 仅处理元数据筛选条件。下表汇总了具体行为:

传入消息格式 消息属性的筛选条件模式格式 导致的操作

纯字符串

纯字符串

Lambda 根据您的筛选条件进行筛选。

纯字符串

数据属性中没有筛选条件模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

纯字符串

有效 JSON

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

有效 JSON

纯字符串

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

有效 JSON

数据属性中没有筛选条件模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

有效 JSON

有效 JSON

Lambda 根据您的筛选条件进行筛选。

非 UTF-8 编码字符串

JSON、纯字符串或无模式

Lambda 根据您的筛选条件进行筛选(仅限其他元数据属性)。

使用 Amazon SQS 筛选

假设 Amazon SQS 队列包含以下 JSON 格式的消息。

{ "RecordNumber": 0000, "TimeStamp": "yyyy-mm-ddThh:mm:ss", "RequestCode": "AAAA" }

此队列的示例记录将如下所示。

{ "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n "RecordNumber": 0000,\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 根据您的筛选条件进行筛选。