Gesti贸n de archivos con AWS S3, Python y Flask

    Introducci贸n

    Uno de los factores impulsores clave para el crecimiento de la tecnolog铆a son los datos. Los detalles ahora son cada vez m谩s importantes sobre las herramientas que se crean a medida que avanza la tecnolog铆a. Ahora es un factor impulsor del crecimiento de la tecnolog铆a, c贸mo recopilar, almacenar, proteger y distribuir datos.

    Este crecimiento de datos ha llevado a un aumento en el uso de la arquitectura en la nube para almacenar y administrar datos mientras se minimiza el problema requerido para mantener la consistencia y precisi贸n. Como consumidores de tecnolog铆a, estamos generando y consumiendo datos y, como resultado, hemos necesitado sistemas elaborados para ayudarnos a administrar los datos.

    La arquitectura de la nube nos brinda la capacidad de cargar y descargar archivos desde m煤ltiples dispositivos mientras estamos conectados a Internet. Y eso es parte de lo que AWS nos ayuda a lograr a trav茅s de los buckets S3.

    驴Qu茅 es S3?

    Servicio de almacenamiento simple de Amazon (S3) es una oferta de Amazon Web Services (AWS) que permite a los usuarios almacenar datos en forma de objetos. Est谩 dise帽ado para servir a usuarios de todo tipo, desde empresas hasta peque帽as organizaciones o proyectos personales.

    S3 se puede utilizar para almacenar datos desde im谩genes, video y audio hasta copias de seguridad o datos est谩ticos de sitios web, entre otras cosas.

    Bucket S3 es un recurso de almacenamiento designado que se utiliza para almacenar datos en AWS. Es como una carpeta que se utiliza para almacenar datos en AWS. Los dep贸sitos tienen nombres 煤nicos y, seg煤n la serie y el precio, los usuarios obtienen diferentes niveles de redundancia y accesibilidad a diferentes precios.

    Los privilegios de acceso en S3 Buckets tambi茅n se pueden especificar a trav茅s de la Consola de AWS, la herramienta AWS CLI o mediante las API y bibliotecas proporcionadas.

    驴Qu茅 es Boto3?

    Boto3 Es un kit de desarrollo de software (SDK) que proporciona AWS para la interacci贸n con las API de S3 y otros servicios como Nube inform谩tica el谩stica (EC2). Con Boto3, podemos enumerar todos los buckets de S3, crear instancias EC2 o controlar cualquier cantidad de recursos de AWS.

    驴Por qu茅 utilizar S3?

    Siempre podemos proporcionar nuestros propios servidores para almacenar y hacer que nuestros datos sean accesibles desde una variedad de dispositivos en Internet, entonces, 驴por qu茅 deber铆amos usar S3 AWS? Hay algunos casos en los que es conveniente.

    Primero, AWS S3 elimina todo el trabajo involucrado y los costos de construir y mantener servidores que almacenan nuestros datos. No tenemos que preocuparnos por conseguir el hardware para alojar nuestros datos o el personal necesario para mantener la infraestructura. En cambio, podemos centrarnos por completo en nuestro c贸digo y asegurarnos de que nuestros servicios est茅n en las mejores condiciones.

    Al utilizar S3, tenemos que aprovechar las incre铆bles capacidades de rendimiento, disponibilidad y escalabilidad de AWS. Nuestro c贸digo podr谩 escalar de manera eficiente y operar bajo cargas pesadas y estar谩 altamente disponible para nuestros usuarios finales. Debemos lograr esto sin construir o administrar la infraestructura detr谩s de 茅l.

    AWS proporciona herramientas para ayudarnos con el an谩lisis y la auditor铆a, as铆 como con la administraci贸n y los informes de nuestros datos. Podemos ver y analizar c贸mo se accede a los datos de nuestros dep贸sitos o incluso c贸mo se replican en otras regiones para mejorar el acceso del usuario final a los datos. Nuestros datos est谩n encriptados y almacenados de forma segura para que permanezcan seguros.

    A trav茅s de AWS Lambda, tambi茅n podemos responder a los datos cargados o descargados de nuestros buckets S3 y responder a los usuarios a trav茅s de alertas o informes configurados para una experiencia m谩s personalizada e inmediata como se espera de la tecnolog铆a.

    Establecimiento de AWS

    Para comenzar con S3, necesitamos configurar una cuenta en AWS o inicie sesi贸n en uno existente.

    Tambi茅n necesitaremos configurar una herramienta AWS CLI para poder interactuar con nuestros recursos desde la l铆nea de comandos, que est谩 disponible para Mac, Linux y Windows.

    Podemos instalarlo ejecutando:

    $ pip install awscli
    

    Una vez configurada la herramienta CLI, podemos generar nuestras credenciales en nuestro perfil desplegable y usarlas para configurar nuestra herramienta CLI de la siguiente manera:

    $ aws configure
    

    Este comando nos dar谩 consejos para nuestro Access Key ID, Secret Access Key, regiones predeterminadas y formatos de salida. Se pueden encontrar m谩s detalles sobre la configuraci贸n de la herramienta CLS AWS aqu铆.

    Nuestra aplicaci贸n – FlaskDrive

    Arreglo

    Creemos una aplicaci贸n Flask que permita a los usuarios cargar y descargar archivos desde y hacia nuestros buckets S3, alojados en AWS.

    Usaremos el SDK de Boto3 para facilitar estas operaciones y eliminar frentes simples para permitir a los usuarios cargar los archivos y verlos como alojados en l铆nea.

    Es recomendable utilizar un entorno virtual cuando se trabaja en proyectos de Python, y para este usaremos el Pipenv una herramienta para crear y gestionar nuestro entorno. Una vez instalado, creamos y activamos nuestro entorno con Python3 de la siguiente manera:

    $ pipenv install --three
    $ pipenv shell
    

    Necesitamos instalar ahora Boto3 y Flask necesario para construir nuestra aplicaci贸n FlaskDrive de la siguiente manera:

    $ pipenv install flask
    $ pipenv install boto3
    

    Implementaci贸n

    Despu茅s de configurarlo, necesitamos crear los dep贸sitos para almacenar nuestros datos y podemos lograrlo dirigi茅ndonos a la consola de AWS y S3 seleccion谩ndolo en el men煤 Servicios.

    Despu茅s de crear un dep贸sito, podemos usar la herramienta CLI para ver los dep贸sitos que tenemos disponibles:

    $ aws s3api list-buckets
    {
        "Owner": {
            "DisplayName": "robley",
            "ID": "##########################################"
        },
        "Buckets": [
            {
                "CreationDate": "2019-09-25T10:33:40.000Z",
                "Name": "flaskdrive"
            }
        ]
    }
    

    Ahora crearemos las funciones para cargar, descargar y listar archivos en nuestros buckets S3 usando el SDK de Boto3, comenzando con el upload_file funci贸n:

    def upload_file(file_name, bucket):
        """
        Function to upload a file to an S3 bucket
        """
        object_name = file_name
        s3_client = boto3.client('s3')
        response = s3_client.upload_file(file_name, bucket, object_name)
    
        return response
    

    El es upload_file la funci贸n toma un archivo y el nombre del dep贸sito y carga el archivo dado a nuestro dep贸sito S3 en AWS.

    def download_file(file_name, bucket):
        """
        Function to download a given file from an S3 bucket
        """
        s3 = boto3.resource('s3')
        output = f"downloads/{file_name}"
        s3.Bucket(bucket).download_file(file_name, output)
    
        return output
    

    El es download_file la funci贸n toma un nombre de archivo y un dep贸sito y lo descarga en una carpeta que especifiquemos.

    def list_files(bucket):
        """
        Function to list files in a given S3 bucket
        """
        s3 = boto3.client('s3')
        contents = []
        for item in s3.list_objects(Bucket=bucket)['Contents']:
            contents.append(item)
    
        return contents
    

    La funci贸n list_files Se utiliza para recuperar los archivos de nuestro dep贸sito S3 y enumerar sus nombres. Usaremos estos nombres para descargar los archivos de nuestros dep贸sitos de S3.

    Con nuestro archivo de interacci贸n S3 en su lugar, podemos construir nuestra aplicaci贸n Flask para proporcionar la interfaz basada en web para la interacci贸n. La aplicaci贸n ser谩 una simple aplicaci贸n Flask de cualquier archivo con fines de visualizaci贸n con la siguiente estructura:

    .
    鈹溾攢鈹 Pipfile       # stores our application requirements
    鈹溾攢鈹 __init__.py
    鈹溾攢鈹 app.py        # our main Flask application
    鈹溾攢鈹 downloads     # folder to store our downloaded files
    鈹溾攢鈹 s3_demo.py    # S3 interaction code
    鈹溾攢鈹 templates
    鈹   鈹斺攢鈹 storage.html
    鈹斺攢鈹 uploads       # folder to store the uploaded files
    

    La funcionalidad principal de nuestra aplicaci贸n Flask residir谩 en el app.py archivo:

    import os
    from flask import Flask, render_template, request, redirect, send_file
    from s3_demo import list_files, download_file, upload_file
    
    app = Flask(__name__)
    UPLOAD_FOLDER = "uploads"
    BUCKET = "flaskdrive"
    
    @app.route("https://Pharos.sh.com/")
    def entry_point():
        return 'Hello World!'
    
    @app.route("/storage")
    def storage():
        contents = list_files("flaskdrive")
        return render_template('storage.html', contents=contents)
    
    @app.route("/upload", methods=['POST'])
    def upload():
        if request.method == "POST":
            f = request.files['file']
            f.save(os.path.join(UPLOAD_FOLDER, f.filename))
            upload_file(f"uploads/{f.filename}", BUCKET)
    
            return redirect("/storage")
    
    @app.route("/download/<filename>", methods=['GET'])
    def download(filename):
        if request.method == 'GET':
            output = download_file(filename, BUCKET)
    
            return send_file(output, as_attachment=True)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    Esta es una aplicaci贸n Flask simple con 4 puntos finales:

    • El es /storage es el punto final de la p谩gina de destino donde mostraremos los archivos actuales en nuestro dep贸sito S3 para descargar, y tambi茅n la entrada para que los usuarios carguen archivos en nuestro dep贸sito S3,
    • El es /upload se utilizar谩 un punto final para recuperar un archivo y luego llamar al upload_file() m茅todo que carga un archivo en un dep贸sito de S3
    • El es /download endpoint encontrar谩 un nombre de archivo y usar谩 el download_file() m茅todo para descargar el archivo al dispositivo del usuario

    Y finalmente, nuestra plantilla HTML ser谩 tan simple como:

    <!DOCTYPE html>
    <html>
      <head>
        <title>FlaskDrive</title>
      </head>
      <body>
        <div class="content">
            <h2>Flask Drive: S3 Flask Demo</h2>
            <p>Welcome to this AWS S3 Demo</p>
            <div>
              <h2>Upload your file here:</h2>
              <form method="POST" action="/upload" enctype=multipart/form-data>
                <input type=file name=file>
                <input type=submit value=Upload>
              </form>
            </div>
            <div>
              <h2>These are your uploaded files:</h2>
              <p>Click on the filename to download it.</p>
              <ul>
                {% for item in contents %}
                  <li>
                    <a href="/download/{{ item.Key }}"> {{ item.Key }} </a>
                  </li>
                {% endfor %}
              </ul>
            </div>
        </div>
      </body>
    </html>
    

    Una vez que nuestro c贸digo y carpetas est谩n configurados, iniciamos nuestra aplicaci贸n con:

    $ python app.py
    

    Cuando navegamos a http://localhost:5000/storage damos la bienvenida a la siguiente p谩gina de destino:

    Ahora carguemos un archivo usando el campo de entrada y aqu铆 est谩 la salida:

    Podemos confirmar la carga comprobando nuestro panel de S3, y luego podemos obtener nuestra imagen:

    Nuestro archivo se carg贸 correctamente desde nuestra m谩quina a S3 AWS Storage.

    En nuestra p谩gina de inicio de FlaskDrive, podemos descargar el archivo simplemente haciendo clic en el nombre del archivo y luego aparece el mensaje para guardar el archivo en nuestras m谩quinas.

    Conclusi贸n

    En esta publicaci贸n, hemos creado una aplicaci贸n Flask que almacena archivos en el S3 de AWS y nos permite descargar los mismos archivos desde nuestra aplicaci贸n. Usamos la biblioteca Boto3 junto con la herramienta CLS AWS para manejar la interacci贸n entre nuestra aplicaci贸n y AWS.

    Eliminamos la necesidad de tener nuestros propios servidores para manejar el almacenamiento de nuestros archivos y aprovechar la infraestructura de Amazon para manejarlo por nosotros a trav茅s del AWS Simple Storage Service. Nos tom贸 un tiempo desarrollar, implementar y poner nuestra aplicaci贸n a disposici贸n de los usuarios finales y ahora podemos mejorarla para agregar permisos entre otras funciones.

    El c贸digo fuente de este proyecto est谩 disponible aqu铆 en Github.

    Etiquetas:

    Deja una respuesta

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