c# - 如何添加对 AWS SQS 队列的权限?

标签 c# amazon-web-services clojure permissions amazon-sqs

使用以下代码,我可以使用我的 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);

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

addPermissionRequest.AWSAccountId.Add("*");

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

SendMessage
ReceiveMessage

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

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

最佳答案

幸运的是,我自己想通了,因为我在这里没有收到任何回复。我真的希望 Amazon 能为 .Net 框架上的 C# 开发人员提供更好的文档,而不仅仅是脚本小子。

无论如何,我最终创建了一个完整的策略对象并将其传递给 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);

我希望这对某人有所帮助。

关于c# - 如何添加对 AWS SQS 队列的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19329057/

相关文章:

c# - 如果逗号不在两个双引号之间,则用逗号分隔

c# - 结构可以从 C# 中的类派生吗?

amazon-web-services - AWS SAM YAML 文件无法引用 S3 事件的现有存储桶

clojure - 如何忽略不必要的争论?

clojure - 如何在没有额外间接的情况下在 Clojure 中创建循环(和不可变)数据结构?

c# - WinRT 在哪里存储 RSA 私钥

将枚举值的通用列表组合为单个值的 C# 方法

amazon-web-services - 如何在 amplify-cli 中服务器端排序/排序查询结果

node.js - AWS Lambda + openssl

clojure read-line 在 leiningen 测试中失败