SQS 订阅配置为根据“appId”消息属性过滤消息。过滤器仅选择“appId”属性值为“Foo”的消息。
以下是过滤器将接受的消息示例:
{
"appId": {
"DataType": "String",
"StringValue": "Foo"
},
"header": {
"DataType": "String",
"StringValue": "some string value"
}
}
对于 SQS 订阅中的消息过滤而言,重要的主要属性是“appId”属性。但是,更改“header”属性的值以包含 JSON 有效负载会导致过滤器损坏。由于过滤器被设计为仅关注“appId”属性,因此对其他属性(例如“header”)的任何修改都不应改变过滤器的行为。
以下消息将不会被过滤器接受:
{
"appId": {
"DataType": "String",
"StringValue": "Foo"
},
"header": {
"DataType": "String",
"StringValue": "{\"field\": \"value\"}"
}
}
要使用 AWS CLI 复制问题,请按照以下步骤操作:
aws sns create-topic --name my-topic
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\"]}"}'
# this works
aws sns publish --topic-arn <topic-arn> --message '{"appId":"Foo", "header":"some string value"}'
# this does not
aws sns publish --topic-arn <topic-arn> --message '{"appId":"Foo", "header":"{\"payloadVersion\":\"2\"}"}'
即使它与过滤策略匹配,修改“header”属性以包含 JSON 有效负载也会破坏预期的过滤行为,从而导致问题。
重要:
只是让您知道,如果删除过滤器,带有 JSON 有效负载的消息也会传递到队列。
遇到了这个确切的问题,但是对于消息属性。能够将问题隔离为:如果任何消息属性值包含双引号字符 ("),则 SNS 事件始终会被过滤掉
这是来自 AWS 的回应,承认这是 SNS 中的一个错误。不幸的是,因为这是 3 年前的事了,我不确定是否还有关于此事的更多活动......