2014-12-04 9 views
8

Ho accesso S3 solo a una directory specifica in un bucket S3.Python boto, elenca i contenuti di una specifica dir in bucket

Per esempio, con il comando s3cmd se provo a elencare tutta la benna:

$ s3cmd ls s3://my-bucket-url 

ottengo un errore: Access to bucket 'my-bucket-url' was denied

Ma se provo accedere a una directory specifica nel secchio, mi può vedere il contenuto:

$ s3cmd ls s3://my-bucket-url/dir-in-bucket 

Ora voglio collegarmi al secchio S3 con python boto. Analogamente con:

bucket = conn.get_bucket('my-bucket-url') 

ottengo un errore: boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden

Ma se provo:

bucket = conn.get_bucket('my-bucket-url/dir-in-bucket') 

Lo script bancarelle per circa 10 secondi, e stampa un errore dopo. Bellow è la traccia completa. Qualche idea su come procedere con questo?

Traceback (most recent call last): 
    File "test_s3.py", line 7, in <module> 
    bucket = conn.get_bucket('my-bucket-url/dir-name') 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 471, in get_bucket 
    return self.head_bucket(bucket_name, headers=headers) 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 490, in head_bucket 
    response = self.make_request('HEAD', bucket_name, headers=headers) 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 633, in make_request 
    retry_handler=retry_handler 
    File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 1046, in make_request 
    retry_handler=retry_handler) 
    File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 922, in _mexe 
    request.body, request.headers) 
    File "/usr/lib/python2.7/httplib.py", line 958, in request 
    self._send_request(method, url, body, headers) 
    File "/usr/lib/python2.7/httplib.py", line 992, in _send_request 
    self.endheaders(body) 
    File "/usr/lib/python2.7/httplib.py", line 954, in endheaders 
    self._send_output(message_body) 
    File "/usr/lib/python2.7/httplib.py", line 814, in _send_output 
    self.send(msg) 
    File "/usr/lib/python2.7/httplib.py", line 776, in send 
    self.connect() 
    File "/usr/lib/python2.7/httplib.py", line 1157, in connect 
    self.timeout, self.source_address) 
    File "/usr/lib/python2.7/socket.py", line 553, in create_connection 
    for res in getaddrinfo(host, port, 0, SOCK_STREAM): 
socket.gaierror: [Errno -2] Name or service not known 
+0

Forse si dovrebbe usare 'my-secchio-url/dir-a-bucket' invece di' my-secchio-url/my-bucket-url' nello script? –

+0

scusate, si è trattato di un errore durante il tentativo di rimuovere i nomi bucket e dir effettivi. –

risposta

16

Per impostazione predefinita, quando si esegue una chiamata get_bucket in boto si tenta di convalidare che in realtà hanno accesso a quel secchio eseguendo una richiesta HEAD sull'URL secchio. In questo caso, non vuoi che boto faccia ciò poiché non hai accesso al bucket stesso. Quindi, fare questo:

bucket = conn.get_bucket('my-bucket-url', validate=False) 

e allora si dovrebbe essere in grado di fare qualcosa di simile alla lista di oggetti:

for key in bucket.list(prefix='dir-in-bucket'): 
    <do something> 

Se continui a ricevere un 403 errror, prova ad aggiungere uno slash alla fine del il prefisso

for key in bucket.list(prefix='dir-in-bucket/'): 
    <do something> 
+0

grazie, questo ha funzionato per me, avevo solo bisogno di aggiungere una barra ('/') alla fine del nome del bucket, altrimenti ho ancora l'errore 403. –

+0

Sì, questo ha senso. Ho approvato la tua modifica per il mio esempio. Felice del suo lavoro per te. – garnaat

+0

Perché è necessario il "/" finale? Posso confermare che è richiesto nel mio caso, ma non ho potuto trovare la documentazione di esso. – dbn

0

Se si desidera elencare tutti gli oggetti di una cartella nel bucket, è possibile specificarlo durante l'elenco.

import boto 
conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
bucket = conn.get_bucket(AWS_BUCKET_NAME) 
for file in bucket.list("FOLDER_NAME/", "/"): 
    <do something with required file> 
+0

L'OP ha detto che 'get_bucket' gli stava dando un 403 – ChrisWue

Problemi correlati