¿Qué es AWS?

AWS es un proveedor de servicios en la nube cuyo objetivo es proporcionar almacenamiento, recursos de computación, aplicaciones móviles, bases de datos y más funcionalidades relacionadas con la computación en la nube. Pero, ¿qué es la computación en nube? La computación en la nube permite acceder a un gran volumen de información relacionada con la actividad de una empresa sin invertir en una infraestructura para acceder y disponer de ella. El ahorro en hardware, software, seguridad, soporte, mantenimiento, etc. es realmente significativo.

Uno de sus componentes básicos es AWS S3, el servicio de almacenamiento de objetos que ofrece AWS. Su impresionante accesibilidad y durabilidad lo han convertido en una referencia para almacenar vídeos, imágenes y datos. Puedes combinar S3 con otros servicios para crear aplicaciones infinitamente escalables.

AWS

En concreto, Boto3 permite interactuar con Amazon Web Services, pero ¿qué es Boto3? Aquí, la referencia oficial de Amazon sobre su SDK (Software development kit):

El SDK de AWS para Python (Boto3) proporciona una API de Python para los servicios de infraestructura de AWS. Al usar el SDK para Python, puedes construir aplicaciones sobre Amazon S3, Amazon EC2, Amazon DynamoDB, y más.

Esto es solo un breve resumen de AWS y su SDK en Python para crear, actualizar y eliminar directamente los recursos de AWS desde tus scripts de Python. Hoy voy a explicar los conceptos básicos sobre AWS SDK centrándome en la gestión del bucket de S3:

  • Instalación.
  • Configuración.
  • Cliente vs Recurso (Tipo de conexión).
  • Operaciones comunes.
  • Gestión de archivos.

Instalación

Instala la última versión de Boto3 empleando pip:

Configuración

Antes de empezar a utilizar Boto3, debes configurar las credenciales de autenticación. Si ya tienes un usuario IAM que tiene acceso completo a S3, puedes utilizar esas credenciales de usuario (tu clave de acceso y tu clave de acceso secreta) sin necesidad de crear un nuevo usuario. Si no, puedes crear un nuevo usuario sólo con la política AmazonS3FullAccess y luego almacenar las nuevas credenciales.

Esta pantalla mostrará las credenciales generadas por el usuario. Haz click en el botón Download.csv para hacer una copia de las credenciales.

Ahora que tienes tu nuevo usuario, necesitas crear un nuevo archivo, ~/.aws/credentials:

Abre el archivo y pegue las credenciales que acaba de descargar con la estructura siguiente, rellenando los marcadores de posición:

Guarda el archivo.

Ahora que has configurado estas credenciales, tienes un perfil predeterminado que Boto3 utilizará para interactuar con tu cuenta de AWS.

Hay una configuración más que establecer: la región por defecto con la que Boto3 debe interactuar. (AWS Service Endpoint). Elige la región que prefieras, por ejemplo eu-west-1 (Irlanda).

Crea un nuevo archivo, ~/.aws/config y rellénalo con esta estructura.

Guarda el archivo. Ahora estamos listos para el resto de este tutorial.

A continuación, verás las diferentes opciones que te da Boto3 para conectarte a S3 y otros servicios de AWS.

AWS

Cliente vs Recurso

En esencia, todo lo que hace Boto3 es llamar a la API de AWS en tu nombre. Para la mayoría de los servicios de AWS, Boto3 ofrece dos formas distintas de acceder a estas API abstractas:

  • Cliente: acceso a servicios de bajo nivel.
  • Recurso: acceso al servicio orientado a objetos de nivel superior.

Puedes utilizar cualquiera de las dos para interactuar con S3.

Para conectarse a la interfaz de cliente de bajo nivel, se debe utilizar la función client() de Boto3. A continuación, introduce el nombre del servicio al que quieres conectarte, en este caso, s3:

Para conectarse a la interfaz de alto nivel, se sigue un enfoque similar, pero utilizando resource():

Tras conectarte con éxito a ambas versiones, te estarás preguntando: “¿Cuál debo usar?”.

Con los clientes, hay más trabajo de programación que hacer. La mayoría de las operaciones de cliente te dan una respuesta en forma de diccionario. Para obtener la información exacta que necesitas, tendrás que analizar ese diccionario por ti mismo. Con los métodos de recursos, el SDK hace ese trabajo por ti.

Con el cliente, es posible que veas algunas ligeras mejoras de rendimiento. La desventaja es que tu código se vuelve menos legible de lo que sería si estuvieras usando el recurso. Los recursos ofrecen una mejor abstracción, y tu código será más fácil de comprender.

Comprender cómo se generan el cliente y el recurso también es importante a la hora de considerar cuál elegir:

  • Boto3 genera el cliente a partir de un archivo de definición de servicio JSON. Los métodos del cliente admiten todos los tipos de interacción con el servicio de AWS de destino.
  • Los recursos, por otro lado, se generan a partir de archivos de definición de recursos JSON.

Boto3 genera el cliente y el recurso a partir de definiciones diferentes. Como resultado, puedes encontrar casos en los que una operación soportada por el cliente no sea ofrecida por el recurso. Aquí está la parte interesante: no necesitas cambiar tu código para usar el cliente en todas partes. Para esa operación, puede acceder al cliente directamente a través del recurso de la siguiente manera: s3_resource.meta.client.

Una de estas operaciones de cliente es .generate_presigned_url(), que te permite dar a tus usuarios acceso a un objeto dentro de tu bucket durante un periodo de tiempo determinado, sin necesidad de que tengan credenciales de AWS.

Operaciones comunes

En esta sección adjuntamos los fragmentos de código que nos ayudarán a realizar diferentes operaciones con AWS S3:

Crear un bucket:

Eliminar un bucket con ficheros:

Subir archivos:

Conclusión

Espero que tras leer este artículo te resulte fácil adentrarte en la API Python de boto3, realizar tu primera conexión a la infraestructura de computación en la nube de AWS y sacar provecho de su sistema de almacenamiento. Aquí, en Bounsel, utilizamos boto3 para conectar con la infraestructura de AWS y explotar sus capacidades. En particular, explotamos los buckets S3 de AWS para el almacenamiento masivo de documentos jurídicos, y también sus recursos de computación en la nube (como Cloud9) para entrenar a la máxima velocidad modelos de Inteligencia Artificial para ofrecerte funcionalidades increíbles, como el reconocimiento de entidades nombradas.