SNS订阅问题:StringValue为JSON负载时过滤规则失效
SQS订阅消息过滤异常:JSON格式Header属性导致符合规则的消息被拦截
问题场景
我们为SQS订阅配置了基于appId消息属性的过滤规则,仅接收appId属性值为Foo的消息。
可正常通过过滤的消息示例
{ "appId": { "DataType": "String", "StringValue": "Foo" }, "header": { "DataType": "String", "StringValue": "some string value" } }
按照设计逻辑,过滤规则只应关注appId属性,修改其他属性不会影响过滤结果。但实际测试发现,当header属性值改为JSON格式的字符串负载后,原本符合appId规则的消息会被过滤规则拦截,无法投递到队列。
被错误拦截的消息示例
{ "appId": { "DataType": "String", "StringValue": "Foo" }, "header": { "DataType": "String", "StringValue": "{\"field\": \"value\"}" } }
AWS CLI复现步骤
# 创建SNS主题 aws sns create-topic --name my-topic # 创建SQS队列 aws sqs create-queue --queue-name my-queue # 订阅主题并配置过滤策略 aws sns subscribe --topic-arn <topic-arn> --protocol sqs --notification-endpoint <queue-url> --attributes '{"FilterPolicy":"{\"appId\":[\"Foo\"]}"}' # 此消息可正常投递到队列 aws sns publish --topic-arn <topic-arn> --message '{"appId":"Foo", "header":"some string value"}' # 此消息符合过滤规则但被拦截,无法投递 aws sns publish --topic-arn <topic-arn> --message '{"appId":"Foo", "header":"{\"payloadVersion\":\"2\"}"}'
关键验证结论
移除订阅的过滤策略后,含有JSON负载的消息能够正常投递到队列,说明问题根源在于过滤规则与JSON格式的Header属性存在异常交互。
内容的提问来源于stack exchange,提问作者Daniel Teleginski Camargo
相关产品推荐
相关产品推荐

