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

Python 使用boto3从公共S3存储桶下载文件,python,boto3,Python,Boto3,我无法下载文件,甚至无法使用bot3获得publicS3存储桶的列表 下面的代码适用于我自己的bucket,但不适用于公共bucket: def s3_list(bucket, s3path_or_prefix): bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'], aws_secret_access_key=settings.AWS['SE

我无法下载文件,甚至无法使用
bot3
获得publicS3存储桶的列表

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

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
错误。该存储桶不在我自己的存储桶中,我无法在该存储桶中设置权限,但我确信它是开放给公众阅读的。

我过去也遇到过类似的问题。我在中找到了此错误的密钥

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

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')]

到目前为止,您尝试过什么公共bucket?问题中的代码片段对我来说很有用,但您也可以直接使用
s3=boto3.resource('s3')
,而不是显式创建
boto3.Session
对象。我尝试过使用's3://nasanex/MODIS'bucketwo为什么会被否决?这似乎是正确的解决方案。这是关键的更改:
client.meta.events.register('choose-signer.s3.',botocore.handlers.disable_signing)
这是有效的,因为这意味着请求没有被本地帐户“签名”,因此不需要本地凭据。我写了一个要点: