2013-10-12 13 views
5

Con il seguente codice, posso aggiungere un'autorizzazione utilizzando il mio numero di account AWS ma la coda non riceve alcun messaggio da SNS.Come si aggiungono le autorizzazioni su una coda SQS AWS?

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); 

Ma, quando cerco di impostare l'autorizzazione tramite un carattere jolly (*) per tutti:

addPermissionRequest.AWSAccountId.Add("*"); 

mi dà un errore. Se posso aggiungere manualmente il permesso nella console AWS SQS e specificare

SendMessage 
ReceiveMessage 

per le azioni consentite e per il principio, l'ho impostato a "tutti", la coda non ricevere messaggi dal mio argomento SNS. Quindi, ovviamente, sto facendo qualcosa di sbagliato ma non lo vedo più.

Qualsiasi aiuto sarebbe fantastico! Vorrei che Amazon avesse degli esempi, l'esempio che viene fornito con l'SDK non mostra nulla sull'impostazione delle politiche o dei permessi. Nulla è mostrato nella documentazione online, neanche. Frustrante.

risposta

10

Fortunatamente, l'ho capito da solo perché non ho ricevuto risposte qui. Vorrei davvero che Amazon fornisse una documentazione migliore per gli sviluppatori di C# sul framework .Net e non solo per gli script kiddies.

In ogni caso, ho finito per creare un oggetto Policy completo e lo ho passato a SQS. Ho usato la versione AWS SDK v1.5 e non la versione 2.0 più recente (in beta adesso) semplicemente perché funziona per ora e sono stato troppo pigro per cambiarlo alla versione 2.0 più recente.

Ecco il pezzo di codice che sarà necessario creare a livello di programmazione di una politica in C# per una coda SQS con una condizione di utilizzare solo quella coda con un soggetto 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); 

Spero che questo aiuta qualcuno.

+0

solo dire che sono d'accordo con te, non una quantità enorme quando si tratta di esempio - Io ho cercato in come impostare - ReceiveMessageWaitTimeSeconds e ho appena continuare a colpire un muro di mattoni - Posso farlo nella console ma non riesco a trovare esempi di codice su come impostarlo - ho pensato che sarebbe stato semplice! – anna

+0

@anna Sembra che tu stia cercando di eseguire un polling lungo sulle code SQS. Quali problemi specifici incontri? Hai postato una domanda SO? Forse posso aiutare. –

+0

Sto provando a fare il polling lungo so come impostarlo manualmente ma ho bisogno di impostarlo quando sto creando la coda nel codice ho questo che crea la coda var sqsRequest = new CreateQueueRequest(); sqsRequest.QueueName = "Bin2AutomationQ"; var createQueueResponse = sqs.CreateQueue (sqsRequest); myQueueUrl = createQueueResponse.CreateQueueResult.QueueUrl; ma non sono sicuro di come impostare ReceiveMessageWaitTimeSeconds su 20 – anna

1

Ecco come farlo in Clojure con 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

Ecco come ho creato una coda al volo con anonimo accesso in lettura. Basta aggiungere ActionIdentifier aggiuntivi come necessario:

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

In precedenza è stato creato il permesso senza la risorsa che non funzionava come previsto. Ecco una correzione per ottenere l'ARN:

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; 
    } 
Problemi correlati