我创建了 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 队列。此访问策略提供对 AWS Identity and Access Management (IAM) 角色的访问权限,该角色将附加到账户 A 中的 AWS Glue Spark 作业。您还可以为账户 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 中添加作业。在 Configure the job properties (配置作业属性) 页面上,请选择 A new script to be authored by you (由您编写的新脚本)。在作业中包含 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 队列的名称
- 示例消息替换为要发送到 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 队列(控制台)