Infraestructura IaC

🏗️ Guía Completa de Terraform e Infraestructura como Código (IaC)

Terraform (desarrollado por HashiCorp) es la herramienta de Infraestructura como Código (IaC) más popular del mundo. Permite definir, aprovisionar y actualizar recursos de infraestructura en la nube (AWS, Azure, GCP, Kubernetes, etc.) mediante archivos de configuración declarativos e interpretables tanto por humanos como por sistemas de CI/CD.

1. ¿Qué es IaC y por qué usar Terraform?

Antes de IaC, la infraestructura se creaba manualmente desde consolas web (haciendo clic en interfaces gráficos) o scripts imperativos de Bash/Python. Esto generaba problemas graves como la falta de auditoría, diferencias inexplicables entre entornos (configuration drift) y errores humanos no repetibles.

Enfoque Declarativo vs Imperativo: En Terraform especificas qué estado final deseas (ejemplo: "Quiero 3 instancias EC2 y una base de datos PostgreSQL") y Terraform se encarga de calcular los pasos exactos necesarios para lograrlo.

2. Conceptos Fundamentales

  • Provider (Proveedor): Plugin que traduce el código HCL en llamadas a las APIs de los proveedores de nube (AWS, Azure, GCP, Cloudflare, etc.).
  • Resource (Recurso): El bloque fundamental de infraestructura que Terraform creará o gestionará (ejemplo: un bucket S3, una VNet de Azure, una máquina virtual).
  • Data Source (Fuente de Datos): Permite consultar o leer información de infraestructura existente fuera de nuestra plantilla de Terraform.
  • State (Estado): Archivo (terraform.tfstate) que actúa como base de datos local o remota vinculando los bloques del código HCL con los IDs reales en la nube.
  • Variables & Outputs: Parámetros de entrada dinámicos y valores devueltos (como una dirección IP pública o DNS) tras el aprovisionamiento.

3. Sintaxis HCL Básica (HashiCorp Configuration Language)

Terraform utiliza archivos con extensión .tf escritos en HCL. Un proyecto típico contiene archivos organizados por propósito (main.tf, variables.tf, outputs.tf, providers.tf).

hcl (providers.tf & main.tf)
# Configuración del proveedor de AWS
terraform {
  required_version = ">= 1.5.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

# Declaración de variables
variable "aws_region" {
  type        = string
  default     = "us-east-1"
  description = "Región de AWS para los recursos"
}

variable "environment" {
  type        = string
  default     = "dev"
  description = "Entorno de ejecución (dev, staging, prod)"
}

# Creación de un recurso (Bucket S3)
resource "aws_s3_bucket" "app_storage" {
  bucket = "mc-app-data-${var.environment}-2026"

  tags = {
    Environment = var.environment
    ManagedBy   = "Terraform"
  }
}

# Output: Retorna la URL del bucket tras crearlo
output "s3_bucket_arn" {
  value       = aws_s3_bucket.app_storage.arn
  description = "ARN del bucket S3 creado"
}

4. Ciclo de Vida del CLI de Terraform

Para trabajar de manera efectiva con Terraform en tu terminal o en un pipeline de CI/CD, debes conocer los comandos esenciales de su flujo de trabajo:

bash
# 1. Inicializa el directorio (descarga proveedores y módulos)
terraform init

# 2. Formatea el código automáticamente según el estándar oficial HCL
terraform fmt

# 3. Valida la sintaxis del código sin conectarse a la nube
terraform validate

# 4. Muestra un plan de ejecución (compara código vs infraestructura real)
terraform plan -out=tfplan

# 5. Aplica los cambios planificados en la nube
terraform apply tfplan

# 6. Destruye toda la infraestructura creada por este código (Usar con precaución)
terraform destroy

5. El Archivo de Estado (terraform.tfstate)

El archivo de estado es el núcleo operativo de Terraform. Mantiene el mapeo entre las definiciones HCL de tu código y las entidades físicas reales en la nube.

  • ¿Por qué es crítico? Sin el estado, Terraform no sabe si un cambio en el código significa "crear un recurso nuevo" o "modificar uno ya existente".
  • Peligros de guardar el estado localmente: Si trabajas en equipo y almacenas terraform.tfstate en tu laptop, tus compañeros no verán tus cambios, o podrían pisarse los recursos generando corrupción de infraestructura.

6. Remotes Backends & State Locking

Para solucionar el trabajo colaborativo se utilizan Remote Backends. Almacenan el archivo de estado de forma segura e impiden ejecuciones simultáneas mediante bloqueos (Locks).

hcl (backend.tf - Configuración S3 + DynamoDB)
terraform {
  backend "s3" {
    bucket         = "mc-tfstates-central-prod"
    key            = "infra/core-network/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true
    dynamodb_table = "terraform-state-locks" # Evita que 2 personas ejecuten apply a la vez
  }
}

7. Buenas Prácticas de Infraestructura como Código

  1. NUNCA comites el archivo .tfstate ni secretos a Git: Agrega *.tfstate, *.tfstate.backup y .terraform/ a tu .gitignore.
  2. Usa variables descriptivas y validaciones: Define siempre tipos (string, number, list) y valores por defecto adecuados.
  3. Modulariza desde el día 1: No acumules miles de líneas en un solo archivo main.tf. Divide la infraestructura en módulos independientes.
  4. Automatiza en CI/CD: Ejecuta terraform plan automáticamente en cada Pull Request y terraform apply únicamente al fusionar a la rama principal (main).