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_stateo APIs para compartir datos de forma segura.
Checklist de dominio
- Configurar un workspace en Terraform Cloud y conectar un repositorio Git.
- Implementar un pipeline CI/CD que ejecute
terraform planen pull requests yterraform applyautomático en merges a main. - Usar variables de entorno y secretos para credenciales AWS en lugar de hardcodear.
- Definir al menos una política en Terraform Cloud (ej. requerir aprobación para cambios en recursos de tipo
aws_db_instance). - Probar la recuperación ante fallos: simular un estado corrupto y restaurar desde Terraform Cloud.
- Configurar notificaciones (ej. Slack o email) para ejecuciones fallidas en Terraform Cloud.
- 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:
- Crea una cuenta en Terraform Cloud (gratuita) y una organización. Luego, crea un workspace llamado
aws-s3-automationconfigurado para usar tu repositorio GitHub. - En tu repositorio GitHub, crea un archivo
main.tfcon un recursoaws_s3_bucketpara un bucket con nombre único (usa una variable). Incluye un archivobackend.tfconfigurando el backend remoto a tu workspace de Terraform Cloud. - Configura secrets en GitHub: ve a Settings → Secrets and variables → Actions, y añade
AWS_ACCESS_KEY_IDyAWS_SECRET_ACCESS_KEYcon credenciales de un IAM user con permisos para S3. - Crea un archivo
.github/workflows/terraform.ymlcon 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. - Haz un push a una rama de feature, verifica que el pipeline ejecute
terraform plany muestre los cambios. Luego, mergea a main y confirma que se aplica y crea el bucket en AWS.
- Usa
terraform loginen 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_namecon un valor por defecto que incluya un timestamp o un sufijo aleatorio. - En el pipeline GitHub Actions, usa la acción
hashicorp/setup-terraformpara manejar la instalación y autenticación con Terraform Cloud automáticamente.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.