如何在AWS SQS队列上添加权限?

Tho*_*ger 7 c# permissions clojure amazon-sqs amazon-web-services

使用以下代码,我可以使用我的AWS账号添加权限,但队列不会收到来自SNS的任何消息.

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);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试通过通配符(*)为每个人设置权限时:

addPermissionRequest.AWSAccountId.Add("*");
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误.如果我在AWS SQS控制台中手动添加权限并指定

SendMessage
ReceiveMessage
Run Code Online (Sandbox Code Playgroud)

对于允许的操作和原则,我将其设置为"所有人",队列确实从我的SNS主题接收消息.所以,显然,我做错了什么,但我再也看不到了.

任何帮助都会很棒!我希望亚马逊有示例,SDK附带的示例并未显示有关设置策略或权限的任何信息.在线文档中也没有显示任何内容.令人沮丧.

Tho*_*ger 11

幸运的是,由于我在这里没有收到回复,所以我自己想出来了.我真的希望亚马逊能够为.Net框架上的C#开发人员提供更好的文档,而不仅仅是脚本小子.

无论如何,我最终创建了一个完整的Policy对象并将其传递给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);
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人.

  • @anna StackOverflow不允许我在评论中添加代码,甚至不允许添加新行,所以我在博客上发布了如何为长轮询设置队列:http://thomasjaeger.wordpress.com/2013/10/21 /如何对导通 - 长轮询上-AN-AWS-SQS-队列/ (2认同)