2014-12-04 13 views
8

Mam dostęp S3 tylko do określonego katalogu w wiadrze S3.Python boto, lista zawartości konkretnego katalogu w wiadrze

Na przykład, komenda s3cmd jeśli próbuję wymienić całe wiadro:

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

pojawia się błąd: Access to bucket 'my-bucket-url' was denied

Ale gdy próbuję uzyskać dostęp do wybranej dir w wiadrze, ja można zobaczyć zawartość:

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

teraz chcę, aby połączyć się z S3 wiadra Pythona boto. Similary z:

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

pojawia się błąd: boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden

Ale gdy próbuję:

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

Skrypt stragany przez około 10 sekund, a następnie drukuje błąd później. Bellow to pełny ślad. Masz pomysł, jak to zrobić?

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

Może powinieneś użyć w swoim skrypcie 'my-bucket-url/dir-in-bucket' zamiast' my-bucket-url/my-bucket-url'? –

+0

Przepraszam, to był błąd przy próbie usunięcia prawdziwych nazw wiadra i dir. –

Odpowiedz

16

Domyślnie, kiedy wykonujesz get_bucket połączenia w boto stara się potwierdzić, że faktycznie mają dostęp do tego wiadra wykonując HEAD wniosek na zawartość wiadra. W tym przypadku nie chcesz tego robić, ponieważ nie masz dostępu do samego zasobnika. Więc to zrobić:

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

a następnie powinny być w stanie zrobić coś takiego do listy obiektów:

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

Jeśli wciąż dostać 403 errror, spróbuj dodać ukośnik na końcu prefiks.

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

dziękuję, to działało dla mnie, po prostu musiałem dodać ukośnik ("/") na końcu nazwy pojemnika, w przeciwnym razie nadal mam błąd 403. –

+0

Tak, to ma sens. Zatwierdziłem twoją edycję do mojego przykładu. Cieszę się, że działa dla ciebie. – garnaat

+0

Dlaczego konieczne jest końcowe "/"? Mogę potwierdzić, że jest to wymagane w mojej instancji, ale nie mogłem znaleźć jego dokumentacji. – dbn

0

Jeśli chcesz wyświetlić listę wszystkich obiektów w folderze w wiadrze, możesz określić go podczas wyświetlania.

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

OP wspomniał, że 'get_bucket' daje mu 403 – ChrisWue