如何解决在运行我的 AWS Glue 作业以向其他区域的 Amazon SQS 发送消息时出现的错误“指定的队列不存在或者您无权访问该队列。”?

2 分钟阅读
0

我创建了 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 队列(控制台)

AWS 官方
AWS 官方已更新 3 年前