如何解決在執行 AWS Glue 任務以將訊息傳送至不同區域中的 Amazon SQS 時發生的「指定的佇列不存在,或者您無權存取它。」錯誤?

2 分的閱讀內容
0

我建立了 AWS Glue 擷取、轉換和載入 (ETL) 任務,以將訊息傳送至不同 AWS 帳戶和區域中的 Amazon Simple Queue Service (Amazon SQS) 佇列。當我執行該任務時,收到如下錯誤:「指定的佇列不存在,或者您無權存取它。」

簡短描述

如果 Amazon SQS 佇列所在的區域與 Glue ETL 任務所在的區域不同,則在將訊息傳送至 Amazon SQS 佇列時必須傳遞區域資訊。否則,您的 ETL 任務會失敗,並出現以下錯誤:

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)

解決方法

若要為 us-west-2 中的帳戶 A 建立 AWS Glue Spark 任務,以將訊息傳送至 us-east-1 中帳戶 B 的 Amazon SQS,請執行下列動作:

1.    使用下列存取政策在帳戶 B 中建立 Amazon SQS 佇列。此存取政策可讓您存取將連接至帳戶 A 中 AWS Glue Spark 任務的 AWS Identity and Access Management (IAM) 角色。您也可以將這些必要許可授予帳戶 A 中的特定 IAM 使用者 (例如 testuser)。如需詳細資訊,請參閱 Amazon SQS 政策的基本範例

{
    "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"
        }
    ]
}

取代上述政策中的下列項目:

  • 111122223333444,取代為帳戶 A 的 AWS 帳戶 ID。
  • 5555666677778888,取代為帳戶 B 的 AWS 帳戶 ID。
  • testuser,取代為帳戶 A 中 IAM 使用者的名稱。
  • GlueSparkJobIAMRole,取代為連接至帳戶 A 中 AWS Glue Spark 任務的 IAM 角色。
  • test-queue,取代為帳戶 B 中建立的佇列名稱。

2.    在帳戶 A 中建立 AWS Glue ETL 任務。如需詳細資訊,請參閱在 AWS Glue 中新增任務。在設定任務屬性頁面上,選取由您編寫的新指令碼。在任務中包含 Python 指令碼,以將訊息傳送至帳戶 B 中的 Amazon SQS 佇列:

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'])

取代上述指令碼中的下列項目:

  • us-east-1,取代為 Amazon SQS 佇列所在的區域
  • 5555666677778888,取代為帳戶 B 的 AWS 帳戶 ID
  • glue-queue,取代為 Amazon SQS 佇列的名稱
  • Example message,取代為要傳送至 SQS 佇列的訊息

將指令碼中的訊息屬性和對應值取代為所需的訊息屬性和值。

3.    識別連接至帳戶 A 中 AWS Glue Spark 任務的 AWS Identify Access Management (AWS IAM) 角色。然後,將 Amazon SQS 所需的許可授予該角色。為了簡單起見,您可以將 AWS 受管政策 AmazonSQSFullAccess 連接至此 AWS IAM 角色。如需詳細資訊,請參閱為 AWS Glue 設定 IAM 許可

4.    執行帳戶 A 中建立的 AWS Glue ETL 任務。

5.    檢查該任務是否已將訊息傳送至帳戶 B 中的 Amazon SQS 佇列,以驗證該任務是否已成功完成。

6.    若要接收帳戶 B 中 Amazon SQS 佇列中的訊息,請輪詢佇列中的訊息。如需詳細資訊,請參閱接收和刪除訊息 (主控台)

7.    驗證您可以在佇列中檢視從帳戶 A 傳送的訊息。


相關資訊

管理 Amazon SQS 佇列 (主控台)

AWS 官方
AWS 官方已更新 3 年前