Práctica: Configurar CI/CD y Desplegar una API en un Entorno Cloud

Lectura
25 min~6 min lectura

Concepto clave

La Integración Continua y Despliegue Continuo (CI/CD) es el proceso automatizado que permite a los desarrolladores integrar cambios de código frecuentemente y desplegarlos en entornos de producción de manera segura y eficiente. Imagina una fábrica de automóviles donde cada pieza se prueba inmediatamente después de ser fabricada, y solo los coches que pasan todas las inspecciones avanzan a la línea de ensamblaje final. En el desarrollo de software, CI/CD funciona de manera similar: cada cambio en el código desencadena una serie de pruebas automatizadas y, si todo pasa, se despliega automáticamente en un entorno cloud.

Para APIs construidas con FastAPI, implementar CI/CD no solo acelera el tiempo de entrega, sino que también mejora la calidad del software al detectar errores temprano. Un pipeline típico incluye etapas como construcción, pruebas unitarias, pruebas de integración, análisis de seguridad y despliegue. La clave está en configurar este flujo de trabajo una vez y luego disfrutar de despliegues consistentes y confiables cada vez que se actualiza el código.

Cómo funciona en la práctica

Vamos a configurar un pipeline CI/CD para una API FastAPI usando GitHub Actions y desplegarla en AWS Elastic Beanstalk. Este ejemplo es realista y escalable para proyectos profesionales.

  1. Preparación del repositorio: Organiza tu proyecto FastAPI con una estructura clara, incluyendo requirements.txt, tests y configuración para el entorno.
  2. Configuración de GitHub Actions: Crea un archivo .github/workflows/deploy.yml que defina los pasos del pipeline. Esto incluirá instalar dependencias, ejecutar pruebas con pytest y desplegar en AWS.
  3. Configuración de AWS: Crea una aplicación y entorno en Elastic Beanstalk, configura las credenciales de acceso como secretos en GitHub, y define las variables de entorno necesarias.
  4. Automatización del despliegue: El pipeline se activará automáticamente en cada push a la rama main, ejecutando las etapas en orden y desplegando solo si todas las pruebas pasan.

Este enfoque asegura que cada cambio sea validado antes de llegar a producción, reduciendo riesgos y mejorando la colaboración en equipos.

Código en acción

Aquí tienes un ejemplo funcional de un archivo de configuración para GitHub Actions que despliega una API FastAPI en AWS Elastic Beanstalk. Este código es copiable y modificable para tus proyectos.

name: Deploy FastAPI to AWS Elastic Beanstalk

on:
  push:
    branches: [ main ]

jobs:
  test-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
    
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.9'
    
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        pip install pytest
    
    - name: Run tests
      run: |
        pytest tests/ -v
    
    - name: Deploy to AWS Elastic Beanstalk
      if: success()
      uses: einaregilsson/beanstalk-deploy@v21
      with:
        aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        application_name: mi-api-fastapi
        environment_name: MiApiFastAPI-env
        version_label: ${{ github.sha }}
        region: us-east-1
        deployment_package: .

Antes de implementar CI/CD, los despliegues eran manuales y propensos a errores. Después, con este pipeline, cada cambio se prueba y despliega automáticamente, asegurando consistencia y rapidez.

Errores comunes

  • No configurar correctamente las variables de entorno en el entorno cloud: Esto puede causar que la API falle al intentar conectarse a bases de datos o servicios externos. Solución: Usa la configuración de entorno de Elastic Beanstalk o secretos gestionados para almacenar credenciales de manera segura.
  • Olvidar incluir todos los archivos necesarios en el despliegue: Si faltan archivos como requirements.txt o configuraciones, el despliegue fallará. Solución: Verifica que el directorio raíz del proyecto incluya todo lo esencial y usa .ebignore para excluir solo lo innecesario.
  • No manejar fallos en las pruebas automatizadas: Si las pruebas fallan pero el despliegue continúa, se pueden introducir bugs en producción. Solución: Configura el pipeline para que se detenga si cualquier etapa de prueba falla, usando condiciones como if: success() solo en el paso de despliegue.
  • Ignorar la seguridad de las credenciales: Hardcodear claves de AWS en el código es un riesgo grave. Solución: Usa GitHub Secrets para almacenar y acceder a credenciales de manera segura en el pipeline.
  • No monitorear el entorno después del despliegue: Sin monitoreo, los problemas en producción pueden pasar desapercibidos. Solución: Integra herramientas como CloudWatch en AWS para alertas y logs, y configura health checks en tu API.

Checklist de dominio

  • Configurar un repositorio GitHub con una estructura de proyecto FastAPI clara y tests automatizados.
  • Crear un archivo de workflow de GitHub Actions que ejecute pruebas y despliegue automáticamente.
  • Configurar una aplicación y entorno en AWS Elastic Beanstalk para desplegar la API.
  • Usar GitHub Secrets para manejar credenciales de AWS de forma segura.
  • Verificar que el pipeline se active en pushes a la rama main y despliegue solo si las pruebas pasan.
  • Implementar health checks en la API para monitorear el estado en producción.
  • Documentar el proceso de CI/CD para el equipo y mantenerlo actualizado con cambios en el proyecto.

Configura un Pipeline CI/CD para Desplegar tu API FastAPI en AWS

Sigue estos pasos para implementar un pipeline CI/CD completo para una API FastAPI, desplegándola en AWS Elastic Beanstalk. Este ejercicio te preparará para escenarios reales en proyectos profesionales.

  1. Prepara tu proyecto FastAPI: Asegúrate de que tu API tenga una estructura básica con un archivo main.py, requirements.txt que liste FastAPI, uvicorn, y cualquier otra dependencia, y una carpeta tests/ con al menos un test unitario usando pytest.
  2. Configura AWS Elastic Beanstalk: Crea una cuenta en AWS (usa el nivel gratuito si es posible). En la consola de AWS, ve a Elastic Beanstalk y crea una nueva aplicación llamada "mi-api-fastapi" y un entorno basado en Python. Toma nota del nombre del entorno y la región.
  3. Configura GitHub Secrets: En tu repositorio GitHub, ve a Settings > Secrets and variables > Actions. Agrega dos secretos: AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY con las credenciales de un usuario IAM en AWS que tenga permisos para Elastic Beanstalk.
  4. Crea el archivo de workflow de GitHub Actions: En la raíz de tu repositorio, crea un directorio .github/workflows/ y dentro un archivo deploy.yml. Copia el código del ejemplo en la lección y ajusta los valores como application_name, environment_name y región según tu configuración de AWS.
  5. Ejecuta el pipeline: Haz un push de tus cambios a la rama main en GitHub. Ve a la pestaña Actions de tu repositorio para ver el workflow en ejecución. Verifica que las pruebas pasen y que el despliegue a AWS se complete exitosamente.
  6. Prueba la API desplegada: Una vez desplegada, accede a la URL proporcionada por Elastic Beanstalk y prueba los endpoints de tu API para asegurarte de que funciona correctamente en el entorno cloud.
Pistas
  • Asegúrate de que tu archivo requirements.txt incluya todas las dependencias necesarias, como fastapi y uvicorn, para evitar errores durante la instalación en el pipeline.
  • En AWS, configura las variables de entorno en Elastic Beanstalk para tu API, como DATABASE_URL si usas una base de datos, para que se carguen automáticamente al desplegar.
  • Si el despliegue falla, revisa los logs en GitHub Actions y en la consola de Elastic Beanstalk para identificar problemas comunes como permisos incorrectos o archivos faltantes.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.