使用boto3从公共S3存储桶下载文件

时间:2016-10-10 17:34:09

标签: python boto3

我无法下载文件,甚至无法获取带有boto3公共 S3存储桶列表。

下面的代码适用于我自己的存储桶,但不适用于公共存储桶:

def s3_list(bucket, s3path_or_prefix):
    bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'],
                             aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'],
                             region_name=settings.AWS['REGION_NAME'])
    s3 = bsession.resource('s3')
    my_bucket = s3.Bucket(bucket)
    items = my_bucket.objects.filter(Prefix=s3path_or_prefix)
    return [ii.key for ii in items]

我在此代码上遇到AccessDenied错误。这个桶不是我自己的,我不能在那里设置权限,但我相信它是公开阅读的。

1 个答案:

答案 0 :(得分:0)

过去我遇到过类似的问题。我在https://github.com/boto/boto3/issues/134找到了这个错误的关键。

您可以使用未记录的技巧:

import botocore


def s3_list(bucket, s3path_or_prefix, public=False):
    bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'],
                             aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'],
                             region_name=settings.AWS['REGION_NAME'])
    client = bsession.client('s3')
    if public:
        client.meta.events.register('choose-signer.s3.*', botocore.handlers.disable_signing)
    result = client.list_objects(Bucket=bucket, Delimiter='/', Prefix=s3path_or_prefix)
    return [obj['Prefix'] for obj in result.get('CommonPrefixes')]