8

次のコードでは、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 トピックからメッセージを受信します。だから、明らかに、私は何か間違ったことをしていますが、もうそれはわかりません。

どんな助けでも素晴らしいでしょう!Amazon に例があればいいのにと思います。SDK に付属の例では、ポリシーやアクセス許可の設定については何も示されていません。オンライン ドキュメントにも何も表示されません。イライラします。

4

4 に答える 4

11

幸いなことに、ここで応答がなかったので、私は自分でそれを理解しました. Amazon が、スクリプト キディーだけでなく、.Net フレームワークの C# 開発者向けにより良いドキュメントを提供してくれることを切に願っています。

とにかく、本格的な Policy オブジェクトを作成し、それを SQS に渡しました。新しい 2.0 (現在はベータ版) ではなく、AWS SDK v1.5 バージョンを使用しました。これは、今のところ機能しており、新しい 2.0 バージョンに変更するのが面倒だったからです。

SNS トピックでのみそのキューを使用する条件で、SQS キューのポリシーを C# でプログラムで作成するために必要なコードを次に示します。

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

これが誰かに役立つことを願っています。

于 2013-10-17T01:36:44.447 に答える
3

以前は、期待どおりに機能しなかったリソースなしでアクセス許可を作成しました。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;
    }
于 2016-10-14T18:56:57.947 に答える
1

匿名の読み取りアクセスを使用してオンザフライでキューを作成する方法を次に示します。必要に応じて 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;
    }
于 2016-10-14T17:33:31.900 に答える