能否创建同时过滤AWS SNS MessageAttributes与MessageBody的订阅策略?
AWS SNS 组合MessageAttributes与MessageBody过滤的实现方法
AWS SNS的FilterPolicyScope确实只能指定MessageAttributes或MessageBody其中一种作为过滤范围,无法直接在单个过滤策略里同时组合两者的条件。要实现你需要的(attr1 == value) AND (body1 == this OR orthis OR andthis)逻辑,有两种可行方案:
方案一:将Body字段同步到MessageAttributes,基于属性过滤
这种方法不需要额外服务,核心是在发布消息时,把MessageBody里需要过滤的字段复制一份到MessageAttributes中,然后仅基于MessageAttributes设置过滤规则。
操作步骤:
- 发布消息时,同时在
MessageAttributes中添加与MessageBody里body1对应的属性(比如命名为body1_attr),确保两者值一致:
{ "Message": "{\"body1\": \"this\"}", "MessageAttributes": { "attr1": { "DataType": "String", "StringValue": "value" }, "body1_attr": { "DataType": "String", "StringValue": "this" } } }
- 设置订阅的过滤策略,仅针对MessageAttributes:
{ "attr1": ["value"], "body1_attr": ["this", "orthis", "andthis"] }
- 将
FilterPolicyScope设置为MessageAttributes。
这样消息必须同时满足attr1 == value和body1_attr在指定列表中,间接等价于原需求的逻辑。
方案二:用Lambda做二次过滤
如果不想修改消息发布逻辑,可以先通过SNS过滤其中一个条件,再用Lambda函数对另一个条件做二次校验。
操作步骤:
- 创建SNS订阅,先过滤MessageAttributes的条件:
- 过滤策略设为
{"attr1": ["value"]} FilterPolicyScope设为MessageAttributes- 订阅端点选择Lambda函数的ARN
- 过滤策略设为
- 在Lambda函数中编写逻辑,解析MessageBody并校验
body1的值:
import json def lambda_handler(event, context): # 解析SNS消息 sns_message = json.loads(event['Records'][0]['Sns']['Message']) body1_value = sns_message.get('body1') # 校验body1是否在目标列表中 allowed_values = ["this", "orthis", "andthis"] if body1_value in allowed_values: # 满足条件,转发到最终目标(比如SQS、另一个SNS或HTTP端点) # 这里写转发逻辑,例如调用boto3发送到目标服务 print("消息满足条件,继续处理") else: # 不满足条件,直接丢弃 print("消息不满足body1条件,丢弃") return { 'statusCode': 200, 'body': json.dumps('过滤完成') }
- Lambda校验通过后,再将消息转发到你实际需要的接收端点(如SQS、邮件、HTTP等)。
两种方案对比
- 方案一:简单高效,无额外成本,但需要发布消息的系统同步维护MessageAttributes与MessageBody的字段一致性。
- 方案二:无需修改发布逻辑,灵活性更高,但需要维护Lambda函数,有少量计算成本和运维复杂度。
内容的提问来源于stack exchange,提问作者user27688976
相关产品推荐
相关产品推荐

