Amazon Web Service Con Python pt2



@eduardo_gpg

Número de visitas 1220

Tiempo de lectura 4 min

21 Octubre 2020

Bienvenido a este nuevo post del curso de AWS con Python. 😃

En una entrega anterior aprendimos a configura nuestro entorno AWS con Python, además de consumir el servicio s3 con client. Algo que sin duda fue super interesante 😎 ya que ahora podemos almacenar nuestra información de forma segura mediante los servidores de amazon.

Para este nuevo post haremos uso de resource como método de acceso a los servicios de AWS con Python. Aprendemos a conectar nuestros scripts con el servicio s3. Bien, sin más dilación comencemos.

Resource

Cómo mencionamos anteriormente (post anterior) haremos uso de client siempre y cuando deseemos utilizar los servicios de AWS mediante una interfaz de bajo nivel, por otro lado , haremos uso de resouce cuando deseemos utilizar los servicios de AWS mediante una interfaz de alto nivel. ¿En qué se traduce todo esto? Fácil, en la legibilidad del código. ✍

Veamos, nuevamente utilicemos el servicio s3 de amazon. Ahora mediante resource.

import boto3

s3 = boto3.resource('s3')

Cómo podemos observar, realizar una instancia de tipo ServiceResource es muy fácil. Basta con utilizar la función resource y pasar como argumento el servicio a utilizar, que en este caso es s3.

Una vez con la instancia, podremos realizar todas las operaciones mencionadas anteriormente. Por ejemplo.

Crear bucket

Para crear un bucket haremos uso del método create_bucket, pasando como argumento el nombre del Bucket a crear y ciertos datos de configuraciones.

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

Aquí un pequeño tip. Si al crear un nuevo bucket deseamos que este se encuentre en nuestra region por default, debemos acceder a nuestra sesión de AWS y hacer uso de ella. Esto mediante el atributo region_name.

# Accedemos a nuestra session AWS
session = boto3.session.Session()

# Obtenemos nuestra region por default
region = session.region_name

s3.create_bucket(Bucket='pywombatv2',
                CreateBucketConfiguration={
                    'LocationConstraint': region
                }
            )

Esto es super útil, ya que no habrá necesidad de hard codear la región, evitando así posibles errores.🤠

Subir archivos

Ahora hablemos de subir archivos. Si recuerdas, utilizando una instancia de client___ junto con su método __uploard_file pudimos subir archivos locales a nuestro bucket de s3.

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

Sin embargo, al nosotros utilizar resource existen 2 formas de realizar esta misma tarea.

  • Mediante una instancia de Object.
  • Mediante una instancia de Bucket

Recordemos, ahora nos encontramos trabajando mediante una interfaz de algo nivel. 😃

Veamos. Comencemos con una instancia de Object.

Para ello debemos utilizar la clase Object pasando como argumento el nombre del bucket a utilizar y la llave del objeto. Posteriormente, una vez con la instancia creada, utilizamos el método upload_file, pasando como argumento la dirección del archivo que deseamos subir.

s3_object = s3.Object('pywombatv2', key='main.py')
s3_object.upload_file('./main.py')

Ahora, con una instancias de Bucket.

En este caso será necesario utilizar la clase Bucket, pasando como argumento el bucket a utilizar. Una vez con dicha instancia ejecutamos el método upload_file, pasando como argumentos la llave del objeto a crear y el archivo a subir.

bucket = s3.Bucket('pywombatv2')
bucket.upload_file('main.py', './main.py')

Descargar archivos

Para descargar archivos sucede exactamente lo mismo, podemos hacerlo mediante un objeto Object o un objeto Bucket. En ambos casos haremos uso del método download_file, pasando como argumento la dirección en nuestro sistema donde deseamos almacenar el archivo.

Objeto

s3_object.upload_file('./main.py')
s3_object.download_file('./tmp/main.py')

Bucket

bucket = s3.Bucket('pywombatv2')
bucket.download_file('main.py', './tmp/main.py')

Eliminar archivos

Para eliminar archivos, cómo quizás ya te lo estes imaginando, existen 2 formas de hacerlo. Sí, así es, mediante una instancia de Object o una instancia a bucket. Eso sí, los métodos cambian muchísimo. 🧐

Object

s3_object = s3.Object('pywombatv2', key='main.py')
s3_object.delete()

Para el bucket será necesario pasar como argumento al método delete_objects el listado de objetos a eliminar. En mi caso solo uno, main.py.

Bucket

bucket = s3.Bucket('pywombatv2')
response = bucket.delete_objects(
    Delete={
        'Objects': [
            {
                'Key': 'main.py',
            },
        ],
    }
)

Aquí de forma personal recomiendo ampliamente utilizar una instancia Object sobre Bucket, ya que creo, el código se vuelve mucho más legible.

Renombrar archivos.

Para renombrar archivos, contrario a lo que uno puede pensar, no existe método, o instancia alguna que realice esta tarea de forma perse, sin embargo ejecutando un par de acciones es posible "emular" dicha operación. Veamos.

Para ello será necesario primero será necesario realizar una copia del objeto a renombrar utilizando el nuevo nombre. Una vez el objeto haya sido creado (con el nuevo nombre), procedemos a eliminar el objeto base, el objeto con el nombre viejo.

s3 = boto3.resource('s3')

s3.Object(bucket, new_mediafile_key).copy_from(CopySource=bucket +  '/' + old_mediafile_key)
s3.Object(bucket, old_mediafile_key).delete()
s3.Object(bucket, new_mediafile_key).Acl().put(ACL='public-read')

Para crear un nuevo objeto a partir de uno ya existente, es decir, realizar una copia, haremos uso del método copy_from.


Perfecto, estas serían las operaciones básicas que podemos hacer utilizando resource y el servicio de AWS con Python. Para este post trabajamos principalmente con los objetos de tipo Object y Bucket, objetos que sin duda alguna no serán de mucha utilidad al momento de administrar nuestros contenedores. De

Cómo pudimos observar al nosotros utilizar source sobre client nuestro código se vuelve mucho más legible, fácil de comprender, y sobre todo fácil de mantener. Así que, siempre que tengas la oportunidad te recomiendo ampliamente utilices source sobre cliente.

En la próxima entrega estaremos ahora utilizando el servicio de Amazon Polly, para pode crear nuestros propios archivos de voz a través de texto. Será un tutorial bastante interesante, así que no te lo puedes perder.

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 despido, hasta la próxima. ☕


¿El contenido te resulto de ayuda?

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