2013-10-12 4 views
5

С помощью следующего кода я могу добавить разрешение, используя мой номер учетной записи AWS, но очередь не получает сообщений от SNS.Как добавить разрешения в очередь AWS SQS?

AddPermissionRequest addPermissionRequest = new AddPermissionRequest(); 
addPermissionRequest.ActionName.Add("SendMessage"); 
addPermissionRequest.ActionName.Add("ReceiveMessage"); 
addPermissionRequest.QueueUrl = queueUrl; 
addPermissionRequest.Label = General.IpAddressAWSFriendly; 
addPermissionRequest.AWSAccountId.Add(AWS_ACCOUNT_ID); 
sqs.AddPermission(addPermissionRequest); 

Но, когда я пытаюсь установить разрешение через групповой символ (*) для всех:

addPermissionRequest.AWSAccountId.Add("*"); 

это дает мне ошибку. Если я вручную добавить разрешения в консоли AWS SQS и указать

SendMessage 
ReceiveMessage 

для разрешенных действий и принципа, я поставил его на «все», то очередь делает получать сообщения от моего SNS темы. Итак, очевидно, я делаю что-то неправильно, но я больше этого не вижу.

Любая помощь будет замечательной! Я бы хотел, чтобы у Amazon были примеры, пример, который поставляется с SDK, ничего не показывает о настройке политик или разрешений. Ничего не показано в онлайн-документации. Разочарование.

ответ

10

К счастью, я сам это понял, так как здесь не было ответов. Я очень хочу, чтобы Amazon предоставила лучшую документацию для разработчиков C# в среде .NET, а не только для сценаристов.

В любом случае, я закончил создание полномасштабного объекта политики и передал его в SQS. Я использовал версию AWS SDK v1.5, а не более новую версию 2.0 (сейчас в бета-версии) просто потому, что она работает пока, и я был слишком ленив, чтобы изменить ее на новую версию 2.0.

Вот фрагмент кода, вам нужно будет программно создать политику в C# для очереди SQS с условием, чтобы использовать только эту очередь с темой SNS:

 // 4. Set the queue policy to allow SNS to publish messages 
     ActionIdentifier[] actions = new ActionIdentifier[2]; 
     actions[0] = SQSActionIdentifiers.SendMessage; 
     actions[1] = SQSActionIdentifiers.ReceiveMessage; 
     Policy sqsPolicy = new Policy() 
      .WithStatements(new Statement(Statement.StatementEffect.Allow) 
           .WithPrincipals(Principal.AllUsers) 
           .WithResources(new Resource(queueArn)) 
           .WithConditions(ConditionFactory.NewSourceArnCondition(_AWSSNSArn)) 
           .WithActionIdentifiers(actions)); 
     SetQueueAttributesRequest setQueueAttributesRequest = new SetQueueAttributesRequest(); 
     List<Amazon.SQS.Model.Attribute> attributes = new List<Amazon.SQS.Model.Attribute>(); 
     Amazon.SQS.Model.Attribute attribute = new Amazon.SQS.Model.Attribute(); 
     attribute.Name = "Policy"; 
     attribute.Value = sqsPolicy.ToJson(); 
     attributes.Add(attribute); 
     setQueueAttributesRequest.QueueUrl = queueUrl; 
     setQueueAttributesRequest.Attribute = attributes; 
     sqs.SetQueueAttributes(setQueueAttributesRequest); 

Я надеюсь, что это поможет кому-то.

+0

просто сказать, что я согласен с вами, а не огромное количество, когда речь идет, например - я так долго искали в том, чтобы установить - ReceiveMessageWaitTimeSeconds и я просто держать удар в кирпичную стену - Я могу сделать это в консоли, но не могу найти примеры кода о том, как его установить - я думал, что это будет прямо! – anna

+0

@anna Похоже, вы пытаетесь сделать длинный опрос в очередях SQS. С какими конкретными проблемами вы сталкиваетесь? Вы задали вопрос? Может быть, я могу помочь. –

+0

Я пытаюсь сделать длинный опрос, я знаю, как его вручную установить, но мне нужно установить его, когда я создаю очередь в коде. У меня есть это, что создает очередь var sqsRequest = new CreateQueueRequest(); sqsRequest.QueueName = "Bin2AutomationQ"; var createQueueResponse = sqs.CreateQueue (sqsRequest); myQueueUrl = createQueueResponse.CreateQueueResult.QueueUrl; но не уверен, как установить ReceiveMessageWaitTimeSeconds в 20 – anna

1

Вот как сделать это в Clojure с amazonica:

(require '[amazonica.aws.sqs :as sqs] 
     '[amazonica.core :as aws) 
(import '(com.amazonaws.auth.policy Statement Statement$Effect 
            Principal 
            Policy 
            Resource 
            Condition 
            Action) 
     '(com.amazonaws.auth.policy.actions SQSActions) 
     '(com.amazonaws.auth.policy.conditions ConditionFactory)) 

(aws/defcredential "access-key" "secret-key" "us-east-1") 

(def topic-arn "arn:aws:sns:us-east-1:123:foo") 
(def queue-url "https://sqs.us-east-1.amazonaws.com/123/bar") 
(def queue-arn (-> queue-url sqs/get-queue-attributes :QueueArn)) 

(def policy (Policy. 
        (str queue-arn "/SQSDefaultPolicy") 
        [(doto (Statement. Statement$Effect/Allow) 
         (.setPrincipals [Principal/AllUsers]) 
         (.setResources [(Resource. queue-arn)]) 
         (.setConditions [(ConditionFactory/newSourceArnCondition topic-arn)]) 
         (.setActions [SQSActions/SendMessage]))])) 

(sqs/set-queue-attributes queue-url {"Policy" (.toJson policy)}) 
0

Вот как я создаю очереди на лету с анонимного доступа на чтение. Просто добавьте дополнительные ActionIdentifiers по мере необходимости:

public static String TestQueueCreate(String name) { 

     AmazonSQSClient sqs = new AmazonSQSClient(region: Amazon.RegionEndpoint.USEast1); 
     CreateQueueResponse create = sqs.CreateQueue(name); 

     Policy policy = new Policy() { 
      Statements = new List<Statement>() { 
       new Statement(StatementEffect.Allow) { 
        Principals = new List<Principal>() { Principal.AllUsers }, 
        Actions = new List<ActionIdentifier>() { SQSActionIdentifiers.ReceiveMessage } 
       } 
      } 
     }; 

     Dictionary<String,String> queueAttributes = new Dictionary<String, String>(); 
     queueAttributes.Add(QueueAttributeName.Policy.ToString(), policy.ToJson()); 
     sqs.SetQueueAttributes(new SetQueueAttributesRequest(create.QueueUrl, queueAttributes)); 

     return create.QueueUrl; 
    } 
1

Предыдущее создало разрешение без ресурса, который не работал должным образом. Вот коррекция получить Арн:

public static String TestQueueCreate(String name) { 

     AmazonSQSClient sqs = new AmazonSQSClient(region: Amazon.RegionEndpoint.USEast1); 
     CreateQueueResponse create = sqs.CreateQueue(name); 

     String arn = sqs.GetQueueAttributes(create.QueueUrl, new List<String>() { "QueueArn" }).Attributes["QueueArn"]; 

     Policy policy = new Policy() { 
      Statements = new List<Statement>() { 
       new Statement(StatementEffect.Allow) { 
        Principals = new List<Principal>() { new Principal("*") }, 
        Actions = new List<ActionIdentifier>() { 
         new ActionIdentifier("SQS:ReceiveMessage"), 
         new ActionIdentifier("SQS:SendMessage") 
        }, 
        Resources = new List<Resource>() { new Resource(arn) } 
       } 
      }, 

     }; 

     Dictionary<String,String> queueAttributes = new Dictionary<String, String>(); 
     queueAttributes.Add(QueueAttributeName.Policy.ToString(), policy.ToJson()); 
     sqs.SetQueueAttributes(new SetQueueAttributesRequest(create.QueueUrl, queueAttributes)); 

     return create.QueueUrl; 
    } 
Смежные вопросы