Amazon web services 如何在SNS订阅中添加SQS消息属性?

Amazon web services 如何在SNS订阅中添加SQS消息属性?,amazon-web-services,amazon-sqs,amazon-sns,Amazon Web Services,Amazon Sqs,Amazon Sns,AWS SNS和SQS的文档中有关于消息属性的部分。但没有解释当队列订阅SNS主题时如何拥有SQS消息属性 有没有办法配置AWS SNS,将特定的消息属性添加到通过订阅发送的SQS消息中?当文档将Amazon SNS消息属性发送到Amazon SQS时,这些属性似乎是在消息体中发送的,而不是作为消息属性附加到生成的AmazonSQS消息上 例如,我做了以下工作: aws sns publish --topic-arn arn:aws:sns:us-west-2:xxx:pollution-eve

AWS SNS和SQS的文档中有关于消息属性的部分。但没有解释当队列订阅SNS主题时如何拥有SQS消息属性

有没有办法配置AWS SNS,将特定的消息属性添加到通过订阅发送的SQS消息中?

当文档将Amazon SNS消息属性发送到Amazon SQS时,这些属性似乎是在消息体中发送的,而不是作为消息属性附加到生成的AmazonSQS消息上

例如,我做了以下工作:

aws sns publish --topic-arn arn:aws:sns:us-west-2:xxx:pollution-event --message '{"operatorId":3375001,"eventTypeId":1,"eventLevelId":1,"validFrom":"2018-03-10T09:00:00Z","validTo":"2018-03-11T09:00:00Z"}'  --message-attributes '{"Type" : { "DataType":"String", "StringValue":"Orchestration.Services.Model.Pollution.PollutionMessage"}}'
  • 创建了一个亚马逊SNS主题
  • 创建了一个Amazon SQS队列并将其订阅到SNS主题
  • 向SNS发布消息
我通过以下网站发布:

(我从中获得语法帮助)

在SQS中生成的消息将属性显示为消息的一部分:

{
  "Type" : "Notification",
  "MessageId" : "53e3adad-723a-5eae-a7b7-fc0468ec2d37",
  "TopicArn" : "arn:aws:sns:ap-southeast-2:123456789012:foo",
  "Subject" : "subj",
  "Message" : "msg",
  "Timestamp" : "2017-05-29T12:48:22.186Z",
  ...
  "MessageAttributes" : {
    "somename" : {"Type":"String","Value":"somevalue"}
  }
}

如果将这些属性作为正式的SQS属性附加到SQS消息中会更好。唉,情况似乎并非如此。

来自aws文档:

要对Amazon SQS端点使用消息属性,必须将订阅属性“原始消息传递”设置为True。有关原始消息传递的更多信息,请参阅附录:大负载和原始消息传递。

添加了一个来自真实项目的示例。希望这有助于澄清问题。 发布到sns主题的消息如下:

aws sns publish --topic-arn arn:aws:sns:us-west-2:xxx:pollution-event --message '{"operatorId":3375001,"eventTypeId":1,"eventLevelId":1,"validFrom":"2018-03-10T09:00:00Z","validTo":"2018-03-11T09:00:00Z"}'  --message-attributes '{"Type" : { "DataType":"String", "StringValue":"Orchestration.Services.Model.Pollution.PollutionMessage"}}'
启用原始传递为false(默认值)。sqs收到的消息只包含内容,没有属性

{
  "Type": "Notification",
  "MessageId": "78d5bc6f-142c-5060-a75c-ef29b774ec66",
  "TopicArn": "arn:aws:sns:eu-west-2:xxx:pollution-event",
  "Message": "{\"validFrom\": \"2018-03-10T09:00:00Z\",\"validTo\": \"2018-03-11T09:00:00Z\",\"eventLevelId\": 1,\"eventTypeId\": 1,\"operatorId\": 3375001}",
  "Timestamp": "2018-04-17T11:33:44.770Z",
  "SignatureVersion": "1",
  "Signature": "xxx==",
  "SigningCertURL": "https://sns.eu-west-2.amazonaws.com/SimpleNotificationService-xxx.pem",
  "UnsubscribeURL": "https://sns.eu-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-2:xxx",
  "MessageAttributes": {
    "Type": {
      "Type": "String",
      "Value": "Orchestration.Services.Model.Pollution.PollutionMessage"
    },
    "AWS.SNS.MOBILE.MPNS.Type": {
      "Type": "String",
      "Value": "token"
    },
    "AWS.SNS.MOBILE.MPNS.NotificationClass": {
      "Type": "String",
      "Value": "realtime"
    },
    "AWS.SNS.MOBILE.WNS.Type": {
      "Type": "String",
      "Value": "wns/badge"
    }
  }
}

启用原始传递为true。消息包含消息属性和正确内容

为SNS内的主题添加SQS订阅时启用原始消息传递类型

当Amazon SQS队列订阅了Amazon SNS主题时,SQS消息将包含发送到(和转发自)SNS的消息。您想要什么特定的属性?“SQS消息属性”是一个东西。与消息正文分开。这是正确的。但是,当SNS向SQS发送消息时,它会填充SQS消息体。您希望将SNS中的哪些属性填充为SQS消息属性?我希望在此SNS主题生成的SQS消息上具有某些预定义属性。例如,一个主题上的消息将添加属性
path:foo
,另一个发送到同一SQS队列的SNS主题将添加属性
path:bar
。据报道,似乎有一个参考,但没有其他记录<代码>*重要信息*要在Amazon SQS端点上使用消息属性,必须将订阅属性Raw message Delivery设置为True。根据您的回答,我假设目前无法让SNS以任何方式实际创建SQS属性。添加SQS属性的唯一方法可能是直接使用SDK或API,而不使用SNS之类的服务。@Evgeny这是正确的。不幸的是,SNS/SQS集成没有以直观的方式处理消息属性。例如,您还可以使用SNS>Lambda>SQS,并在Lambda函数中使用自定义代码,从SNS消息属性填充SQS消息属性。@Michael sqlbot已经在处理这个问题了。CloudWatch事件SQS目标似乎也不支持SQS消息属性,因此也需要处理该问题:(您是否忘记更改订阅属性RawMessageDelivery,默认为false?使用aws cli的示例:aws sns设置订阅属性--subscription arn'subscriptionarn'--属性名RawMessageDelivery--属性值true这不是正确的答案。@BorysGeneralov的答案是正确的:是的,我们有确切的答案同样的问题:我们发布了带有属性的消息,但是sns转发它时没有任何属性。sqs包含带有json内容的消息,而json内容又包含该属性。启用原始消息传递修复了该问题,即sns按原样发送消息,并且属性重新命名。一旦您从默认值更改原始设置,消息属性在SQS中正确显示。非常奇怪。虽然属性出现在AWS控制台上,但它们不是通过SDK接收的。为什么会发生这种情况?嗯,您必须传递--message attribute names参数才能接收消息属性…这是正确的答案。启用他
Raw message delivery
将消息属性作为实际消息属性从SNS“传递”给SQS,而不是作为正文的一部分。