Automatización con Terraform Cloud y CI/CD

Video
30 min~5 min lectura

Reproductor de video

Concepto clave

La automatización con Terraform Cloud y CI/CD (Integración Continua/Despliegue Continuo) transforma la gestión de infraestructura de una tarea manual y propensa a errores en un proceso confiable y repetible. Imagina que tu infraestructura en AWS es como una fábrica automatizada: Terraform Cloud actúa como el sistema de control central que coordina todas las máquinas (recursos AWS), mientras que CI/CD es la cinta transportadora que asegura que cada cambio pase por las mismas etapas de calidad antes de llegar a producción.

En el mundo DevOps, esto significa que cada modificación en tu código de infraestructura se valida, planifica y aplica de manera consistente, eliminando las diferencias entre entornos y reduciendo la "deriva de configuración". Terraform Cloud añade gestión de estado remoto, ejecuciones automatizadas y colaboración en equipo, mientras que CI/CD (usando herramientas como GitHub Actions o GitLab CI) asegura que cada commit desencadene el flujo adecuado. Juntos, crean un ciclo de vida completo para tu infraestructura como código.

Cómo funciona en la práctica

El flujo típico comienza cuando un desarrollador hace un push a un repositorio Git. Un pipeline de CI/CD detecta el cambio y ejecuta terraform plan en un entorno aislado, mostrando los cambios propuestos. Si la revisión es aprobada (manual o automáticamente), se ejecuta terraform apply para aplicar los cambios en AWS. Terraform Cloud gestiona el estado de forma remota, permitiendo que múltiples miembros del equipo colaboren sin conflictos.

Paso a paso: 1) Configuras Terraform Cloud para conectar con tu repositorio y workspace. 2) Configuras un pipeline CI/CD (ej. GitHub Actions) con jobs para terraform fmt, terraform validate, terraform plan, y terraform apply condicional. 3) Defines políticas en Terraform Cloud para requerir aprobación antes de aplicar cambios críticos. 4) Cada cambio sigue este camino: código → plan → revisión → apply → estado actualizado.

Código en acción

Configuración básica de Terraform Cloud en tu archivo backend.tf:

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "tu-organizacion"

    workspaces {
      name = "aws-prod"
    }
  }
}

Ejemplo de un pipeline CI/CD con GitHub Actions (.github/workflows/terraform.yml):

name: 'Terraform'

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    env:
      TF_CLI_ARGS: "-no-color"

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v2
      with:
        terraform_version: 1.5.0

    - name: Terraform Init
      run: terraform init

    - name: Terraform Validate
      run: terraform validate

    - name: Terraform Plan
      run: terraform plan -out=tfplan
      if: github.event_name == 'push'

    - name: Terraform Apply
      run: terraform apply tfplan
      if: github.event_name == 'push' && github.ref == 'refs/heads/main'

Errores comunes

  • Estado no sincronizado: Ejecutar Terraform localmente mientras Terraform Cloud maneja el estado remoto puede causar conflictos. Solución: Usa siempre el backend remoto y evita comandos locales en entornos compartidos.
  • Falta de políticas de aprobación: Aplicar cambios críticos (como eliminar una base de datos) sin revisión. Configura políticas en Terraform Cloud para requerir aprobación en recursos sensibles.
  • Credenciales expuestas en pipelines CI/CD. Usa secretos gestionados por la plataforma (ej. GitHub Secrets) y nunca las incluyas en el código.
  • Ignorar el output de terraform plan: No revisar los cambios propuestos antes de aplicar. Siempre revisa el plan en el pipeline o en Terraform Cloud.
  • No manejar dependencias entre workspaces: Si tienes múltiples workspaces (ej. dev, prod), asegúrate de usar terraform_remote_state o APIs para compartir datos de forma segura.

Checklist de dominio

  1. Configurar un workspace en Terraform Cloud y conectar un repositorio Git.
  2. Implementar un pipeline CI/CD que ejecute terraform plan en pull requests y terraform apply automático en merges a main.
  3. Usar variables de entorno y secretos para credenciales AWS en lugar de hardcodear.
  4. Definir al menos una política en Terraform Cloud (ej. requerir aprobación para cambios en recursos de tipo aws_db_instance).
  5. Probar la recuperación ante fallos: simular un estado corrupto y restaurar desde Terraform Cloud.
  6. Configurar notificaciones (ej. Slack o email) para ejecuciones fallidas en Terraform Cloud.
  7. Documentar el flujo completo para tu equipo, incluyendo roles y responsabilidades.

Automatizar el despliegue de un bucket S3 con Terraform Cloud y GitHub Actions

En este ejercicio, automatizarás la creación de un bucket S3 en AWS usando Terraform Cloud para gestión de estado y GitHub Actions para CI/CD. Sigue estos pasos:

  1. Crea una cuenta en Terraform Cloud (gratuita) y una organización. Luego, crea un workspace llamado aws-s3-automation configurado para usar tu repositorio GitHub.
  2. En tu repositorio GitHub, crea un archivo main.tf con un recurso aws_s3_bucket para un bucket con nombre único (usa una variable). Incluye un archivo backend.tf configurando el backend remoto a tu workspace de Terraform Cloud.
  3. Configura secrets en GitHub: ve a Settings → Secrets and variables → Actions, y añade AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY con credenciales de un IAM user con permisos para S3.
  4. Crea un archivo .github/workflows/terraform.yml con un pipeline que: a) Haga checkout del código, b) Inicialice Terraform, c) Valide y planee en cada push, d) Aplique automáticamente solo en merges a la rama main.
  5. Haz un push a una rama de feature, verifica que el pipeline ejecute terraform plan y muestre los cambios. Luego, mergea a main y confirma que se aplica y crea el bucket en AWS.
Pistas
  • Usa terraform login en tu entorno local para generar un token si necesitas autenticar Terraform Cloud en el pipeline.
  • Para el nombre único del bucket S3, considera usar una variable como var.bucket_name con un valor por defecto que incluya un timestamp o un sufijo aleatorio.
  • En el pipeline GitHub Actions, usa la acción hashicorp/setup-terraform para manejar la instalación y autenticación con Terraform Cloud automáticamente.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.