我创建了一个 AWS Glue 提取、转换、加载(ETL)任务,用于向 Amazon Simple Queue Service(Amazon SQS)队列发送消息。但是 Amazon SQS 队列位于另一个 AWS 区域的另一个 AWS 账户中。运行任务时,出现“The specified queue does not exist or you do not have access to it.”错误。
简短描述
如果 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 用户(例如,测试用户)授予这些必需的权限。有关更多信息,请参阅 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 任务关联的 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 队列