我如何解决对 Amazon SQS 队列进行 API 调用时出现的 QueueDoesNotExist 错误?

2 分钟阅读
0

我对 Amazon Simple Queue Service(Amazon SQS)队列进行了 API 调用,但收到“QueueDoesNotExist”错误。

解决方法

某些 Amazon SQS API 调用(如 GetQueueAttributesSendMessageDeleteMessage 可能会导致 QueueDoesNotExist 错误。要解决此错误,请执行以下步骤。

检查队列 URL 是否正确

检查请求中提供的队列 URL 是否正确且没有拼写错误。

重要说明: 如果目标队列类型为先入先出(FIFO),您必须在队列 URL 中附加 .fifo 后缀。

设置正确的区域

当向错误的 AWS 区域发出请求时,您会收到 QueueDoesNotExist 错误。SDK 和 AWS 命令行界面(AWS CLI)不会从队列 URL 中获取目标区域。而是由客户端配置设置此区域。

在进行 API 调用之前,应在 Amazon SQS 客户端上设置正确的区域。查看 Amazon SQS 客户端配置,确认您在客户端上配置了正确的区域。如果您未在客户端上配置区域,SDK 或 AWS CLI 会从配置文件或环境变量中选择该区域。当 SDK 未在配置文件中找到该区域时,SDK 默认会将该区域设置为 us-east-1

有关更多信息,请参阅 AWS 区域配置和凭证文件设置

如果 AWS CloudTrail 支持失败的 API 调用,则检查 AWS 账户中的所有区域是否存在失败的 Amazon SQS 操作。这可以帮助确定该区域是否是出现问题的原因。

您也可以激活 SDK 或 AWS CLI 上的调试日志,来检查请求的区域。调试日志会显示请求的目标主机,例如: 主机:sqs.us-east-1.amazonaws.com。

以下是其他调试日志资源:

注意: 要验证区域、账户或队列名称,请确保记录完整的队列详细信息。

检查最近删除的队列

队列在最近删除时,您可能会收到 QueueDoesNotExist 错误。确定失败的 API 调用的时间戳,然后检查 CloudTrail 在错误发生时是否有任何 PurgeQueue 操作。消息删除过程最长需要 60 秒。

如果队列是 AWS CloudFormation 或其他部署堆栈的一部分,当队列被删除时,也会发生此错误。堆栈更新或删除可能会导致队列被删除和重新创建。如果您在删除队列时对队列发起 API 调用,请求可能会失败。检查 CloudTrail 在错误发生时是否有任何 DeleteQueue 操作。

使用 GetQueueUrl 时指定目标队列账号

对于 API 调用,SDK 或 AWS CLI 通常从队列 URL 中获取目标队列账号。但是,GetQueueUrl API 调用不会在请求中提供队列的账户,因此默认情况下,请求将针对调用方账户发出。

如果请求针对跨账户队列,您必须将目标队列账号指定为 API 调用 QueueOwnerAWSAccountId 参数。

删除在超时窗口期内被移至 DLQ 的消息

对于配置了死信队列(DLQ)的标准 SQS 队列,消息将在重试后被移至 DLQ。消息被移至 DLQ 后,当您使用主队列中的旧 ReceiptHandle 执行 DeleteMessage 操作时,可能会出现 QueueDoesNotExist 错误。您必须在配置的 VisibilityTimeout 窗口期内删除消息。

确保请求方具有所需的 IAM 权限

如果请求 AWS Identity and Access Management(IAM)用户或角色没有所需的权限,您可能会收到以下错误: “指定的队列不存在或您无权访问该队列。”

使用 GetCallerIdentity API 调用确认 IAM 实体是否具有所需的权限。

在 Boto3 Python 中调用 GetCallerIdentity API:

import boto3
sts = boto3.client('sts')
print(sts.get_caller_identity())

如需获取 Amazon SQS 策略示例,请参阅 Amazon SQS 策略的基本示例

有关 Amazon SQS 权限的更多信息,请参阅访问 Amazon SQS 队列需要什么权限?

使用 AWS Support 进行故障排除

如果上述故障排除步骤无法解决您的问题,请联系 AWS Support。请提供失败 API 调用的 RequestId 和包含 timezonetimestamp

AWS 官方
AWS 官方已更新 6 个月前