Accediendo a S3 en AWS con s3fs y Python

AWS tiene un repositorio de datos abiertos. Tienes datos sobre observación de la tierra, meteorología, secuenciación del genoma, climatología, procesamiento del lenguaje natural,…

Estos datos están almacenados en Simple Storage Service (S3), que es un servicio de almacenamiento en la nube de Amazon Web Services (AWS).

En el artículo de hoy vamos a ver como podemos acceder a estos datos libres almacenados y distribuidos mediante S3 en AWS usando Python y la biblioteca s3fs.

Los recursos a los que queremos acceder se almacenan en algo que AWS llama buckets. Un bucket lo podríamos ver como una unidad de almacenamiento en la nube (como un disco duro) y la biblioteca s3fs nos ayudará precisamente a eso, a ver y tratar ese bucket como si fuera una unidad de disco (s3fs viene de S3 y de File System (o sistema de ficheros)).

Para el ejercicio de hoy he elegido los datos sobre teselas del terreno (Terrain Tiles). El bucket se encuentra en elevation-tiles-prod. Podéis ver un mapa de estos datos aquí.

¿Empezamos a trastear? Como siempre, vamos a empezar importando algunas cosas que vamos a usar:

Vamos a ‘crear’ el sistema de ficheros. Como para acceder al bucket que vamos a usar no hace falta estar identificados lo haremos de forma anónima.

Vamos a var qué cosas útiles podemos tener en el objeto fs (instancia de S3FileSystem):

Lo anterior te debería de mostrar en pantalla algo parecido a lo siguiente:

Algunas de las cosas que se ven más arriba son nombres que nos pueden sonar similar a herramientas que usamos desde nuestra terminal: ls, glob, makedir, touch,…

Vamos a hacer, por ejemplo, un ls del bucket, recuerda que el bucket se llamaba elevation-tiles-prod. Uso la palabra clave detail para obtener un poco más de información:

Lo anterior te debería mostrar en pantalla algo parecido a:

Vemos que hay varios ficheros y directorios. Para ir un directorio de los indicados más arriba simplemente ponemos la ruta completa. Voy a hacerlo usando el directorio “geotiff”:

Lo anterior debería mostrar algo parecido a:

Creo que vais entendiendo como funciona esto. Voy a descargar unos cuantos GeoTiffs para ver cómo funciona lo de descargar la información que nos interese.

Los GeoTiffs están organizados en lo que se conoce como una pirámide de teselas. Podéis leer más sobre ello aquí. Básicamente, tenemos para cada nivel de zoom una carpeta para las ‘x’ y un fichero para cada ‘y’ dentro de esa ‘x’. Si quiero ir a la imagen que está en zoom=7, x=4 e y=10 la ruta será 7/4/10.tif.

En el listado resultado del código anterior vemos que tenemos rutas que acaban en números. Esos números corresponden al zoom o ‘z’.

Una vez leída la mini explicación anterior voy a descargar algunas imágenes a la máxima resolución (mayor zoom) en un directorio (local) que llamaré geotiffs.

Primero creo la carpeta geotiffs dentro del directorio desde donde estoy ejecutando el código:

Y ahora las descargo. Para descargarlas usamos el método get con la ruta en remoto (lo que me quiero descargar) y la ruta en local (donde lo quiero descargar):

Y, si no ha fallado nada, tendremos los ficheros descargados en nuestro PC.

Y, ya que hemos llegado hasta aquí, vamos a hacer algo con la información descargada. La información descargada muestra la elevación alrededor del K2. En este caso, este artículo es un triste y humilde homenaje a un alpinista que acaba de perder la vida en la montaña salvaje, Sergi Mingote.

Pintamos la información usando xarray y combinando todas las teselas que hemos descargado:

El gráfico con la información (además de la localización del K2 en la imagen) lo podemos obtener usando el código siguiente:

El anterior código os debería haber creado una figura llamada “terrain_tiles_k2.png” en la misma carpeta donde estés ejecutando el código.

El resultado final es:

Sed felices y mis condolencias a la familia y amigos de Sergi Mingote.

2 comentarios en «Accediendo a S3 en AWS con s3fs y Python»

  1. El instructivo es maravilloso y súper práctico. Pero lo mejor de todo es el homenaje a Sergi Mingote.

    Te mando un abrazo y muchas gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

− one = six