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

上次更新时间:2021 年 8 月 24 日

当我对 Amazon Simple Queue Service (Amazon SQS) 队列进行 API 调用时,收到类似于以下内容的 QueueDoesNotExist 错误:

“不存在针对此 wsdl 版本的指定队列。”

为什么我会收到此错误,该如何排查此问题?

解决方法

QueueDoesNotExist 错误可能是由各种 Amazon SQS API 调用导致的,包括 GetQueueAttributes、SendMessage 和 DeleteMessage。要排查此错误,请查看以下可能的原因和解决步骤:

队列 URL 不正确

确认请求中提供的队列 URL 是否正确且不包含拼写错误。

重要提示:如果目标队列类型为 FIFO,则必须将后缀 .fifo 附加到队列 URL。

区域不正确

向不正确的 AWS 区域发出请求时,会返回 QueueDoesNotExist 异常。软件开发工具包 (SDK) 和 AWS Command Line Interface (AWS CLI) 不会从队列 URL 中获取目标区域。相反,区域由客户端配置决定。

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

如果 AWS CloudTrail 支持失败的 API 调用,请针对失败的 Amazon SQS 操作验证客户账户中的所有区域。验证所有区域可以帮助确定该区域是否是导致问题的原因。

您还可以通过激活 SDK 或 AWS CLI 上的调试日志来确认请求的区域。调试日志会显示请求的目标主机。

示例:主机:sqs.us-east-1.amazonaws.com

队列最近被清除或删除

如果队列最近被清除,则您可能会暂时收到 QueueDoesNotExist 错误。确定失败的 API 调用的时间戳,然后确认 CloudTrail 在错误发生时间前后是否有任何 PurgeQueue 操作。

如果队列是 AWS CloudFormation 或类似部署堆栈的一部分,则在删除队列时也会出现此错误。对堆栈的更新或删除可能会导致队列被删除和重新创建。如果在删除过程中对队列进行了 API 调用,则请求可能会失败,并显示 QueueDoesNotExist 错误。确认 CloudTrail 在发生错误时是否有 DeleteQueue 操作。

跨账户 GetQueueUrl

对于 API 调用,SDK 或 AWS CLI 通常会从队列 URL 中获取目标队列账号。但是,GetQueueUrl API 调用不会在请求中提供队列的 AWS 账户。这意味着默认情况下,请求是针对调用方账户发出的。如果请求是针对跨账户队列的,则必须将目标队列账号指定为 API 调用 QueueOwnerAWSAccountId 的参数。

消息已移至死信队列

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

其他问题排查

如果您联系 AWS Support 进行其他问题排查,请务必确定失败的 API 调用的 RequestId时间戳


这篇文章对您有帮助吗?


您是否需要账单或技术支持?