2016-10-10 3 views
0

Ich kann keine Datei herunterladen oder eine Auflistung der öffentlichen S3-Bucket mit boto3.Herunterladen von Dateien aus öffentlichen S3-Bucket mit Boto3

Der folgende Code funktioniert mit meinem eigenen Eimer, aber nicht mit öffentlichen one:

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] 

Ich erhalte ein AccessDenied Fehler auf diesem Code. Der Bucket ist nicht in meinem Besitz und ich kann dort keine Berechtigungen setzen, aber ich bin mir sicher, dass er öffentlich lesbar ist.

+0

Welche öffentlichen Eimer Sie bisher versucht haben? – baldr

+1

Das Code-Snippet in der Frage funktioniert für mich mit den richtigen Anmeldeinformationen, obwohl Sie auch 's3 = boto3.resource ('s3')' direkt verwenden können, anstatt 'boto3.Session'-Objekt explizit zu erstellen. –

+1

Ich habe versucht, 's3: // nasanex/MODIS' Eimer zu verwenden –

Antwort

-1

Ich hatte das ähnliche Problem in der Vergangenheit. Ich habe einen Schlüssel zu diesem Fehler in https://github.com/boto/boto3/issues/134 gefunden.

Sie können undokumentierte Trick:

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