Por qué importa la infraestructura como código
Gestionar infraestructura manualmente a través de consolas web o scripts ad-hoc crea problemas que se acumulan con el tiempo: entornos inconsistentes, cambios sin documentar, rollbacks imposibles y el clásico “funciona en mi máquina” extendido a servidores enteros.
La Infraestructura como Código (IaC) resuelve esto tratando la infraestructura como el código de aplicación: se escribe, versiona, revisa, prueba y aplica mediante flujos de trabajo automatizados. Los beneficios llegan rápidamente:
- Reproducibilidad: Levanta entornos idénticos en minutos, no en días.
- Control de versiones: Cada cambio de infraestructura pasa por un PR con revisión de código.
- Documentación por defecto: El código es la documentación de cómo es tu infraestructura.
- Recuperación ante desastres: Reconstruye todo desde código si una región cae.
- Visibilidad de costes: Revisa los cambios de infraestructura antes de aplicarlos (y antes de que empiecen a costar dinero).
Terraform vs otras herramientas
Existen varias herramientas de IaC. Así es como Terraform se compara con las principales alternativas:
| Característica | Terraform | Pulumi | CloudFormation | Ansible |
|---|---|---|---|---|
| Lenguaje | HCL (declarativo) | Python, TypeScript, Go, etc. | JSON/YAML | YAML (procedural) |
| Soporte cloud | Multi-cloud | Multi-cloud | Solo AWS | Multi-cloud (vía módulos) |
| Gestión de estado | Fichero de estado explícito | Gestionado por servicio Pulumi | Gestionado por AWS | Sin estado |
| Curva de aprendizaje | Moderada | Varía según lenguaje | Moderada | Baja |
| Ecosistema | Enorme ecosistema de providers | En crecimiento | Solo AWS pero profundo | Enorme ecosistema de roles |
| Ideal para | Infra multi-cloud | Equipos que prefieren lenguajes de propósito general | Entornos solo AWS | Gestión de configuración |
El punto fuerte de Terraform es el aprovisionamiento de infraestructura multi-cloud con un enfoque declarativo. Si estás solo en AWS y quieres integración estrecha, CloudFormation es razonable. Si tu equipo prefiere escribir Python en lugar de HCL, Pulumi merece una mirada. Pero para la mayoría de equipos que gestionan infraestructura entre distintos proveedores, Terraform es la elección pragmática.
Conceptos fundamentales
Providers
Los providers son plugins que permiten a Terraform interactuar con APIs — AWS, Azure, GCP, Kubernetes, GitHub, Cloudflare y cientos más.
| |
Resources
Los resources son los bloques de construcción fundamentales. Cada bloque resource describe un objeto de infraestructura.
| |
State
Terraform mantiene un fichero de estado que mapea tu configuración a recursos del mundo real. Así es como Terraform sabe qué existe, qué necesita cambiar y qué destruir. El fichero de estado es crítico. Perderlo significa que Terraform pierde la pista de tu infraestructura.
Modules
Los modules son paquetes reutilizables de configuración Terraform. Piensa en ellos como funciones: reciben entradas (variables), crean recursos y producen salidas.
| |
Ejemplo práctico: VPC + EC2
Aquí hay un ejemplo completo que aprovisiona una VPC con una subred pública y una instancia EC2:
| |
El flujo plan/apply
Terraform sigue un flujo de trabajo predecible:
| |
El paso terraform plan es el más importante. Nunca te lo saltes. Siempre revisa la salida del plan antes de aplicar, especialmente en producción. El plan te muestra exactamente qué se creará, modificará o destruirá.
| |
En pipelines CI/CD, guarda el plan en un fichero (-out=tfplan) y aplica ese plan exacto. Esto previene condiciones de carrera donde la infraestructura cambia entre el plan y el paso de apply.
Buenas prácticas de gestión de estado
La gestión de estado es donde se originan la mayoría de problemas con Terraform. Sigue estas prácticas:
Usa un backend remoto
Nunca almacenes el estado localmente o en Git. Usa un backend remoto con cifrado y bloqueo:
| |
La tabla DynamoDB proporciona bloqueo de estado. Esto previene que dos personas o pipelines modifiquen la misma infraestructura al mismo tiempo.
Organiza el estado por componente
No pongas toda tu infraestructura en un solo fichero de estado. Divídela por componente o equipo:
| |
Ficheros de estado más pequeños significan planes más rápidos, menor radio de explosión y menos equipos compitiendo por los bloqueos.
Usa terraform_remote_state con moderación
Puedes referenciar outputs de otros ficheros de estado, pero úsalo con cuidado. El uso excesivo de remote state crea acoplamiento fuerte entre componentes. Prefiere pasar valores a través de variables o un parameter store.
Consejos para uso en producción
Fija las versiones de los providers. Usa restricciones
~>para permitir actualizaciones de parche pero prevenir cambios incompatibles:version = "~> 5.0".Usa workspaces con cuidado. Los workspaces son útiles para separación simple de entornos pero se vuelven confusos a escala. Directorios separados por entorno suele ser más claro.
Implementa un pipeline CI/CD para Terraform. Ejecuta
terraform planen PRs y publica la salida como comentario en el PR. Ejecutaterraform applysolo después del merge y la aprobación.Usa
prevent_destroypara recursos críticos. Esta regla de lifecycle evita la destrucción accidental de bases de datos o almacenamiento persistente:1 2 3 4 5 6resource "aws_db_instance" "main" { # ... lifecycle { prevent_destroy = true } }Etiqueta todo. Usa un bloque
default_tagsen el provider para asegurar que cada recurso recibe tags estándar (entorno, equipo, proyecto).Usa
tflintycheckov. Haz lint de tu código Terraform y escanea en busca de configuraciones inseguras antes de aplicar.1 2 3tflint --init tflint checkov -d .Importa recursos existentes. Si tienes infraestructura creada manualmente, usa
terraform importpara traerla bajo gestión en lugar de recrearla.Revisa el diff del plan cuidadosamente. Un recurso que muestra “destroy and recreate” puede causar tiempo de inactividad. Entiende qué cambios son in-place versus destructivos.
Terraform es una de esas herramientas que recompensa la disciplina. Cuanto más consistentemente sigas estas prácticas, con más confianza gestionará tu equipo la infraestructura a escala.