如何添加对 AWS SQS 队列的权限

本文关键字:SQS AWS 队列 权限 何添加 添加 | 更新日期: 2023-09-27 18:34:56

使用以下代码,我可以使用我的 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 附带的示例没有显示有关设置策略或权限的任何内容。在线文档中也没有显示任何内容。令人 沮丧。

如何添加对 AWS SQS 队列的权限

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

无论如何,我最终创建了一个完整的策略对象并将其传递给 SQS。我使用的是 AWS 开发工具包 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);

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

以前在没有资源的情况下创建了权限,该权限未按预期工作。 以下是获取 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;
    }
以下是在

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

以下是我如何使用匿名读取访问权限动态创建队列。 只需根据需要添加其他操作标识符:

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