🏗️ 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.
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).
# 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:
# 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.tfstateen 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).
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
- NUNCA comites el archivo
.tfstateni secretos a Git: Agrega*.tfstate,*.tfstate.backupy.terraform/a tu.gitignore. - Usa variables descriptivas y validaciones: Define siempre tipos (
string,number,list) y valores por defecto adecuados. - 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. - Automatiza en CI/CD: Ejecuta
terraform planautomáticamente en cada Pull Request yterraform applyúnicamente al fusionar a la rama principal (main).