Python boto, enumera el contenido de un directorio específico en el cubo

4 minutos de lectura

Avatar de usuario de Martin Taleski
Martín Talski

Tengo acceso de S3 solo a un directorio específico en un depósito de S3.

Por ejemplo, con el s3cmd comando si trato de enumerar todo el cubo:

    $ s3cmd ls s3://bucket-name

me sale un error: Access to bucket 'my-bucket-url' was denied

Pero si trato de acceder a un directorio específico en el depósito, puedo ver el contenido:

    $ s3cmd ls s3://bucket-name/dir-in-bucket

Ahora quiero conectarme al cubo S3 con python boto. Similarmente con:

    bucket = conn.get_bucket('bucket-name')

me sale un error: boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden

Pero si intento:

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

El script se detiene durante unos 10 segundos y luego muestra un error. Bellow es el seguimiento completo. ¿Alguna idea de cómo proceder con esto?

Tenga en cuenta que la pregunta es sobre el módulo boto versión 2, no boto3.

Traceback (most recent call last):
  File "test_s3.py", line 7, in <module>
    bucket = conn.get_bucket('bucket-name/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

  • Tal vez deberías usar my-bucket-url/dir-in-bucket en lugar de my-bucket-url/my-bucket-url en tu guion?

    – Alex Lisovoy

    4 de diciembre de 2014 a las 10:57


  • lo siento, eso fue un error al intentar eliminar los nombres reales del cubo y el directorio.

    – Martín Taleski

    4 de diciembre de 2014 a las 12:22

  • Debe usar llaves alrededor de object_summary.key para trabajar en python3. imprimir (objeto_resumen.clave)

    – Pecho Dimitrov

    26 de julio de 2018 a las 7:26

  • la parte más extraña es que Prefix=”dir_name” funcionó en mi máquina Linux, pero para ejecutar esto en lambda, es importante usar Prefix=”dir_name/”, no pude entender por qué la barra diagonal sería significativa para hacerlo trabajar en lambda.

    – yash

    9 de marzo de 2022 a las 22:44

  • ¿Cómo limitar la profundidad de búsqueda?

    – Gulzar

    25/12/2022 a las 17:00


  • tal vez debido a las diferencias del sistema operativo @yash

    – Gunesh Shanbhag

    25 de diciembre de 2022 a las 17:57

  • @Gulzar si sabe exactamente lo que quiere, no pagine, es costoso, podría usar más filtros str una vez que obtenga todos los nombres de archivo sin recuperar ningún dato.

    – yash

    28 de diciembre de 2022 a las 12:03

  • gracias, esto funcionó para mí, solo necesitaba agregar una barra inclinada (‘/’) al final del nombre del depósito, de lo contrario, todavía recibí el error 403.

    – Martín Taleski

    4 de diciembre de 2014 a las 13:04


  • Sí, eso tiene sentido. Aprobé su edición a mi ejemplo. Me alegro de que te funcione.

    – garnacha

    4 de diciembre de 2014 a las 13:18

  • ¿Por qué se necesita el final “/”? Puedo confirmar que se requiere en mi instancia, pero no pude encontrar documentación al respecto.

    – dbn

    13 de diciembre de 2016 a las 0:34

  • En general: ¿cuál es la diferencia entre optar por un enfoque basado en boto3.resource o boto3.cleint o boto3.session y qué enfoque seguir bajo qué condiciones?

    – v.j.

    25 de febrero de 2019 a las 10:51

  • Para cualquier confusión, se prefiere boto3.resource. También aquí está la diferencia entre cliente y recurso: stackoverflow.com/questions/42809096/…

    – Nagaraj Tantri

    12 de julio de 2021 a las 12:06


  • El OP mencionó que get_bucket le estaba dando un 403

    – ChrisWue

    28 de marzo de 2017 a las 1:06


  • ¿Cómo leo el contenido de un archivo en particular a una variable de esto?

    – RB17

    28 de agosto de 2019 a las 21:31

  • @Rahul Supongo que file.read() debería funcionar. Pero entonces tendré que comprobarlo una vez.

    – reetesh11

    30 de agosto de 2019 a las 5:25


  • @ChrisWue Eso podría deberse a una clave de acceso secreta incorrecta

    – reetesh11

    30 de agosto de 2019 a las 5:26

  • OP tiene acceso específico a un archivo o carpeta dentro de un depósito, pero no tiene acceso a un depósito. Estoy en la misma posición, puedo acceder a archivos y carpetas dentro de la GUI de AWS, pero no puedo hacer nada en boto3.

    –Michael Hayes

    5 sep 2021 a las 17:18

¿Ha sido útil esta solución?