Тема SNS не публикуется в SQS - PullRequest
10 голосов
/ 08 мая 2011

Я пытаюсь создать прототип распределенного приложения с использованием SNS и SQS. У меня есть тема:

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

и эта очередь:

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

Я создал очередь, используя JS Scratchpad.Я добавил подписку с помощью Консоли.Я добавляю разрешение в очередь с помощью блокнота.Политика очереди теперь такова:

{  
   "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"
      }
   ]
}

У меня есть подписка на электронную почту на ту же тему, и письма приходят нормально, но сообщения никогда не приходят в очередь.Я попробовал SendMessage непосредственно в очередь - а не через SNS - используя Scratchpad, и он работает нормально.Есть идеи, почему его не отправят в очередь?

Ответы [ 4 ]

14 голосов
/ 09 мая 2011

Это было опубликовано некоторое время назад на форумах AWS: https://forums.aws.amazon.com/thread.jspa?messageID=202798

Затем я дал теме SNS разрешение отправлять сообщения в очередь SQS. Хитрость здесь в том, чтобы разрешить все принципы SNS не отправляет с вашего идентификатора учетной записи - он имеет свой собственный идентификатор учетной записи, с которого он отправляет.

5 голосов
/ 07 мая 2016

Вот полный пример CloudFormation ответа Скайлера

"MyQueue": {
  "Type": "AWS::SQS::Queue"
},
"QueuePolicy": {
  "Type": "AWS::SQS::QueuePolicy",
  "Properties": {
    "Queues": [
      {
        "Ref": "MyQueue"
      }
    ],
    "PolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "allow-sns-messages",
          "Effect": "Allow",
          "Principal": "*",
          "Action": "sqs:SendMessage",
          "Condition": {
            "ArnEquals": {
              "aws:SourceArn": {
                "Ref": "MyTopic"
              }
            }
          }
        }
      ]
    }
  }
}

У Amazon есть больше опций в Отправке сообщений Amazon SNS в очереди Amazon SQS документ.

3 голосов
/ 29 октября 2018

Старый вопрос, но с использованием версии 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(Principal.All)
           .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":"*",
               "Action":["sqs:SendMessage"],
               "Condition":
                   {"ArnEquals":
                       {"aws:SourceArn":["arn:aws:sns:us-east-1:3232:testSubscription"]}
                   }
              }]
      }
 }
2 голосов
/ 08 февраля 2019

Добавляя к ответу Скайлера, если вы, как и я, недовольны идеей разрешения какого-либо принципала (Principal: '*'), вы можете ограничить принципала SNS:

Principal:
  Service: sns.amazonaws.com

Хотя это поведение не документировано, оноработы.

...