Amazon Web Service Con Python

Fecha de publicación: 27 Septiembre 2020
Tiempo de lectura: 6 min.
Premium: False
Número de visitas: 234


Con una lista de más de 140 servicios, Amazon Web Services, también conocido como AWS, es sin duda alguna el líder indiscutible en cuanto a servicios web se refiere.

¿Quieres enviar múltiples correos electrónicos a tus clientes o que parece mensajes de texto? ¿Quieres trabajar bajo una arquitectura serverless o mejor aún, tener tu propio servidor para realizar tus pruebas?Y qué pensarías si te dijera que tu servidor puede escalar conforme a la demanda de tus usuarios, ¿No sería genial? Pues déjame decirte que todo esto y mucho, mucho más podrás encontrarlo en a AWS. 😎

El desarrollo esta en tendencia hacía la nube, es por ello que es indispensable conozcamos los servicios y plataformas lideres en el mercado, ya sea con Amazon, Google o Microsoft, por esta razón te doy la bienvenida a este nuevo mini curso de AWS con Python.

Un curso en el cual, mediante artículos y vídeos, aprenderemos a consumir diferentes servicios de AWS, esto por supuesto con nuestro lenguaje de programación favorito, Python. 🐍

Para comenzar, e inaugurar este nuevo curso, consumiremos uno de los servicios más populares que AWS nos ofrece, me refiero al servicio S3. Verás, este es un servicio de almacenamiento, con lo cual podremos almacenar diferentes tipos de archivos en la nube, ya sean imágenes, vídeos, audios o cualquier tipo de información que desees. Sí, el respaldo de tu base de datos también esta incluido.

Lo interesante de este servicio es la impresionante disponibilidad y durabilidad de los datos. Así que si pretendes utilizar S3para tus projectos, no te preocupes, tu información se encontrará cien por ciento segura.

Para que tu puedas tomar el curso será necesario poseas una cuenta activa en AWS, si aun no la tienes te comparto el link donde podrás crearla.

Bien, una vez dicho todo esto y sin más dilación, pongamos manos a la obra. 😄

Configuración

Para nosotros podamos consumir los servicios de AWS utilizando Python será necesario apoyarnos de un SDK, muy puntualmente del SDK boto3, así que procedamos a instalarlo. Es bastante sencillo.

pip install boto3

Una vez hayamos instalado el SDK será necesario establecer nuestras credenciales AWS, con las cuales podremos consumir los servicios a través de nuestra cuenta. Para ello existen un par de formas de hacerlo. Desde mi punto de vista la más sencilla es utilizando el CLI de Amazon.

Procedemos a instalarlo.

pip install awscli

Ahora configuramos nuestro entorno.

$ aws configure

Al hacer esto se nos pedirán 2 llaves (Key ID y Access Key), así como la región con la que trabajaremos. Si tú aun no posees dichas llaves será necesario crearlas. Para ello deberás ingresar a: Consola de administración de AWS y seleccionar el servicio IAM.

Una vez hecho esto harás clic en usuarios, y añadir nuevo usuario.

Durante el proceso de creación te recomiendo asignes el permiso AmazonS3FullAccess, para que tu usuario pueda utilizar todas las funcionalidades del S3 sin ningún problemas.

Una vez hayas creado tu usuario y poseas su par de llaves, vuelve a ejecutar el comando aws configure y configura tu entorno.

$ aws configure
AWS Access Key ID [****************QXX2]: 
AWS Secret Access Key [****************yQFO]: 
Default region name [us-east-2]:

Si todo ha salido bien se habrá generado el archivo credentials dentro de tu sistemas. Si deseas echarle un vistazo puedes utilizar con el comando cat.

cat ~/.aws/credentials

Deberías ver algo como lo siguiente:

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

Listo, ya tenemos nuestro entorno configurado, ahora procedamos a consumir el servicio S3.

Create Bucket

Para nosotros poder almacenar información en los servidores de Amazon será necesario hacerlo mediate Buckets; y verás, un bucket no es más que un contenedor de objetos. Y ahora, quizás te estes preguntando ¿Qué es un objeto? la respuesta es muy sencilla, un objeto no es más que un archivo y cualquier metadato que lo describa, así de simple. Por lo tanto podemos concluir que un bucket es un contenedor de archivos.

Ok, entonces lo primero que debemos hacer será crear nuestro propio Bucket, y para ello existen dos formas de hacerlo.

  • 1.- Hacerlo mediante el panel de administración. Esto desde el navegador.
  • 2.- Hacerlo utilizando Python (Por supuesto nos decantaremos por esta opción).

Toca el turno de utilizar Boto3. Este SDK nos ofrece 2 diferentes formas de acceder al API de AWS.

  • Cliente: Acceso al servicio a bajo nivel.
  • Resource: Acceso al servicio orientado a objetos, alto nivel.

Para este post, y para no complicarnos tanto, haremos todo utilizando el cliente. Para crear una instancia utilizamos la función client, y pasamos como argumento el servicio que deseamos consumir. En este caso s3.

import boto3

s3 = boto3.client('s3')

Para crear nuestro bucket haremos uso del método create_bucket.

s3.create_bucket(Bucket='customepywombat',
                    CreateBucketConfiguration={
                        'LocationConstraint': 'us-east-2'
                    }
                )

En el parámetro Bucket definiremos el nombre del bucket a crrear, y para el parámetro CreateBucketConfiguration, mediante la llave LocationConstraint, la locación del mismo.

Al ejecutar obtendremos como resultado un diccionario. Algo como lo siguiente.

{'ResponseMetadata': {'RequestId': '618CEDAA527E4B88',
  'HostId': 'vjZtqqBDw9GYkEEI84aEHBWiLvI5xPAOli+hG1tiIXf8T3X7iMRiTi8fcaoyYx0h1AVQ0qsMxds=',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'x-amz-id-2': 'vjZtqqBDw9GYkEEI84aEHBWiLvI5xPAOli+hG1tiIXf8T3X7iMRiTi8fcaoyYx0h1AVQ0qsMxds=',
   'x-amz-request-id': '618CEDAA527E4B88',
   'date': 'Sun, 27 Sep 2020 23:54:12 GMT',
   'location': 'http://customepywombat.s3.amazonaws.com/',
   'content-length': '0',
   'server': 'AmazonS3'},
  'RetryAttempts': 0},
 'Location': 'http://customepywombat.s3.amazonaws.com/'}

Aquí nos interesan dos llaves: HTTPStatusCode (que debería ser 200) y location, la uri de nuestro bucket.

Si todo ha salido bien deberíamos visualizar nuestro bucket desde el panel de administración. 🥳

Subir archivos

Listo, ahora toca el turno de subir nuestro primer objeto (archivo), para ello seguiremos utilizando el cliente de s3, y nos apoyaremos el método upload_file.

s3.upload_file(local_path, bucket, mediafile_key)

Como primer argumento indicamos la dirección en nuestro archivo a subir, como segundo argumento colocamos el bucket a utilizar, y finalmente, como tercer argumento, la llave del objeto (Que sería algo así como la dirección y el nombre del archivo).

Para este post subiré un archivo .py, sin embargo tu puedes subir el archivo que desees.

s3.upload_file('/Users/eduardo/Documents/thumbnail.py',
                'customepywombat',
                'newscript.py')

Al nosotros hacer esto indicamos que queremos almacenar (en mi caso) el archivo thumbnail.py, esto dentro del bucket customepywombat, con el nombre de newscript.py.

Lo interesante de almacenar archivos en buckets es la facilidad con la cual podemos obtenerlos. Por ejemplo, para este post he utilizando un par de imágenes las cuales tengo almacenadas en mi s3. 😯

Para crear un nuevo folder (Inclusive un subfolder) haremos uso del método put_\object, definimos el Bucket y el folder a crear.

Creamos el folder images.

s3.put_object(Bucket='customepywombat', Key='images/')

Creamos el subfolder thumbnails.

s3.put_object(Bucket='customepywombat', Key='images/thumbnails/')

Download file

Para descarga un archivo haremos uso del método download_file .

s3.download_file(bucket,  mediafile_key, local_path)

En este caso como primer argumento debemos colocar el bucket en donde se encuentra el archivo a descargar, como segundo argumento la llave del objeto, y como tercer argumento la dirección en nuestro sistema donde deseamos se almacene dicho archivo.

s3.download_file('customepywombat', 'thumbnail.py', 'tmp/thumbnail.py')

Ok, esto funciona, sin embargo ¿Qué pasa si el archivo a descargar es muy pesado? Pues bien en esos caso será haremos uso del método download_fileobj, el cual nos permitirá descargar el archivo como un objeto, en binario.

s3 = boto3.client('s3')
        with open(local_path, 'wb') as file:
            s3.download_fileobj(bucket, mediafile_key, file)

¿Bastante fácil no?

Si en dado caso nosotros deseemos obtener únicamente el contenido de un archivo, haremos uso del método get_object.

object_data = s3.get_object(Bucket='customepywombat', Key='thumbnail.py')
content =  object_data['Body'].read() # Nos retorna bytes

print('El contenido del archivo es', str(content))

Ojo, es importante mencionar que, a diferencia de los métodos previamente utilizados, el método get_object solo recibe valores de entrada mediante parámetros, que en este caso serían Bucket y Key.

El método get_object es Lazy load, por lo tanto no se obtendrá el objeto per se ni su contenido hasta que el método read sea llamando.

Listar contenido

Ya nos encontramos en la recta final de este post, y ahora aprenderemos a listar todos nuestros objetos en el bucket. Es bastante sencillo, para ello utilizamos el método list_objects.

for obj in s3.list_objects(Bucket='customepywombat')['Contents']:
   print(obj['Key'])

¿Y qué pasa si deseamos listar todos los objetos aplicando ciertas condiciones? por ejemplo, listar todos los objetos de un folder en especifico. En eso caso deberíamos hacer uso del método list_objects_v2, junto con el parámetro Prefix.

Por ejemplo, listemos todos los objetos dentro del folder image.

response = s3.list_objects_v2(Bucket='customepywombat', Prefix='images/')

contents = response.get('Contents', [])

for obj in content:
    print(obj['Key'])

Cool, visualizamos en consola todos los objetos y sub folders de mi carpeta images.

Todos esto funciona, sin embargo déjame decirte que existe otras forma mucho más sencilla, y legible de lograr el mismo resultado. Esto utilizando source. Veamos.

Listado de todos los objetos en el bucket.

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('customepywombat')

for obj in bucket.objects.all():
    print(obj.key)

Listado de todos los objetos en mi folder images.

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('customepywombat')

# Y como que si de Django se tratara .filter
for obj in bucket.objects.filter(Prefix='images/'):
    print(obj.key)

Desde mi punto de vista se comprende mucho mejor, ya que estamos trabajando con una instancia de bucket. Sabemos de antemano que todos los métodos se ejecutaran sobre dicho contenedor, algo que puede ser ambiguo utilizando client.

Por ejemplo, al ejecutar el método all sabemos que obtendremos como resultado todos los objetos de ese bucket, y con el método filter se comprende que aplicamos un filtro sobre dichos objetos. 😱


Y listo, esta sería la primera entrega de esta serie de artículos y vídeos que comprende el mini curso de AWS con Python. En esta ocasión aprendimos a consumir el servicio S3, pudiendo crear nuestro propio bucket, crear nuevos folder y por supuesto, subir y descargar archivos. En la gran parte de este tutorial nos centramos en trabajar con el client, pero como pudimos observar en la recta final, esta no es la única forma de consumir los servicios, ya que podemos hacer uso de resource, algo que recomiendo ampliamente.

En la próxima entrega trabajaremos sources y veremos las principales diferencias que existen client.

Espero el tutorial haya sido de tu agrado, si es así me gustaría nos lo hicieras saber en la sección de comentarios, y no olvides subscribirte para tener acceso a todo el contenido de la plataforma. Sin más yo me despidos, hasta la próxima. ☕

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍

Comentarios

Para poder conocer tu opinión es necesario ser un usuario autenticado. Login