web-dev-qa-db-ja.com

SNSサブスクリプションにSQSメッセージ属性を追加するにはどうすればよいですか?

AWS SNSおよびSQSのドキュメントには、メッセージ属性に関するセクションがあります。ただし、そのキューがSNSトピックにサブスクライブされている場合にSQS メッセージ属性を設定する方法についての説明はありません。

サブスクリプションを介して送信されるSQSメッセージに特定のメッセージ属性を追加するようにAWS SNSを設定する方法はありますか?

7
Evgeny

Amazon SNSメッセージ属性の使用 AmazonSNSメッセージ属性をAmazonSQSに送信するドキュメントですが、属性はメッセージのbodyで送信されるようです。結果のAmazonSQSメッセージにメッセージ属性として添付されるよりも。

たとえば、私は次のことを行いました。

  • AmazonSNSトピックを作成しました
  • Amazon SQSキューを作成し、SNSトピックにサブスクライブしました
  • SNSにメッセージを公開しました

AWSコマンドラインインターフェイス(CLI) を介して公開しました:

aws sns publish --topic-arn arn:aws:sns:ap-southeast-2:123456789012:foo --message msg --subject subj --message-attributes '{"somename" : { "DataType":"String", "StringValue":"somevalue"}}'

(構文のヘルプは aws cliのマップデータ型 から取得しました)

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メッセージに添付されているとはるかに便利です。残念ながら、そうではないようです。

11
John Rotenstein

Awsドキュメントから:

Amazon SQSエンドポイントでメッセージ属性を使用するには、サブスクリプション属性のRaw MessageDeliveryをTrueに設定する必要があります。生のメッセージ配信の詳細については、付録:大規模なペイロードと生のメッセージ配信を参照してください。 https://docs.aws.Amazon.com/sns/latest/dg/SNSMessageAttributes.htmlhttps://docs.aws.Amazon.com/sns/latest/dg/ large-payload-raw-message.html

実際のプロジェクトからの例を追加しました。うまくいけば、それは物事を明確にするのに役立ちます。 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"
    }
  }
}

There are no message attributes, it is contained within the message itself

Raw配信を有効にするはtrueです。メッセージにはメッセージ属性と適切なコンテンツが含まれています Message has an attributeThe attribute contains expected value

12
Borys Generalov

SNS内のトピックのSQSサブスクリプションを追加するときにRawメッセージ配信タイプを有効にしました

1
Pravin