Infraestructura como codigo: Terraform vs Pulumi vs CDK
La decision que define tu operaciones
La herramienta de Infrastructure as Code (IaC) que elijas condiciona como tu equipo piensa sobre infraestructura durante los proximos 3-5 años. No es una decision trivial. Terraform, Pulumi y AWS CDK representan tres filosofias diferentes sobre como definir y gestionar recursos cloud, y cada una tiene implicaciones profundas en la productividad del equipo, la portabilidad entre proveedores y la capacidad de testing.
Hemos usado las tres en produccion. Este articulo documenta lo que hemos aprendido, con datos concretos y opiniones honestas.
Terraform: el estandar de la industria
Terraform de HashiCorp lleva desde 2014 y tiene una posicion dominante. Segun la encuesta de CNCF 2024, el 64% de las organizaciones que usan IaC eligen Terraform. Esa masa critica importa: mas documentacion, mas modulos comunitarios, mas ingenieros que lo conocen.
El lenguaje: HCL
Terraform usa HCL (HashiCorp Configuration Language), un lenguaje declarativo diseñado especificamente para definir infraestructura. No es un lenguaje de programacion de proposito general. Es un lenguaje de configuracion con esteroides.
resource "aws_lambda_function" "api" {
function_name = "api-handler"
runtime = "nodejs20.x"
handler = "index.handler"
memory_size = 256
timeout = 30
environment {
variables = {
DB_HOST = aws_rds_cluster.main.endpoint
}
}
}
Lo bueno de HCL: es legible por cualquiera que haya visto un archivo de configuracion. No necesitas saber programar para entender que hace un plan de Terraform. La barrera de entrada es genuinamente baja. Los juniors lo aprenden en dias, no en semanas.
Lo malo de HCL: cuando necesitas logica compleja (bucles condicionales, transformaciones de datos, composicion dinamica), HCL se vuelve dolorosamente limitado. Los for_each, count, dynamic blocks y funciones built-in cubren muchos casos, pero a veces terminas luchando contra el lenguaje en lugar de expresar tu intencion.
Un ejemplo real: generar reglas de seguridad para 15 microservicios donde cada uno tiene puertos y CIDRs diferentes. En Python, es un bucle con un diccionario. En HCL, es un for_each anidado con flatten y lookup que requiere tres lecturas para entender.
Estado y plan
El modelo de Terraform se basa en un archivo de estado (state) que representa la realidad de la infraestructura y un plan que muestra los cambios antes de aplicarlos. terraform plan es probablemente la feature mas valiosa de toda la herramienta: ver exactamente que va a cambiar antes de que cambie.
El estado es tambien la mayor fuente de dolor. Conflictos de estado cuando dos personas modifican infraestructura simultaneamente, drift entre el estado y la realidad, operaciones de state mv y state rm que requieren precision quirurgica. Terraform Cloud y backends remotos con locking mitigan el problema, pero no lo eliminan.
Ecosistema
Terraform tiene providers para practicamente todo: AWS, Azure, GCP, Cloudflare, Datadog, PagerDuty, GitHub, Kubernetes, y cientos mas. El Terraform Registry aloja mas de 3.500 providers y 15.000 modulos. Para cualquier servicio cloud mainstream, hay un provider maduro y bien mantenido.
Los modulos de la comunidad son un arma de doble filo. Los modulos oficiales (como terraform-aws-modules/vpc) son excelentes. Los modulos random de terceros varian enormemente en calidad. Nuestra regla: usar modulos oficiales o de organizaciones verificadas; para todo lo demas, escribir modulos propios.
La cuestion de la licencia
En agosto de 2023, HashiCorp cambio Terraform de MPL a BSL (Business Source License). Esto provoco la creacion de OpenTofu, un fork mantenido por la Linux Foundation. A efectos practicos, la funcionalidad es identica y la transicion entre ambos es trivial. Pero si la licencia es una preocupacion para tu organizacion, OpenTofu es la alternativa directa.
Pulumi: IaC en tu lenguaje
Pulumi tomo una decision de diseño radical: en lugar de inventar un nuevo lenguaje, permite definir infraestructura en lenguajes de programacion existentes. TypeScript, Python, Go, C#, Java. La infraestructura es codigo, literalmente.
const api = new aws.lambda.Function("api", {
runtime: "nodejs20.x",
handler: "index.handler",
memorySize: 256,
timeout: 30,
environment: {
variables: {
DB_HOST: cluster.endpoint,
},
},
});
La promesa y la realidad
La promesa: usa las herramientas que ya conoces. IDEs con autocompletado, type checking, debugging, testing frameworks nativos. Logica compleja con bucles, funciones, clases. Reutilizacion de codigo con los mecanismos del lenguaje en lugar de modulos especificos.
La realidad: la promesa se cumple, pero con matices. El autocompletado funciona y es genuinamente util. Los tipos previenen errores que en Terraform solo descubririas en apply. Pero la curva de aprendizaje es mas pronunciada. Un ingeniero que sabe Python necesita aprender el modelo de recursos de Pulumi, el concepto de stacks, la diferencia entre inputs y outputs, y como funciona la resolucion asincrona de dependencias. No es trivial.
Donde Pulumi brilla
Logica compleja: cuando la infraestructura tiene logica condicional significativa, Pulumi es claramente superior. Generar recursos basados en configuracion dinamica, aplicar politicas condicionalmente, transformar datos de entrada; todo esto es natural en un lenguaje de programacion y forzado en HCL.
Testing: Pulumi permite unit testing real de infraestructura con frameworks estandar (Jest, pytest, Go testing). Puedes mockear los providers y verificar que tu logica genera los recursos correctos sin necesidad de aplicar nada. En Terraform, el testing nativo (terraform test) es funcional pero mas limitado.
Component resources: Pulumi permite crear abstracciones de alto nivel que encapsulan multiples recursos. Un DatabaseCluster que internamente crea la instancia RDS, los security groups, los parameter groups y las alertas de CloudWatch. El mecanismo de componentes es mas natural que los modulos de Terraform porque usa herencia y composicion del lenguaje.
Donde Pulumi sufre
Menor ecosistema: menos providers, menos ejemplos, menos ingenieros que lo conocen. Encontrar un ingeniero con experiencia en Pulumi es significativamente mas dificil que encontrar uno con experiencia en Terraform.
Complejidad accidental: la libertad de usar un lenguaje de proposito general es tambien una invitacion a sobreingenierar. Hemos visto proyectos Pulumi donde alguien construyo un framework de abstraccion de tres niveles sobre los recursos basicos. El resultado era mas dificil de entender que el HCL equivalente.
Estado: Pulumi tiene su propio sistema de estado, similar al de Terraform pero con Pulumi Cloud como backend por defecto. Puedes usar backends locales o S3, pero la experiencia esta optimizada para el servicio cloud de Pulumi. Dependencia de vendor en la herramienta de gestion de infraestructura: ironico.
AWS CDK: la apuesta de Amazon
AWS Cloud Development Kit (CDK) usa el mismo principio que Pulumi (IaC en lenguajes reales) pero con un giro: genera CloudFormation templates como paso intermedio. Defines infraestructura en TypeScript, Python, Java, C# o Go, y CDK la sintetiza en CloudFormation JSON/YAML que AWS despliega.
const fn = new lambda.Function(this, 'ApiHandler', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
memorySize: 256,
timeout: Duration.seconds(30),
environment: {
DB_HOST: cluster.clusterEndpoint.hostname,
},
});
Los constructs: la killer feature
CDK organiza los recursos en tres niveles de abstraccion llamados constructs:
L1 (Cfn resources): mapeo 1:1 con recursos de CloudFormation. Verboso pero completo.
L2 (curated constructs): abstracciones de alto nivel con defaults inteligentes. Un Function de L2 configura automaticamente el IAM role, los logs en CloudWatch y la politica de retry. Reduce el boilerplate dramaticamente.
L3 (patterns): combinaciones predefinidas de recursos. LambdaRestApi crea una Lambda, un API Gateway, los permisos necesarios y los stages de deployment en una unica linea.
Los L2 y L3 son la razon por la que CDK es tan productivo para equipos que trabajan exclusivamente en AWS. Un desarrollador puede levantar una arquitectura serverless completa en 50 lineas de TypeScript. El equivalente en Terraform seria 200+ lineas de HCL.
La limitacion fundamental
CDK es solo para AWS. No hay soporte para Azure, GCP ni ningun otro proveedor. CDK for Terraform (CDKTF) existe como puente, pero en la practica es un wrapper sobre Terraform providers con una experiencia inferior al CDK nativo.
Si tu infraestructura es 100% AWS y no tienes planes de cambiar, CDK es probablemente la opcion mas productiva. Si hay cualquier posibilidad de multi-cloud, CDK te ata a un proveedor.
CloudFormation como backend
Que CDK genere CloudFormation es una ventaja y una limitacion. Ventaja: CloudFormation es un servicio gestionado de AWS con rollback automatico, drift detection y stack policies. No hay estado que gestionar manualmente. Limitacion: CloudFormation tiene limites (500 recursos por stack, velocidad de despliegue dependiente del servicio) y los errores de CloudFormation son notoriamente criticos de diagnosticar. Cuando CDK falla, tienes que leer errores de CloudFormation y mapearlos mentalmente al codigo TypeScript. No es divertido.
Comparativa directa
| Criterio | Terraform | Pulumi | CDK |
|---|---|---|---|
| Lenguaje | HCL | TS, Python, Go, C#, Java | TS, Python, Go, C#, Java |
| Multi-cloud | Excelente | Bueno | Solo AWS |
| Curva aprendizaje | Baja | Media-alta | Media |
| Testing | Basico (terraform test) | Nativo (Jest, pytest) | Nativo + assertions CDK |
| Ecosistema | Muy grande | Medio | Grande (AWS) |
| Estado | Self-managed + Cloud | Pulumi Cloud + self | CloudFormation (gestionado) |
| Madurez | Alta (10+ años) | Media (6+ años) | Media (6+ años) |
| Contratacion | Facil | Dificil | Medio |
Cuando elegir cada uno
Elige Terraform si: tu equipo es operaciones-first, trabajas con multiples clouds, la plantilla incluye personas sin background de programacion fuerte, o valoras la mayor comunidad y ecosistema.
Elige Pulumi si: tu equipo es desarrollo-first, necesitas logica de infraestructura compleja, priorizas testing y type safety, y tienes ingenieros con experiencia solida en TypeScript o Python.
Elige CDK si: tu infraestructura es 100% AWS, quieres la maxima productividad con defaults inteligentes, y no te preocupa el vendor lock-in con Amazon.
Nuestra posicion: para la mayoria de nuestros clientes (empresas medianas españolas con necesidades multi-cloud moderadas y equipos mixtos de operaciones y desarrollo), Terraform sigue siendo la recomendacion por defecto. No porque sea el mejor en ningun eje individual, sino porque es el mas equilibrado: suficientemente potente, ampliamente conocido, y con el ecosistema mas maduro. Pulumi es nuestra segunda eleccion para equipos con fuerte cultura de desarrollo que priorizan type safety y testing.
La herramienta importa menos de lo que crees
Una confesion: hemos pasado mas tiempo debatiendo que herramienta de IaC usar que el que habriamos ahorrado eligiendo la “perfecta”. Las tres herramientas funcionan. Las tres tienen limitaciones. Lo que realmente determina el exito de tu IaC no es la herramienta sino las practicas:
- Todo en codigo: zero recursos manuales. Si alguien crea un security group desde la consola, se borra.
- Review de infraestructura como review de codigo: los planes de Terraform (o equivalentes) se revisan en PR antes de aplicar.
- Modulos reutilizables: no copies y pegues. Encapsula patrones comunes en modulos o componentes.
- Entornos identicos: staging debe ser una replica de produccion, definida con el mismo codigo.
- Drift detection: detectar y corregir cambios manuales periodicamente.
Elige una herramienta, aprende a usarla bien, y enfoca la energia en las practicas, no en la siguiente herramienta.
Nuestro equipo de cloud y DevOps implementa infraestructura como codigo para organizaciones de todos los tamaños. Si estas considerando una migracion de IaC o empezando desde cero, podemos ayudarte a elegir la herramienta adecuada y establecer las practicas que la hacen funcionar. Para arquitecturas multi-cloud, la eleccion de IaC es especialmente critica.
Etiquetas
Sobre el autor
abemon engineering
Equipo de ingenieria
Equipo multidisciplinar de ingenieria, datos e IA con sede en Canarias. Construimos, desplegamos y operamos soluciones de software a medida para empresas de cualquier escala.