我建立了 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 佇列 (主控台)