Configura deploys a AWS, Azure o Google Cloud

Lectura
20 min~5 min lectura

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.