【问题标题】:Trouble downloading S3 bucket objects through boto3. Error 403 HeadObject: Forbidden通过 boto3 下载 S3 存储桶对象时遇到问题。错误 403 HeadObject:禁止
【发布时间】:2020-10-28 17:42:35
【问题描述】:

我知道这里还有其他关于此问题的帖子,但我仍在努力寻找正确的解决方案。我正在尝试使用以下 python 脚本在 S3 存储桶(我可以访问)中下载一组特定对象。运行脚本时,第一个对象成功下载,但随后抛出此错误 (403):

botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden

见下面我的代码:

import csv
import boto3
import re
import logging
from botocore.exceptions import ClientError

prod_number_array_bq = []
prod_number_array_s3 = []
with open('bq-results-20191218-151637-rshujisvqrri.csv') as csv_file:
    csv_reader = csv.reader(csv_file,delimiter=',')
    line_count = 0
    for row in csv_reader:
        sliced = re.sub("[^0-9]", "", str(row))
        prod_number_array_bq.append(sliced)

s3 = boto3.resource('s3')
bucket = s3.Bucket('********')

for key in bucket.objects.all():
    sliced = re.sub("[^0-9]", "", str(key.key))
    if((set(sliced) & set(prod_number_array_bq))!=""):
            bucket.download_file(key.key,sliced + '.txt')

我们将不胜感激:)

谢谢

【问题讨论】:

  • 大概你没有权限去 HEAD 有问题的对象。检查对象的所有权(它是否由另一个 AWS 账户拥有?)如果看起来没问题,您是否有任何 S3 存储桶策略、IAM 策略或 S3 对象 ACL 会限制您对该对象的凭证?

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

通常当您在 HeadObject 上看到 403 时,尽管拥有 s3:GetObject 权限,这是因为没有为存储桶提供 s3:ListObjects 权限并且您的密钥不存在。这是一种安全措施,可防止暴露有关哪些对象在您的存储桶中或不在您的存储桶中的信息。当您同时拥有存储桶中对象的s3:GetObject 权限和存储桶本身的s3:ListObjects 权限时,对不存在的键的响应是404“没有这样的键”响应。如果您只有s3:GetObject 权限并请求不存在的对象,则响应为 403“拒绝访问”。

【讨论】:

    【解决方案2】:

    就我而言,我可以读取文件但无法下载

    所以我下面会打印文件信息

    resp = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=origin)
    print(resp)
    

    但是这会给出botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden 错误

    s3_client.download_file(bucket_name, origin, destination) 
    

    问题是模型是从不同的 AWS 账户上传的。我们在上传时缺少 ACL。所以,

    所以我们使用以下命令上传文件

    s3_client.upload_file(origin,
                          bucket_name,
                          destination,
                          ExtraArgs={'ACL':'bucket-owner-full-control'})
    

    这导致我们按预期读取和下载文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2014-12-21
      • 2021-04-30
      • 2020-08-12
      • 2017-05-29
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多