¿Cómo desplegar aplicaciones Flask como funciones de AWS Lambda con Zappa?
Tags: aws, flask, zappa, lambda
Published: 2023-11-13 18:16:59

En el mundo de la computación en la nube, la arquitectura serverless ha ganado una popularidad creciente debido a su eficiencia y escalabilidad. AWS Lambda, un servicio que permite ejecutar código sin servidor en respuesta a eventos específicos. Si eres un desarrollador de Python y quieres aprovechar la potencia de AWS Lambda para desplegar tu aplicación Flask, estás en el lugar correcto. En este artículo, te guiaré paso a paso a través del proceso de despliegue utilizando Zappa, una herramienta que simplifica la integración de aplicaciones Flask con AWS Lambda.

## ¿Qué es Flask?

Flask es un marco de desarrollo web en Python que ofrece una forma fácil y rápida de crear aplicaciones web pequeñas o medianas, proporcionando una base sólida y extensible para desarrolladores de todos los niveles de experiencia.

Al ser un marco de microservicios, Flask se adapta especialmente bien a aplicaciones pequeñas o medianas, APIs, prototipos rápidos o proyectos que no requieran de una estructura compleja.

## ¿Qué es Zappa?

Zappa es una herramienta de código abierto que facilita el despliegue de aplicaciones web de Flask y Django en AWS, permitiendo que los desarrolladores aprovechen la arquitectura serverless de AWS para ejecutar sus aplicaciones de manera eficiente y económica en la nube.

## ¿Qué es AWS Lambda?

Es un servicio de computación sin servidor (serverless) proporcionado por AWS que permite a los desarrolladores ejecutar código de manera escalable sin tener que administrar servidores.

Algunas de las ventajas de utilizar Zappa para desplegar aplicaciones web en AWS Lambda son:

-     Escalabilidad automática: AWS Lambda escala automáticamente la infraestructura para manejar la carga de solicitudes, sin intervención manual del desarrollador.
-     Pago por uso: Solo se paga por el tiempo de ejecución de las funciones, lo que permite ahorrar costos en comparación con mantener servidores en funcionamiento continuo.
-     Alta disponibilidad: AWS Lambda y API Gateway están diseñados para ser altamente disponibles, lo que garantiza que la aplicación se mantenga accesible incluso en caso de fallas en un centro de datos.
-     Fácil integración con otros servicios de AWS: Como parte del ecosistema de AWS, las aplicaciones desplegadas con Zappa pueden integrarse fácilmente con otros servicios de AWS, como bases de datos, almacenamiento, autenticación, entre otros.

## Requerimientos

- Phyton (por el momento Zappa solamente acepta versión de 3.6 a 3.10)
-     Credenciales AWS (permisos para s3 y lambda)

Nota: asegúrate de tener las credenciales configuradas correctamente en tu máquina sobre los siguientes archivos:

    %USERPROFILE%\.aws\config
    %USERPROFILE%\.aws\credentials

## Paso a paso

Para desplegar una aplicación Flask como una función AWS Lambda utilizando Zappa, sigue los siguientes pasos:

### Paso 1: Configurar el entorno virtual

Para evitar conflictos con otras dependencias, es recomendable crear un entorno virtual para nuestro proyecto, además es una solicitud de Zappa para poder trabajar correctamente. Así que abre una terminal y ejecuta los siguientes comandos:

```
# Crear entorno virtual
python -m venv venv

# Activar entorno virtual (Windows)
venv\Scripts\activate`
```

### Paso 2: Instalar Flask y Zappa

Dentro de tu entorno virtual, instala Flask y Zappa usando pip:

```
# Instalación de flask y zappa
pip install flask zappa
```

### Paso 3: Crea tu aplicación Flask

Ahora, crea tu aplicación Flask en un archivo Python. En este ejemplo vamos a definir nuestro archivo app.py de la siguiente manera:

```
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return '¡Hola Mundo! Esta es la respuesta de una aplicación Flask desplegada en AWS Lambda con Zappa'
```

Para probarla localmente puedes usar el siguiente comando:

```
# Levantar flask localmente para pruebas
flask run
```

Esto te dará acceso local a tu aplicación bajo la dirección: http://127.0.0.1:5000/

### Paso 4: Inicializar Zappa

Con nuestra aplicación Flask lista, inicializamos Zappa dentro del directorio de proyecto:

```
# Inicializar Zappa
zappa init
```

Al realizar este paso, en la consola nos realizará un par de preguntas respecto al nombre del proyecto, ubicación del proyecto, región de despliegue, ambiente y nombre del bucket de s3 donde se resguarda el código.

Con la respuesta de estas preguntas, se generará un archivo zappa_settings.json en la raíz del proyecto. Este archivo es donde se configuran los detalles de despliegue de la función Lambda.
Paso 5: Despliegue de la aplicación Flask en AWS Lambda

Una vez que se haya configurado el archivozappa_settings.json, es hora de desplegar nuestra aplicación en AWS Lambda con el siguiente comando:

```
# Sentencia global
zappa deploy {ambiente}

# Sentencia para desplegar todo lo que tengamos como proyecto y ambientes 
zappa deploy  --all

# Nuestra sentencia para probar
zappa deploy dev
```

Zappa se encargará de empacar la aplicación, crear los recursos necesarios en AWS y proporcionar una URL para acceder a nuestra aplicación.

Con estos pasos, deberías tener tu aplicación Flask desplegada como una función AWS Lambda utilizando Zappa. Ahora puedes acceder a tu aplicación a través de la URL proporcionada por Zappa, que estará disponible en la salida del comando de despliegue. Ten en cuenta que Zappa también te permite escalar y gestionar tu aplicación de manera sencilla, por lo que es una herramienta útil para desplegar aplicaciones web de Flask en AWS Lambda.

### Pasos opcionales.

Actualizar aplicación: si realizas cambios en tu aplicación Flask y deseas actualizar la función Lambda, simplemente ejecuta el siguiente comando:

```
# Actualizar aplicación 
zappa update {env}

# Si en la actualización se ocupa una dependencia, generar requeriments.txt
pip freeze > requirements.txt
```

Eliminar aplicación: se utiliza para eliminar la función AWS Lambda y los recursos relacionados que se crearon durante el proceso de despliegue de la aplicación. Es importante tener en cuenta que los recursos se eliminarán definitivamente y no podrán recuperarse.

```
# Borrar despliegue de la aplicación
zappa undeploy {env}
```

Aquí te dejo el código en GitHub:
https://github.com/bgalicia/desplegar-app-flask-como-lambda-con-zappa

El video de la demo en YouTube:
https://youtu.be/d-2RiELu-Vs?si=Qmq0Gra8YFGcUVgc

## Conclusión

En esta ocasión hemos aprendido cómo desplegar una aplicación Flask en AWS Lambda utilizando Zappa. Con esta combinación de tecnologías, puedes aprovechar la flexibilidad y escalabilidad de la nube de Amazon para ejecutar aplicaciones Flask sin la necesidad de administrar servidores. Aprovecha la arquitectura serverless y Zappa para llevar tus aplicaciones web a nuevas alturas con AWS Lambda. ¡Espero que encuentres esta guía útil y que puedas empezar a desplegar tus aplicaciones Flask con Zappa hoy mismo!