我建立了 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,請完成下列步驟:
- 使用下列存取政策在帳戶 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 建立的佇列名稱
- 在帳戶 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 鍵和值
- 識別附加至帳戶 A 中 AWS Glue Spark 任務的 AWS IAM 角色。然後,將 Amazon SQS 所需的許可授予該角色。例如,將 AWS 受管政策 AmazonSQSFullAccess 附加至此 AWS IAM 角色。如需詳細資訊,請參閱為 AWS Glue 設定 IAM 許可。
- 執行帳戶 A 中建立的 AWS Glue ETL 任務。
- 若要驗證該任務是否已完成,請檢查該任務是否已將訊息傳送至帳戶 B 中的 Amazon SQS 佇列。
- 若要接收帳戶 B 中 Amazon SQS 佇列中的訊息,請輪詢佇列中的訊息。如需詳細資訊,請參閱在 Amazon SQS 中接收和刪除訊息。
- 驗證您可以在佇列中檢視從帳戶 A 傳送的訊息。
相關資訊
管理 Amazon SQS 佇列