bash

ehoyos/

main

cowsay "Bienvenido"

CI/CD pipeline en AWS para despliegue de aplicación CRUD Flask en ECS usando Terraform

Este proyecto usa Infraestructura como Código (IaC) para desplegar una aplicación web en la nube de Amazon (AWS) mediante un CI/CD pipeline. En lugar de configurar todo manualmente, Terraform permite escribir las instrucciones del proyecto como código. La aplicación, que fue creada con Flask (Python), se empaqueta en un contenedor para que funcione igual en cualquier entorno. El servicio de Amazon ECR es usado para guardar las imágenes y Amazon ECS para ejecutar la aplicación, lo que garantiza que todo el proceso de despliegue sea consistente y fácil de replicar.

Características de la Aplicación

La aplicación Flask funciona como un directorio de empleados que permite registrar información básica de cada trabajador en una instancia RDS de MySQL. La aplicación incluye las siguientes funcionalidades:

Gestión de Empleados

Imagen de la aplicación Flask
  • Registro de información básica de trabajadores.
  • Carga y almacenamiento de imágenes o fotografías para avatares en un bucket S3.
  • Operaciones básicas de gestión de datos (crear, leer, actualizar, eliminar).
  • Interfaz web sencilla y amigable para los usuarios.

Arquitectura para la Aplicación

Arquitectura de la aplicación Flask

La arquitectura para desplegar la aplicación en AWS incluye los siguientes componentes principales:

Application Load Balancer (ALB): Distribuye el tráfico entrante de la aplicación de manera uniforme entre las tareas (contenedores) del servicio. Un ALB es una parte esencial de una arquitectura de ECS para asegurar que las aplicaciones sean resilientes, escalables y eficientes.

Elastic Container Registry (ECR): ECR es un servicio de registro de contenedores completamente administrado que facilita el almacenamiento, la gestión y el despliegue de imágenes de contenedores en Amazon ECS. ECR es la opción más robusta y eficiente para empresas y proyectos que operan exclusivamente dentro del ecosistema de AWS, debido a su integración, seguridad y rendimiento superiores.

Amazon S3: Almacena las imágenes de los avatares de cada empleado, cuenta además con políticas que restringen el acceso a los datos.

Amazon RDS MySQL: Almacena la información de los empleados, permitiendo operaciones CRUD. Siendo accesible únicamente desde las tasks de ECS.

Amazon ECS Fargate: Orquesta la ejecución de contenedores Docker en un clúster gestionado de forma automática, escalando y gestionando la infraestructura subyacente según la demanda.

Creación del Dockerfile para la aplicación

Captura de pantalla del proceso de construcción de Docker

Para la construcción de la imagen de Docker, se usó un patron multi-stage donde durante la primera etapa llamada "build", se instalan y compilan las dependencias necesarias para la aplicación usando una imagen base de Python completa.

Captura de pantalla del Dockerfile

Durante la segunda etapa de construcción del Dockerfile, de acuerdo con las mejores prácticas, se utiliza una imagen base de Python más ligera que solo incluye las dependencias necesarias para ejecutar la aplicación. Esto reduce el tamaño de la imagen final, la superficie de ataque y mejora los tiempos de inicio de los contenedores.

CI/CD pipeline en AWS

Diagrama del CI/CD pipeline

Descripción del CI/CD pipeline:

1. 📤 Trigger inicial: El desarrollador realiza un push a la rama main del repositorio de código fuente en GitHub.

2. 🔔 Detección de cambios: GitHub envía una notificación a AWS CodePipeline mediante un webhook para indicar que se ha producido un cambio en la rama main.

3. 🚦 Inicio del pipeline: CodePipeline prepara un Bucket S3 para almacenar los artefactos generados durante el proceso de construcción y despliegue.

4. ⬆️ Subida de artefactos: En este paso CodePipeline se conecta al repositorio de Github que almacena el código fuente comprimiendo todo el contenido en un archivo ZIP y subiéndolo al Bucket S3 preparado anteriormente.

5. 🛠️ Construcción de la imagen Docker: Codebuild prepara el entorno para contruir la imagen de Docker utilizando el Dockerfile incluido en el repositorio de Github. Posteriormente, se descargan los artefactos almacenados en S3 y se ejecutan las instrucciones almacenadas en el buildspec.yml, que define los pasos para construir la imagen y almacenarla en ECR.

6. 🚀 Despliegue: Utilizando la técnica de rolling deployment, ECS prepara la imagen de Docker para su despliegue en el clúster de contenedores y se realizan pruebas de salud antes de redirigir el tráfico a la nueva versión de la aplicación.

Aprovisionamiento de la Infraestructura

El aprovisionamiento de la infraestructura en AWS se realiza mediante Terraform, una herramienta de Infrastructure as Code (IaC) que permite definir y gestionar la infraestructura de manera declarativa.

Estructura del Código de Terraform

Logo de Terraform

La estructura del proyecto está modularizada en varios archivos .tf, cada uno responsable de una parte específica de la infraestructura:

Red (vpc.tf): Crea una red virtual privada (VPC) con subredes públicas y privadas para alojar los recursos de forma segura.

Computación (ecs.tf): Despliega la aplicación Flask como un contenedor Docker utilizando ECS Fargate, un servicio "serverless" que evita tener que gestionar servidores. Incluye un balanceador de carga (ALB) para distribuir el tráfico.

Base de Datos (rds.tf): Aprovisiona una base de datos relacional MySQL mediante AWS RDS, ubicada en la subred privada para mayor seguridad.

Almacenamiento (s3.tf): Crea un bucket S3 para almacenar las imágenes de los avatares de los empleados, con políticas que restringen el acceso a los datos.

Seguridad (security.tf, secrets.tf): Define las reglas de firewall (Security Groups) y gestiona los secretos (como contraseñas de la base de datos) de forma segura con AWS Secrets Manager.

CI/CD (cicd.tf): Configura un pipeline de integración y despliegue continuo con AWS CodePipeline y CodeBuild. Este pipeline automatiza la construcción de la imagen Docker y su despliegue en ECS cada vez que hay un cambio en el repositorio de código (GitHub).

Configuración General (main.tf, variables.tf, outputs.tf): Contienen la configuración principal de Terraform, la definición de variables y las salidas del despliegue (como la URL de la aplicación).

Repositorio en GitHub del Proyecto

Puedes encontrar el código fuente de la aplicación en mi repositorio de GitHub: FlaskApp y el código de la infraestructura en: terraform_flask_app_ecs

Sitio alojado en un 🪣 S3 de AWS

Powered by Reflex

Built with Reflex