PAYATHON 2026

AWS Lambda 的 SQS 事件源映射能否按 messageAttributes 过滤?

问答百晓生

结论

Lambda 的 SQS 事件源映射不能按 messageAttributes 过滤。过滤规则只支持检查消息体 body。Lambda 收到的 SQS 事件虽然包含 messageAttributes,但事件源映射无法用它作为过滤字段。AWS 文档:使用 Amazon SQS 事件源进行事件过滤

为什么示例规则没有匹配

你给出的规则检查的是 MessageId:

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

这条规则没有检查 messageAttributes,过滤条件也没有按 SQS 事件源映射要求的 body 字段编写。把字段改成 messageAttributes、MessageAttributes 或其他大小写形式也无法解决问题,因为 SQS 映射过滤器不支持按消息属性筛选。Lambda 事件中的字段名和 CLI 显示的消息字段名可能不同,但这里的限制在于过滤器支持哪些字段。

可行的处理方式

如果筛选值可以放在消息体中,可以将消息体设为 JSON,再按其中的字段过滤。例如,消息体为:

{"status":"ready"}

过滤模式可以写成:

{"body":{"status":["ready"]}}

在事件源映射配置中,将模式放在 Filters 数组的 Pattern 字段内。消息体需要是有效 JSON,过滤模式也要按 body 下的 JSON 字段编写。SQS 消息体也可能是普通字符串,格式不匹配时,过滤结果可能与预期不同。格式要求和配置示例见 AWS SQS 过滤文档。

如果路由信息必须保存在 messageAttributes 中,Lambda 就需要先接收消息,再由函数代码读取并判断该属性,决定如何处理或跳过消息。如果这些消息不应触发 Lambda,也可以在发送端或队列前置处理环节筛选。

排查建议

运行 aws lambda get-event-source-mapping --uuid <映射 UUID>,查看事件源映射配置中的过滤条件,并确认 Pattern 针对的是 body。然后用实际消息体构造样例事件,核对消息体是否为预期的 JSON,以及字段名和值是否一致。手动调用函数可以检查函数代码如何处理样例事件,但不能单独证明事件源映射的过滤器配置正确。

还要注意,如果 SQS 消息不符合 Lambda 事件源映射的过滤条件,Lambda 会将其从队列中移除。上线过滤规则前,请确认筛选条件准确。AWS Lambda 事件过滤说明

备注:内容仅供参考。