38

SNS と SQS を使用して分散アプリケーションのプロトタイプを作成しようとしています。次のトピックがあります。

arn:aws:sns:us-east-1:574008783416:us-east-1-live-auction

そしてこのキュー:

arn:aws:sqs:us-east-1:574008783416:queue4

JS Scratchpad を使用してキューを作成しました。コンソールを使用してサブスクリプションを追加しました。スクラッチパッドを使用してキューに AddPermission を追加します。キュー ポリシーは次のようになりました。

{  
   "Version":"2008-10-17",
   "Id":"arn:aws:sqs:us-east-1:574008783416:queue4/SQSDefaultPolicy",
   "Statement":[  
      {  
         "Sid":"RootPerms",
         "Effect":"Allow",
         "Principal":{  
            "AWS":"574008783416"
         },
         "Action":"SQS:*",
         "Resource":"arn:aws:sqs:us-east-1:574008783416:queue4"
      }
   ]
}

同じトピックに関するメール サブスクリプションがあり、メールは正常に届きますが、メッセージがキューに届きません。Scratchpad を使用して、SendMessage を SNS 経由ではなくキューに直接送信しようとしましたが、正常に動作しました。キューに送信されない理由はありますか?

4

8 に答える 8

32

これは AWS フォーラムにしばらく前に投稿されました: https://forums.aws.amazon.com/thread.jspa?messageID=202798

次に、SQS キューにメッセージを送信する許可を SNS トピックに与えました。ここでの秘訣は、すべてのプリンシパルを許可することです。SNS はあなたのアカウント ID から送信するのではなく、送信元の独自のアカウント ID を持っています。

于 2011-05-09T02:39:44.053 に答える
13

Skyler の回答の完全な CloudFormation の例を次に示します。

{
  "Resources": {
    "MyTopic": {
      "Type": "AWS::SNS::Topic"
    },
    "MyQueue": {
      "Type": "AWS::SQS::Queue"
    },
    "Subscription": {
      "Type" : "AWS::SNS::Subscription",
      "Properties" : {
          "Protocol" : "sqs",
          "TopicArn" : {"Ref": "MyTopic"},
          "Endpoint": {"Fn::GetAtt": ["MyQueue", "Arn"]}
        }
    },
    "QueuePolicy": {
      "Type": "AWS::SQS::QueuePolicy",
      "Properties": {
        "Queues": [
          {"Ref": "MyQueue"}
        ],
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "allow-sns-messages",
              "Effect": "Allow",
              "Principal": {"Service": "sns.amazonaws.com"},
              "Action": "sqs:SendMessage",
              "Resource": {"Fn::GetAtt": ["MyQueue", "Arn"]},
              "Condition": {
                "ArnEquals": {
                  "aws:SourceArn": {"Ref": "MyTopic"}
                }
              }
            }
          ]
        }
      }
    }
  }
}

Amazon には、 Amazon SNS メッセージを Amazon SQS キューに送信するドキュメントに、より多くのオプションがあります。

于 2016-05-06T23:45:16.853 に答える
4

古い質問ですが、AWS SDK バージョン > 1.10 を使用しています

ドキュメントSQS-SNS sendMessage Permission を確認してください

private static void updateQueuePolicy(AmazonSQS sqs, String queueURL, String topicARN) {
   Map<String, String> attributes = new HashMap<String, String>(1);
   Action actions = new Action() {
       @Override
       public String getActionName() {
           return "sqs:SendMessage"; // Action name
       }
   };
   Statement mainQueueStatements = new Statement(Statement.Effect.Allow)
           .withActions(actions)
           .withPrincipals(new Principal("Service", "sns.amazonaws.com"))
           .withConditions(
               new Condition()
               .withType("ArnEquals")
               .withConditionKey("aws:SourceArn")
               .withValues(topicARN)
           );

   final Policy mainQueuePolicy = new Policy()
        .withId("MainQueuePolicy")
        .withStatements(mainQueueStatements);

   attributes.put("Policy", mainQueuePolicy.toJson());

   updateQueueAttributes(sqs, queueURL, attributes);
}

次のようなポリシーを出力します

{
   Policy={
      "Version":"2012-10-17",
       "Id":"MainQueuePolicy",
       "Statement":
            [
              {
                 "Sid":"1",
                 "Effect":"Allow",
                 "Principal": {
                   "Service": "sns.amazonaws.com"
                 },
                 "Action":["sqs:SendMessage"],
                 "Condition":
                   {"ArnEquals":
                     {"aws:SourceArn":["arn:aws:sns:us-east-1:3232:testSubscription"]}
                   }
              }
            ]
      }
 }
于 2018-10-29T17:52:32.647 に答える