2016-04-22 4 views
3

Sie können eine Datei über boto3 von einem RequesterPays S3 Eimer herunterladen, wie folgt:Wie Boto3 (oder andere Python) verwenden, um den Inhalt eines _RequesterPays_ S3-Buckets aufzulisten?

s3_client.download_file('aws-naip', 'md/2013/1m/rgbir/38077/{}'.format(filename), full_path, {'RequestPayer':'requester'}) 

Was ist, kann ich nicht herausfinden, wie die Objekte in dem Eimer Liste ... ich einen Authentifizierungsfehler erhalten, wenn Ich versuche, objects.all() auf dem Bucket aufzurufen.

Wie kann ich mit boto3 den Inhalt eines RequesterPays-Buckets aufzählen? Bitte beachten Sie, dass dies eine besondere Art von Eimer ist, wo der Anforderer die S3-Gebühren bezahlt.

Antwort

0

Von boto3 können wir sehen, dass es eine #S3.Client.list_objects Methode gibt. Dies kann dazu verwendet werden, um Objekte aufzuzählen:

import boto3 
s3_client = boto3.client('s3') 
resp = s3_client.list_objects(Bucket='RequesterPays') 

# print names of all objects 
for obj in resp['Contents']: 
    print 'Object Name: %s' % obj['Key'] 

Ausgang:

Object Name: pic.gif 
Object Name: doc.txt 
Object Name: page.html 

Wenn Sie eine 401 dann stellen Sie sicher bekommen, dass IAM Benutzer den Aufruf der API s3:GetObject Berechtigungen auf den heißen Stein hat.

+0

Ich denke, die letzte Hälfte dieser Antwort ist wahrscheinlich die wahre Antwort. Unter der Haube ruft 'objects.all'' list_objects' auf, so dass das Ablegen auf den Low-Level-Client das Problem nicht löst. Es ist wahrscheinlich ein Erlaubnisproblem. –

+1

Diese Antwort ist nicht korrekt, da der Name des Buckets 'aws-naip' und 'RequesterPays' eine Eigenschaft ist, die Sie mit einigen boto3-Methoden (kein Bucket-Name) festlegen. RequesterPays bezieht sich auf einen bestimmten Anforderungsheader, der wie folgt aussehen würde, wenn er einer Anfrage hinzugefügt wird: {'RequestPayer': 'Requester'} –

0

Sie müssen die RequestPayer Kwarg an die list_objects Methode übergeben.

Auch nach dem boto3 docs,

Hinweis: ListObjectsV2 wird die überarbeitete Liste Objekte API und wir empfehlen Ihnen, diese überarbeitete API für die Entwicklung neuer Anwendungen

dass zusammen mit Paginierung Putting würde wie folgt aussehen:

import boto3 
s3_client = boto3.client('s3') 

def get_keys(bucket, prefix, requester_pays=False): 
    """Get s3 objects from a bucket/prefix 
    optionally use requester-pays header 
    """ 
    extra_kwargs = {} 
    if requester_pays: 
     extra_kwargs = {'RequestPayer': 'requester'} 

    next_token = 'init' 
    while next_token: 
     kwargs = extra_kwargs.copy() 
     if next_token != 'init': 
      kwargs.update({'ContinuationToken': next_token}) 

     resp = s3_client.list_objects_v2(
      Bucket=bucket, Prefix=prefix, **kwargs) 

     try: 
      next_token = resp['NextContinuationToken'] 
     except KeyError: 
      next_token = None 

     for contents in resp['Contents']: 
      key = contents['Key'] 
      yield key 

und würde wie

verwendet werden
x = list(get_keys('aws-naip', 'co', requester_pays=True)) 
0

hatte ich das gleiche Problem ist also hier der Code:

import boto3 

s3 = boto3.resource('s3') 

for bucket in s3.buckets.all(): 
    print(bucket.name) 

client = boto3.client('s3') 

result= client.list_objects(Bucket='bucketname',RequestPayer='requester') 
for o in result['Contents']: 
    print(o['Key']) 

Die Antwort auf die Abfrage ist ein Wörterbuch, und in diesem Wörterbuch gibt es ein anderes Wörterbuch namens Inhalte wo die Schlüssel sind die Pfade zu Die Objekte. Sie können die Antwortfelder in dem folgenden Link überprüfen: List_objects documentation

Hinweis: list_objects zurück bis 1000 Inhalte, so würden Sie mit der next_marker Eigenschaft haben, iterieren (Ich werde diese Antwort aktualisieren, wenn Sie die vollständige Liste mögen) . Ich denke, Sie haben bereits herausgefunden, wie Sie den Zugriffsschlüssel und den geheimen Schlüssel einrichten. Lassen Sie es mich wissen, wenn Sie weitere Informationen dazu benötigen.

Verwandte Themen