Python boto, le contenu de la liste de spécifique dir dans le seau
J'ai S3 uniquement l'accès à un répertoire spécifique dans un compartiment S3.
Par exemple, avec la s3cmd
commande si j'essaie de la liste de l'ensemble de seau:
$ s3cmd ls s3://my-bucket-url
J'obtiens une erreur: Access to bucket 'my-bucket-url' was denied
Mais si j'essaie d'accéder à un niveau particulier dir dans le seau, je peux voir le contenu:
$ s3cmd ls s3://my-bucket-url/dir-in-bucket
Maintenant je veux me connecter à la S3 seau avec python boto. De même avec:
bucket = conn.get_bucket('my-bucket-url')
J'obtiens une erreur: boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
Mais si j'essaie:
bucket = conn.get_bucket('my-bucket-url/dir-in-bucket')
Le script stands pendant environ 10 secondes, et affiche une erreur par la suite. Soufflet est la trace complète. Une idée de comment procéder?
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
Peut-être que vous devriez utiliser
désolé, c'était une erreur lorsque vous essayez de supprimer le réel seau et dir noms.
my-bucket-url/dir-in-bucket
au lieu de my-bucket-url/my-bucket-url
dans votre script?désolé, c'était une erreur lorsque vous essayez de supprimer le réel seau et dir noms.
OriginalL'auteur Martin Taleski | 2014-12-04
Vous devez vous connecter pour publier un commentaire.
Par défaut, lorsque vous effectuez une
get_bucket
appel dans boto il essaie de valider que vous avez réellement l'accès à ce seau en effectuant uneHEAD
demande sur le seau URL. Dans ce cas, vous ne voulez pas boto à le faire car vous n'avez pas accès au compartiment lui-même. Donc, faites ceci:et puis, vous devriez être en mesure de faire quelque chose de ce genre pour les objets de la liste:
Si vous obtenez toujours une Erreur 403, essayez d'ajouter une barre oblique à la fin du préfixe.
Oui, cela a du sens. J'ai approuvé votre modifier pour mon exemple. Content de son travail pour vous.
Pourquoi est-ce la fin "/" nécessaire? Je peux confirmer qu'il est nécessaire dans mon cas, mais je n'arrivais pas à trouver de la documentation.
OriginalL'auteur garnaat
Pour boto3
OriginalL'auteur M.Vanderlee
Boto3 client:
À l'aide de session
OriginalL'auteur spicyramen
Si vous voulez la liste de tous les objets d'un dossier dans votre seau, vous pouvez le spécifier lors de l'inscription.
get_bucket
était de lui donner une 403OriginalL'auteur reetesh11