Wie behebe ich den Fehler „The specified queue does not exist or you do not have access to it.“, wenn ich einen AWS Glue Job ausführe, um Nachrichten an Amazon SQS in einer anderen Region zu senden?

Lesedauer: 4 Minute
0

Ich habe einen AWS Glue Job zum Extrahieren, Transformieren und Laden (ETL) erstellt, um Nachrichten an eine Warteschlange von Amazon Simple Queue Service (Amazon SQS) in einem anderen AWS-Konto und einer anderen Region zu senden. Wenn ich den Job ausführe, erhalte ich die Fehlermeldung „The specified queue does not exist or you do not have access to it.“

Kurzbeschreibung

Befindet sich die Amazon-SQS-Warteschlange in einer anderen Region als der Glue ETL Job, müssen Sie die Regionsinformationen übergeben, wenn Sie Nachrichten an die Amazon-SQS-Warteschlange senden. Andernfalls schlägt Ihr ETL Job mit dem folgenden Fehler fehl:

ERROR [main] glue.ProcessLauncher (Logging.scala:logError(70)): Exception in User Class: com.amazonaws.services.sqs.model.QueueDoesNotExistException :The specified queue does not exist or you do not have access to it. (Service: AmazonSQS; Status Code: 400; Error Code: AWS.SimpleQueueService.NonExistentQueue; Request ID: 3861e4c0-9b49-5404-a4c6-bcd3ed43fe20)

Behebung

Gehen Sie wie folgt vor, um einen AWS Glue Spark Job für Konto A in us-west-2 zu erstellen, mit dem Sie Nachrichten an Amazon SQS für Konto B in us-east-1 senden:

  1. Erstellen Sie eine Amazon-SQS-Warteschlange in Konto B mit der folgenden Zugriffsrichtlinie. Diese Zugriffsrichtlinie bietet Zugriff auf die AWS Identity and Access Management (IAM)-Rolle, die dem AWS Glue Spark Job in Konto A zugeordnet wäre. Sie können diese erforderlichen Berechtigungen auch einem bestimmten IAM-Benutzer (z. B. Testbenutzer) in Konto A gewähren. Weitere Informationen finden Sie unter Grundlegende Beispiele für Amazon-SQS-Richtlinien.
{
    "Version": "2008-10-17",
    "Id": "__default_policy_ID",
    "Statement": [
        {
            "Sid": "__owner_statement",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333444:role/GlueSparkJobIAMRole",
                    "arn:aws:iam::111122223333444:user/testuser"
                ]
            },
            "Action": "sqs:SendMessage",
            "Resource": "arn:aws:sqs:us-east-1:5555666677778888:test-queue"
        }
    ]
}

Ersetzen Sie den folgenden Text in der obigen Richtlinie:

  • 111122223333444 mit der AWS-Konto-ID für Konto A.
  • 5555666677778888 mit der AWS-Konto-ID für Konto B.
  • testuser mit dem Namen des IAM-Benutzers in Konto A.
  • GlueSparkJobIAMRole mit der IAM-Rolle, die dem AWS Glue Spark Job in Konto A zugeordnet ist.
  • test-queue mit dem Namen der Warteschlange, die in Konto B erstellt wurde.
  1. Erstellen Sie einen AWS Glue ETL Job in Konto A. Weitere Informationen finden Sie unter Hinzufügen von Aufträgen in AWS Glue. Wählen Sie auf der Seite Auftragseigenschaften konfigurieren die Option Ein neues Skript, das von Ihnen erstellt wird aus. Fügen Sie das Python-Skript in den Job ein, um eine Nachricht an die Amazon-SQS-Warteschlange in Konto B zu senden:
import boto3
sqs = boto3.client('sqs', region_name="us-east-1")
queue_url = 'https://sqs.us-east-1.amazonaws.com/5555666677778888/glue-queue'
response = sqs.send_message(
    QueueUrl=queue_url,
    DelaySeconds=10,
    MessageAttributes={
        'Title': {
            'DataType': 'String',
            'StringValue': 'The Whistler'
        },
        'Author': {
            'DataType': 'String',
            'StringValue': 'John Doe'
        },
        'WeeksOn': {
            'DataType': 'Number',
            'StringValue': '6'
        }
    },
    MessageBody=('Example message'))
print(response['MessageId'])

Ersetzen Sie im obigen Skript Folgendes:

  • us-east-1 mit der Region, in der sich die Amazon-SQS-Warteschlange befindet
  • 5555666677778888 mit der AWS-Konto-ID von Konto B
  • glue-queue mit dem Namen der Amazon-SQS-Warteschlange
  • Beispielnachricht mit der Nachricht, die an die SQS-Warteschlange gesendet werden soll

Ersetzen Sie die Nachrichtenattribute und die entsprechenden Werte im Skript durch die gewünschten Nachrichtenattribute und Werte.

  1. Identifizieren Sie die AWS Identify Access Management (AWS IAM)-Rolle, die dem AWS Glue Spark Job in Konto A zugeordnet ist. Erteilen Sie dann Amazon SQS die erforderlichen Berechtigungen für diese Rolle. Der Einfachheit halber können Sie die von AWS verwaltete Richtlinie AmazonSQSFullAccess an diese AWS-IAM-Rolle anhängen. Weitere Informationen finden Sie unter Einrichten von IAM-Berechtigungen für AWS Glue.

  2. Führen Sie den AWS Glue ETL Job aus, der in Konto A erstellt wurde.

  3. Stellen Sie sicher, dass der Job erfolgreich abgeschlossen wurde, indem Sie überprüfen, ob der Job die Nachricht an die Amazon-SQS-Warteschlange in Konto B gesendet hat.

  4. Um die Nachricht in der Amazon-SQS-Warteschlange in Konto B zu empfangen, fragen Sie nach der Nachricht in der Warteschlange. Weitere Informationen finden Sie unter Empfangen und Löschen von Nachrichten (Konsole).

  5. Stellen Sie sicher, dass Sie die von Konto A gesendeten Nachrichten in der Warteschlange sehen können.


Weitere Informationen

Verwaltung von Amazon-SQS-Warteschlangen (Konsole)

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren