使用 boto3 从 AWS S3 Bucket 下载文件会导致 ClientError: An error occurred (403): Forbidden

Posted

技术标签:

【中文标题】使用 boto3 从 AWS S3 Bucket 下载文件会导致 ClientError: An error occurred (403): Forbidden【英文标题】:Downloading files from AWS S3 Bucket with boto3 results in ClientError: An error occurred (403): Forbidden 【发布时间】:2019-09-11 16:41:51 【问题描述】:

我正在尝试使用https://db.humanconnectome.org 提供的访问密钥 ID 和秘密访问密钥从 s3 存储桶下载文件。但是,即使我能够导航数据库并找到文件(因为我已经通过 aws cli 配置了我的凭据),但尝试下载它们会导致以下错误: “botocore.exceptions.ClientError:调用HeadObject操作时发生错误(403):禁止”

使用相同的凭据,我可以浏览相同的数据库并通过 Cyber​​duck 等云存储浏览器手动下载文件,因此 Cyber​​duck 访问数据的方式不会引发 403 Forbidden 错误。

我还验证了 boto3 能够访问我的 aws 凭据,并且还尝试通过硬编码它们。

我尝试下载数据的方式非常简单,并复制了 boto3 文档示例:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-example-download-file.html

s3 = boto3.client('s3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_KEY,)

s3.download_file(Bucket=BUCKET_NAME, Key=FILE_KEY, Filename=FILE_NAME)

这应该将文件下载到 FILE_NAME 给出的位置和文件,但会调用 403 Forbidden 错误。

【问题讨论】:

尝试确保您拥有正确的 s3 存储桶名称和正确的文件密钥。根据docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html 如果您没有对该存储桶的 ListObject 权限,您将获得 403(拒绝访问)而不是 404(“没有这样的密钥”)。所以错误代码可能有点误导。 【参考方案1】:

下载文件时,您还需要传递存储桶区域。尝试使用 CLI 配置 region 或在创建客户端时传递 region_name

s3 = boto3.client('s3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_KEY,
    region_name=AWS_REGION)

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html

【讨论】:

尽管在我的情况下指定了区域,但仍然不起作用:(【参考方案2】:

我知道这听起来可能很荒谬,但请确保您的存储桶名称中没有拼写错误或类似的内容。

我工作了很长时间试图解决这个问题,却发现我在为我的 s3 存储桶设置的 env 变量中添加了一个额外的字母。

他们给你一个禁止错误而不是“未找到”错误,这很奇怪,但他们确实这样做了。

【讨论】:

以上是关于使用 boto3 从 AWS S3 Bucket 下载文件会导致 ClientError: An error occurred (403): Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

AWS CLI 和 BOTO3 开发工具包(权限问题)

Boto3 从 S3 存储桶下载所有文件

如何使用 boto3 将 S3 对象保存到文件中

从 boto3 检索 S3 存储桶中的子文件夹名称

无法在特定区域中创建s3存储桶

AWS s3bucket“只能将str(不是“NoneType”)连接到str”