AWS JDK 2 создать очередь и подписаться на тему

Я работаю над AWS с SNS / SQS, и я пытаюсь создать подписку SNS по теме SQS. Я использую AWS Java SDK 2. Я могу правильно создавать темы и очереди, проблема, с которой я столкнулся, заключается в том, что я получаю сообщение об ошибке при создании подписки между темой и очередью. Ниже приведен фрагмент моего кода:

public SubscribeResponse subscribeQueue(String topicArn, String queueUrl){
    SubscribeRequest subscribeRequest = SubscribeRequest.builder()
            .topicArn(topicArn)
            .protocol("sqs")
            .endpoint(queueUrl)
            .returnSubscriptionArn(true).build();
    return getAmazonSNSClient().subscribe(subscribeRequest);
}

Ниже я получаю ошибку:

{ "message": "Internal Server Error: software.amazon.awssdk.services.sns.model.InvalidParameterException: Invalid parameter: SQS endpoint ARN (Service: Sns, Status Code: 400, Request ID: dabaeeb3-e77a-5873-861e-b8d0a7bf5c7f)" }

Может ли кто-нибудь указать мне, что я делаю не так?


person elcharrua    schedule 05.12.2019    source источник
comment
Можете ли вы поделиться значениями topicArn и queueUrl?   -  person stdunbar    schedule 05.12.2019


Ответы (1)


С помощью AWS Java SDK v1 вы можете подписать очередь SQS на тему SNS, используя метод Topics.subscribeQueue, где объект конечная точка занимает в queueUrl , как показано ниже:

Topics.subscribeQueue(sns, sqs, myTopicARN, queueURL);

С помощью AWS Java SDK v2 вы можете подписать очередь SQS на тему SNS с помощью метода SunscribeRequest.builder, где объект конечная точка принимает queueArn.

Ниже приведен пример фрагмента кода Java, который я протестировал для успешной подписки очереди SQS на тему SNS:

  public static void subscribeSQStoSNS(String queueUrl, String topicArn, SqsClient sqsClient, SnsClient snsClient) {


   /* with AWS Java SDK v1, you could subscribe an SQS queue to an SNS topic by
     * calling "Topics.subscribeQueue"()[1] where the endpoint object takes in queueUrl.
     * 
     * with AWS Java SDK v2, to subscribe an SQS queue to an SNS topic
     * one needs to use "SunscribeRequest.builder"() [2] where the endpoint object takes in queueArn.
     * 
     * [1] https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sns/util/Topics.html
     * [2] https://sdk.amazonaws.com/java/api/2.0.0-preview-11/software/amazon/awssdk/services/sns/model/SubscribeRequest.Builder.html
     *
     */

  // Step 1: We call "get-queue-attributes" API to retrieve the SQS queue Arn

  GetQueueAttributesRequest QueueAttributesRequest = GetQueueAttributesRequest.builder()
            .queueUrl(queueUrl)
            .attributeNamesWithStrings("All")
            .build();

   GetQueueAttributesResponse QueueAttributesResult = sqsClient.getQueueAttributes(QueueAttributesRequest);
    Map<String, String> sqsAttributeMap = QueueAttributesResult.attributesAsStrings();

  System.out.println("\n\n"+ QueueAttributesRequest);
    String queueArn = sqsAttributeMap.get("QueueArn");
    //System.out.println("\n\n"+ queueArn);


  // Step 2: We call "SubscribeRequest.builder" to subscribe the SQS queue to the SNS topic

   SubscribeRequest Qrequest = SubscribeRequest.builder()
            .protocol("sqs")
            .endpoint(queueArn)
            .returnSubscriptionArn(true)
            .topicArn(topicArn)
            .build();

   SubscribeResponse Qresponse = snsClient.subscribe(Qrequest);
    System.out.println("\n\nCreated Subscription ARN: " + Qresponse.subscriptionArn()+ " " + " and StatusCode : " + Qresponse.sdkHttpResponse().statusCode());}

Примечание.

1. Метод «Topics.subscribeQueue» () автоматически создает политику для подписки, позволяющую теме отправлять сообщения в очередь.

2. Метод SunscribeRequest.builder () не добавляет автоматически политику для подписки (то есть очередь SQS), чтобы разрешить тема SNS для отправки сообщений в очередь. Поэтому убедитесь, что вы предоставили теме SNS разрешение на публикацию в очереди SQS, добавив следующий образец политики в очередь SQS, как показано ниже, а также как описано здесь:

    {
      "Statement": [{
        "Effect":"Allow",
        "Principal":"*",
        "Action":"sqs:SendMessage",
        "Resource":"arn:aws:sqs:us-east-2:123456789012:MyQueue",
        "Condition":{
          "ArnEquals":{
            "aws:SourceArn":"arn:aws:sns:us-east-2:123456789012:MyTopic"
          }
        }
      }]
    }

Вы можете найти полный код в github здесь: https://gist.github.com/syumaK/79c946ed4e6180c1 / а>

Надеюсь это поможет.

person syumaK    schedule 09.12.2019
comment
В каком месте вашего кода вы добавляете политику в очередь? - person elcharrua; 19.12.2019