Saltar al contenido

Lección 10 de 19 · Lectura y práctica

Configura deploys a AWS, Azure o Google Cloud

Concepto claveLos despliegues automatizados a entornos cloud representan el último eslabón en tu pipeline de CI/CD. Imagina que tu aplicación es un paquete que debe viajar desde tu computadora (repositorio) hasta un almacén en la.

Del concepto a la práctica

Taller de esta lección

Un despliegue automatizado debe separar la preparación del artefacto, la autenticación y la entrega al proveedor. AWS, Azure y Google Cloud tienen interfaces distintas, por lo que conviene modelar primero entradas y salidas: archivo o imagen de entrada, entorno destino, identidad autorizada y comprobación posterior.

Ejemplo resuelto

Un flujo seguro puede construir app.tar, subirlo como artefacto y hacer que el job de despliegue lo descargue. Para una cuenta cloud compatible, prioriza OIDC con credenciales temporales y una política de confianza restringida al repositorio/entorno/rama autorizados; requiere id-token:write en el job que lo necesite. Un secret de larga duración es una alternativa que debe limitarse y rotarse. La identidad no se obtiene simplemente de una variable no sensible, mientras el nombre del entorno se mantiene como variable no sensible. El despliegue solo depende del job de calidad.

Pruébalo

  1. Define el artefacto exacto que se entregará.

  2. Enumera la identidad mínima y guárdala fuera del repositorio.

  3. Conecta build, test y deploy mediante dependencias.

  4. Añade una comprobación autorizada del resultado.

Comprueba tu resultado

Error frecuente: reconstruir en deploy y obtener un resultado distinto al probado. Corrección: transporta el artefacto producido por build.

Ejercicio: sustituye el proveedor real por una carpeta local de staging. Resultado esperado: el deploy consume exactamente el archivo generado y la ejecución se detiene si el job de calidad falla.

Secuencia de código, imagen de contenedor, pruebas, registro y despliegue de instancias idénticas.
CursaloMapa de práctica
Del código al despliegue

El código se empaqueta en una imagen y se prueba antes de publicarlo. Esa misma imagen se guarda en un registro y se usa en el despliegue. Comprobar la salud de las instancias permite detectar un fallo sin reconstruir el artefacto.

Ver la infografía en tamaño completo ↗

Concepto clave

Los despliegues automatizados a entornos cloud representan el último eslabón en tu pipeline de CI/CD. Imagina que tu aplicación es un paquete que debe viajar desde tu computadora (repositorio) hasta un almacén en la nube (servidor cloud). GitHub Actions actúa como el sistema de logística automatizado que empaqueta, etiqueta y envía ese paquete sin intervención humana.

En la práctica, esto significa que cada vez que haces un push a tu rama principal o creas un release, un workflow se activa, ejecuta tus tests, construye la aplicación y la despliega automáticamente a AWS, Azure o Google Cloud. La clave está en la integración segura entre GitHub y tu proveedor cloud, utilizando secrets para credenciales y acciones específicas para cada plataforma.

Cómo funciona en la práctica

El proceso sigue estos pasos:

  1. Configuras secrets en tu repositorio GitHub con las credenciales de tu proveedor cloud (ej: AWS_ACCESS_KEY_ID, AZURE_CREDENTIALS)
  2. Creas un archivo YAML en .github/workflows/ que define el workflow de despliegue
  3. El workflow se activa automáticamente por eventos como push o pull_request
  4. Se ejecutan jobs que: construyen la aplicación, corren tests, y finalmente despliegan
  5. Para el deploy, usas acciones oficiales como aws-actions/configure-aws-credentials o azure/login
  6. El resultado es tu aplicación disponible en producción sin intervención manual

Código en acción

Ejemplo básico para desplegar una app Node.js a AWS Elastic Beanstalk:

name: Deploy to AWS

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    
    - name: Install dependencies
      run: npm ci
    
    - name: Build application
      run: npm run build
    
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v2
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: us-east-1
    
    - name: Deploy to Elastic Beanstalk
      run: |
        aws elasticbeanstalk create-application-version \
          --application-name my-app \
          --version-label ${{ github.sha }} \
          --source-bundle S3Bucket=my-bucket,S3Key=app.zip
        aws elasticbeanstalk update-environment \
          --environment-name my-app-prod \
          --version-label ${{ github.sha }}

Refactorización mejorada con reutilización de steps:

name: Deploy to AWS - Refactored

on:
  push:
    branches: [ main ]

env:
  NODE_VERSION: '18'
  AWS_REGION: 'us-east-1'

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    outputs:
      artifact-name: ${{ steps.build.outputs.artifact-name }}
    steps:
    - uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: ${{ env.NODE_VERSION }}
    
    - name: Install and test
      run: |
        npm ci
        npm test
    
    - name: Build artifact
      id: build
      run: |
        npm run build
        echo "artifact-name=app-${{ github.sha }}.zip" >> $GITHUB_OUTPUT
    
    - name: Upload artifact
      uses: actions/upload-artifact@v3
      with:
        name: app-build
        path: ./dist

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
    - name: Download artifact
      uses: actions/download-artifact@v3
      with:
        name: app-build
    
    - name: Configure AWS
      uses: aws-actions/configure-aws-credentials@v2
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}
    
    - name: Deploy
      run: ./scripts/deploy.sh ${{ needs.build-and-test.outputs.artifact-name }}

Errores comunes

  • Exponer credenciales en logs: Nunca imprimas secrets en console.log. GitHub Actions los oculta automaticamente si usas ${{ secrets.NOMBRE }}, pero si las asignas a variables normales, quedan expuestas.
  • Falta de manejo de errores: No configurar timeouts adecuados o no verificar que el deploy fue exitoso. Siempre incluye steps de verificacion post-deploy.
  • Despliegues sin rollback: Si algo falla en produccion, debes poder revertir automaticamente. Implementa estrategias como blue-green deployments.
  • Ignorar costos: Desplegar en cada push puede generar costos inesperados. Usa environments y approvals para despliegues a produccion.
  • No probar en staging: Desplegar directamente a produccion sin un entorno intermedio es riesgoso. Configura al menos dos environments: staging y production.

Checklist de dominio

  1. Puedo configurar secrets en GitHub para AWS, Azure y Google Cloud
  2. Sé crear workflows que se activen solo en ciertas ramas o tags
  3. Implementé al menos una estrategia de deploy (blue-green, canary, rolling)
  4. Configuré manejo de errores y rollback automatico
  5. Utilicé environments de GitHub para requerir approvals en produccion
  6. Optimicé mis workflows para reutilizar jobs y steps comunes
  7. Monitoricé costos y performance de mis despliegues automatizados

Implementa un pipeline completo con deploy a Azure App Service

Objetivo

Crear un workflow de GitHub Actions que construya una aplicacion web simple y la despliegue automaticamente a Azure App Service cuando se haga push a la rama main.

Requisitos previos

  • Una cuenta de Azure con suscripcion activa
  • Una aplicacion web creada en Azure App Service
  • Un repositorio GitHub con una aplicacion web basica (puede ser HTML/JS estatico)

Pasos a seguir

  1. Crea un Service Principal en Azure y obtén las credenciales (clientId, clientSecret, tenantId, subscriptionId)
  2. Configura estos valores como secrets en tu repositorio GitHub con nombres: AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID
  3. Crea un archivo en .github/workflows/deploy-azure.yml
  4. Define el trigger para que se ejecute en push a main
  5. Configura un job que: checkout el codigo, configure Azure credentials, y despliegue a App Service
  6. Usa la accion oficial azure/login y azure/webapps-deploy
  7. Agrega un step adicional que verifique que el deploy fue exitoso haciendo una peticion HTTP a tu app
  8. Ejecuta el workflow manualmente y verifica que tu aplicacion este disponible en Azure

Entrega

Comparte el link a tu repositorio con el workflow funcionando y una captura de pantalla de tu aplicacion desplegada en Azure.

Pistas
  • Usa la documentacion oficial de GitHub Actions para Azure: https://github.com/Azure/actions
  • Recuerda que el nombre de tu App Service en Azure debe coincidir con el parametro 'app-name' en el workflow
  • Puedes usar 'curl' o una accion como 'jakejarvis/wait-for-action' para verificar el deploy

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con GitHub Actions para CI/CD: Automatización de Builds, Tests y Deploys

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.