Ejercicio Práctico: Configurar un Pipeline CI/CD para Terraform

Lectura
30 min~5 min lectura

Concepto clave

Un pipeline CI/CD para Terraform es un sistema automatizado que gestiona el ciclo de vida de tu infraestructura como código. Imagina que eres un arquitecto que diseña un edificio: en lugar de construir manualmente cada vez, creas planos detallados (tu código Terraform) y luego usas una cadena de montaje automatizada (el pipeline) que revisa, prueba y construye según esos planos de forma consistente.

Este pipeline asegura que cada cambio en tu infraestructura pase por las mismas etapas de validación, similar a como en una fábrica automotriz cada vehículo pasa por controles de calidad estandarizados. Para un DevOps Engineer, esto elimina la variabilidad humana, reduce errores y permite desplegar infraestructura de manera repeatable y confiable en AWS.

Cómo funciona en la práctica

Vamos a configurar un pipeline básico usando GitHub Actions, un servicio popular de CI/CD. El flujo tendrá estas etapas:

  1. Plan: Cuando haces un pull request, Terraform genera un plan de ejecución para mostrar qué cambiará.
  2. Apply: Al fusionar a la rama principal, Terraform aplica los cambios automáticamente.
  3. Estado: Se usa un backend remoto (como S3) para almacenar el estado de Terraform, asegurando que el pipeline siempre trabaje con la versión más reciente.

Paso a paso: primero, preparas tu repositorio con archivos Terraform. Luego, creas un archivo de configuración para GitHub Actions que define los jobs. Finalmente, pruebas el pipeline haciendo un cambio y viendo cómo se ejecuta automáticamente.

Codigo en accion

Aquí tienes un ejemplo funcional de un archivo Terraform para crear un bucket S3 en AWS, que será parte de tu pipeline:

# main.tf - Configuración básica de un bucket S3
provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "mi_bucket" {
  bucket = "mi-bucket-terraform-pipeline-${random_id.suffix.hex}"
  acl    = "private"

  tags = {
    Name        = "Bucket para pipeline"
    Environment = "Dev"
  }
}

resource "random_id" "suffix" {
  byte_length = 4
}

Ahora, el archivo de configuración para GitHub Actions que define el pipeline:

# .github/workflows/terraform.yml
name: 'Terraform CI/CD Pipeline'

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

jobs:
  terraform:
    name: 'Terraform Plan and Apply'
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v2
    
    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v1
      with:
        terraform_version: '1.0.0'
    
    - name: Terraform Init
      run: terraform init
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    
    - name: Terraform Plan
      if: github.event_name == 'pull_request'
      run: terraform plan
    
    - name: Terraform Apply
      if: github.event_name == 'push'
      run: terraform apply -auto-approve

Errores comunes

  • No usar un backend remoto para el estado: Si el estado se almacena localmente, el pipeline puede perder la pista de los recursos. Solución: Configura un backend como S3 con bloqueo DynamoDB desde el inicio.
  • Exponer credenciales en el código Incluir AWS keys directamente en los archivos es un riesgo de seguridad. Solución: Usa secrets en GitHub Actions o AWS IAM roles.
  • Olvidar el -auto-approve en Apply Sin esto, el pipeline se detendrá esperando confirmación manual. Solución: Asegúrate de incluir el flag en el comando apply para entornos automatizados.
  • No manejar dependencias entre recursos Si un recurso depende de otro y falla, puede romper el pipeline. Solución: Usa depends_on en Terraform y prueba en un entorno de staging primero.

Checklist de dominio

  1. Configurar un backend remoto de Terraform en S3 para gestionar el estado.
  2. Crear un archivo de workflow de GitHub Actions que ejecute terraform init, plan y apply.
  3. Usar secrets para almacenar credenciales de AWS de forma segura.
  4. Probar el pipeline con un cambio simple, como modificar un tag en un recurso.
  5. Verificar que el plan se ejecute en pull requests y el apply en pushes a main.
  6. Manejar errores comunes como timeouts o permisos insuficientes.
  7. Documentar el proceso para que otros miembros del equipo puedan replicarlo.

Configurar un Pipeline CI/CD para Terraform con GitHub Actions

Sigue estos pasos para crear un pipeline funcional que automatice el despliegue de infraestructura en AWS:

  1. Prepara tu entorno: Crea un repositorio en GitHub y clónalo localmente. Asegúrate de tener una cuenta de AWS con credenciales configuradas.
  2. Configura Terraform: En tu repositorio, crea un archivo main.tf con el código del bucket S3 proporcionado en la lección. Luego, inicializa Terraform localmente con terraform init para verificar que funcione.
  3. Configura el backend remoto: Modifica main.tf para usar un backend S3. Agrega este bloque al inicio:
    terraform {
      backend "s3" {
        bucket = "nombre-de-tu-bucket"
        key    = "terraform.tfstate"
        region = "us-east-1"
      }
    }
    Crea el bucket S3 manualmente en AWS primero.
  4. Crea el workflow de GitHub Actions: En tu repositorio, crea la carpeta .github/workflows y dentro, un archivo terraform.yml con el código YAML de la lección. Ajusta la región si es necesario.
  5. Configura secrets en GitHub: En la configuración de tu repositorio en GitHub, ve a Secrets y agrega AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY con tus credenciales de AWS.
  6. Prueba el pipeline: Haz un commit y push de tus cambios. Luego, crea un pull request para ver el plan en acción, y fusiónalo para trigger el apply automático.
Pistas
  • Si el pipeline falla en terraform init, verifica que las credenciales en secrets estén correctamente configuradas y que el backend S3 exista.
  • Para evitar costos inesperados, usa el comando terraform plan antes de cada apply y revisa los cambios propuestos.
  • Si el apply no se ejecuta tras fusionar, asegúrate de que el evento push en el workflow esté configurado para la rama main.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.