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

2 分的閱讀內容
0

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

簡短說明

如果 Amazon SQS 佇列位於與 AWS Glue 任務不同的 AWS 區域,則傳送到佇列的訊息必須包含區域資訊。如果您未傳遞訊息中的區域資訊,則您的 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)

解決方法

假設您在 AWS 區域 us-west-2 中有一個名為帳戶 A 的 AWS 帳戶,而在區域 us-east-1 中有另一個名為帳戶 B ** 的帳戶。若要在帳戶 A** 中建立 AWS Glue Spark 任務,以將訊息傳送到帳戶 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 中設定 Spark 任務的任務屬性
    若要將訊息傳送至帳戶 B 中的 Amazon SQS 佇列,請在任務中包含 Python 指令碼:
    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'])
    注意:取代上一個指令碼中的以下內容:
    5555666677778888,取代為
    帳戶 B
    的 AWS 帳戶 ID
    glue-queue,取代為 Amazon SQS 佇列的名稱
    包含 AWS Glue 任務將傳送到 Amazon SQS 佇列的訊息的範例訊息
    包含您自己的金鑰和值的 MessageAttributes 鍵和值
  3. 識別附加至帳戶 A 中 AWS Glue Spark 任務的 AWS IAM 角色。然後,將 Amazon SQS 所需的許可授予該角色。例如,將 AWS 受管政策 AmazonSQSFullAccess 附加至此 AWS IAM 角色。如需詳細資訊,請參閱為 AWS Glue 設定 IAM 許可
  4. 執行帳戶 A 中建立的 AWS Glue ETL 任務。
  5. 若要驗證該任務是否已完成,請檢查該任務是否已將訊息傳送至帳戶 B 中的 Amazon SQS 佇列。
  6. 若要接收帳戶 B 中 Amazon SQS 佇列中的訊息,請輪詢佇列中的訊息。如需詳細資訊,請參閱在 Amazon SQS 中接收和刪除訊息
  7. 驗證您可以在佇列中檢視從帳戶 A 傳送的訊息。

相關資訊

管理 Amazon SQS 佇列

AWS 官方
AWS 官方已更新 5 個月前