Infraestructura como Codigo: Mejores Practicas con Terraform

Tras anos gestionando infraestructura con Terraform en multiples proveedores cloud y equipos, he desarrollado un conjunto de practicas que ayudan a mantener las bases de codigo mantenibles y los despliegues fiables.

Estructura del Proyecto

Un proyecto Terraform bien organizado es crucial para la colaboracion del equipo:

infrastructure/
  modules/
    networking/
      main.tf
      variables.tf
      outputs.tf
    compute/
      main.tf
      variables.tf
      outputs.tf
  environments/
    production/
      main.tf
      backend.tf
      terraform.tfvars
    staging/
      main.tf
      backend.tf
      terraform.tfvars

Gestion del Estado

El estado remoto no es negociable. Usa un backend con bloqueo:

terraform {
  backend "s3" {
    bucket         = "company-terraform-state"
    key            = "production/infrastructure.tfstate"
    region         = "eu-west-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

Reglas de Gestion del Estado

  1. Un estado por entorno - Nunca compartas estado entre staging y produccion
  2. Habilita el bloqueo de estado - Previene modificaciones concurrentes
  3. Cifra el estado en reposo - Los archivos de estado contienen datos sensibles
  4. Usa workspaces con moderacion - Prefiere configuraciones de backend separadas

Diseno de Modulos

Los buenos modulos son reutilizables, componibles y bien documentados:

module "web_cluster" {
  source = "../../modules/compute"

  environment    = var.environment
  instance_type  = "t3.medium"
  min_size       = 2
  max_size       = 10

  tags = merge(var.common_tags, {
    Service = "web"
  })
}

Directrices para Modulos

  • Manten los modulos enfocados - Una responsabilidad por modulo
  • Usa versionado semantico para modulos compartidos
  • Expone solo las variables necesarias - No hagas todo configurable
  • Define siempre outputs para la comunicacion entre modulos
  • Incluye validacion en variables donde sea apropiado

Integracion CI/CD

Automatiza tus flujos de trabajo de Terraform:

# Ejemplo GitLab CI
plan:
  stage: plan
  script:
    - terraform init
    - terraform plan -out=plan.tfplan
  artifacts:
    paths:
      - plan.tfplan

apply:
  stage: deploy
  script:
    - terraform apply plan.tfplan
  when: manual
  only:
    - main

Errores Comunes

  1. No usar terraform fmt - Aplica el formateo en CI
  2. Ignorar el drift - Programa chequeos regulares con terraform plan
  3. Valores hardcodeados - Usa variables y data sources
  4. Estados monoliticos grandes - Divide en estados mas pequenos y enfocados
  5. Falta de lifecycle rules - Usa prevent_destroy para recursos criticos

Resumen

La Infraestructura como Codigo es tan buena como las practicas que la rodean. Invierte tiempo en estructura, automatizacion y convenciones de equipo.