botocore.exceptions.DataNotFoundError:无法加载数据:sqs

sno*_*all -1 python botocore boto3

我正在尝试运行一个清除 AWS SQS 队列的函数,但我不断收到此错误:

DataNotFoundError(data_path = name)botocore.exceptions.DataNotFoundError:无法加载数据:sqs

我已经安装了python 3.7boto3-1.21.22botocore-1.24.22。我也跑了pip install --upgrade botocore,但仍然遇到同样的错误。

看图片

sqs_client = boto3.client('sqs', AWS_DEFAULT_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

def purge_queue(queue_url): 
    try:
        response = sqs_client.purge_queue(QueueUrl=queue_url)
    except ClientError as e:
        logger.exception("Unexpected exception! %s", e)
        raise
    else:
        return response
Run Code Online (Sandbox Code Playgroud)

jar*_*mod 5

您的代码未正确初始化 boto3 SQS 客户端。

除服务名称之外的所有内容都需要关键字参数,例如:

import boto3

sqs_client = boto3.client(
    "sqs",
    region_name=AWS_DEFAULT_REGION,
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)
Run Code Online (Sandbox Code Playgroud)

DataNotFoundError异常非常具有误导性,但确实是由于您未能正确提供关键字参数引起的。

您还可以正确提供 boto3.client 位置参数,但这意味着您必须提供所有以下参数:service_name、region_name、api_version、use_ssl、verify、endpoint_url、aws_access_key_id 和 aws_secret_access_key。这并不理想,这就是为什么在大多数情况下提供关键字参数更好的原因。

更深层次的潜水

botocore 代码尝试加载通常会在其中找到的命名服务(在您的情况下为“sqs”)的 JSON 服务定义,data/sqs/2012-11-05/service-2.json但代码错误地处理您传递的非 kwargs 参数。

具体来说,botocore 代码推断api_version第三个位置参数 实际上是您提供的 AWS 访问密钥,然后无法从 加载服务定义data/sqs/your-access-key/service-2.json。该代码认为您告诉它使用“your-access-key”的 API 版本(无论您在此处实际提供的 AKIA... 值)。

这也解释了为什么您选择在帖子中混淆错误消息。由于之前的混淆,错误消息实际上包含您的 AWS 访问密钥而不是 SQS API 版本号。

这一系列不寻常的事件是触发DataNotFoundError异常的原因,因为实际上 botocore 无法加载服务定义数据(因为它为其计算了错误的路径)。

无关

注意:如果区域和凭证可通过 IAM 角色或本地 AWS 凭证配置文件或在受支持的环境变量中使用,则通常根本不需要显式指示区域和凭证。请参阅凭据