SNS 订阅:当 StringValue 是 JSON 有效负载时,过滤器会中断

问题描述 投票:0回答:1

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 有效负载的消息也会传递到队列。

amazon-web-services amazon-sqs amazon-sns
1个回答
0
投票

遇到了这个确切的问题,但是对于消息属性。能够将问题隔离为:如果任何消息属性值包含双引号字符 ("),则 SNS 事件始终会被过滤掉

这是来自 AWS 的回应,承认这是 SNS 中的一个错误。不幸的是,因为这是 3 年前的事了,我不确定是否还有关于此事的更多活动......

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.