通过 boto3 下载 S3 存储桶对象时遇到问题。错误 403 HeadObject:禁止

Lew*_*ers 5 python amazon-s3 amazon-web-services boto3

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

botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden
Run Code Online (Sandbox Code Playgroud)

请参阅下面我的代码:

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')
Run Code Online (Sandbox Code Playgroud)

如有帮助,将不胜感激:)

谢谢

Nge*_*tor 7

HeadObject通常,当您在拥有权限的情况下看到 403 时s3:GetObject,这是因为s3:ListObjects未为存储桶提供权限并且您的密钥不存在。这是一项安全措施,旨在防止泄露有关存储桶中存在或不存在哪些对象的信息。当您同时拥有s3:GetObject存储桶中对象的权限和s3:ListObjects存储桶本身的权限时,对不存在的密钥的响应是 404“无此密钥”响应。如果您只有s3:GetObject权限并请求不存在的对象,则响应为 403“访问被拒绝”。