Infra as Code: por qué tu infraestructura merece versionado igual que tu código
Publicado el 30 de marzo de 2026 • 25 minutos • 5206 palabras
Table of contents
- La escena del crimen: vida antes sin IaC
- Qué es Infrastructure as Code (y qué problema viene a arreglar)
- ¿Es IaC para ti? (sin anestesia)
- Las familias: Terraform, OpenTofu, Pulumi, CDK y demás fauna
- Por qué tu infraestructura merece
git logigual que tu código - El coste real de adoptar IaC
- Los riesgos: automatizar también la cagada
- Tengo infra existente: ¿qué hago?
- Un flujo razonable para no morir el primer mes
- Mini-ejemplo: una EC2 con Terraform sin invocar a Satán
- Glosario rápido
- Fuentes y referencias
Durante años hemos tratado infraestructura y software como si fueran dos religiones distintas con sus propios dioses, sus propios rituales y, sobre todo, sus propios culpables. El código estaba en Git, la infraestructura “en AWS”, como una cosa etérea que “ya se gestiona con scripts y con la consola”.
Pero la verdad es que tu infraestructura ya se comporta como software: tiene estados, dependencias, bugs, versiones y efectos secundarios cuando la cambias.
Infrastructure as Code no es tanto una moda como un ejercicio de coherencia: aceptar que, si tu producto vive en diez servicios cloud, docenas de recursos y tres entornos, seguir tratando la infraestructura como si fueran “tres servidores” es autoengañarse. Si se rompe, se rompe como se rompe el código: por cambios mal pensados.
La diferencia es que el código lo versionas y la infraestructura, si no haces nada, la toqueteas a pelo. Y eso, a estas alturas, roza lo suicida.
La escena del crimen: vida antes sin IaC
Son las 14:37 de un viernes. Alguien en el canal de incidencias escribe “producción caída”. El responsable de la infraestructura está de vacaciones en Lanzarote. El repositorio tiene un README.md que en la sección “Cómo levantar el entorno” pone “ver doc interna”, y la doc interna es un Google Doc editado por última vez en octubre de 2022 con el título (optimista) de “BORRADOR - infra v2 FINAL FINAL2”.
Nadie sabe exactamente qué hay en producción. Hay capturas de pantalla de la consola de AWS pegadas en Confluence que ya no corresponden a la realidad —las interfaces han cambiado dos veces desde entonces— y un script bash llamado setup_USAR_ESTE.sh que tiene un TODO: arreglar el tema de los puertos desde hace dieciséis meses. El firewall tiene puertos abiertos que nadie recuerda haber abierto. Hay tres instancias EC2 que nadie sabe para qué sirven pero nadie se atreve a apagar. Una de ellas se llama test2_def_FINAL y lleva facturando desde 2021.
Bienvenido al servidor copo de nieve (snowflake server), el anti-patrón que Martin Fowler describió hace ya más de una década y que sigue siendo la decoración habitual en incontables empresas: un servidor tan personalizado, tan lleno de configuraciones manuales, de parcheos ad hoc y de decisiones que “tenían sentido en su momento”, que se ha vuelto único e irreproducible. Como un copo de nieve, sí: precioso, irrepetible y condenado a derretirse en el momento más inoportuno. Nadie sabe qué hay dentro, y la verdad sobre “¿podríamos volver a montarlo si se cae?” es “en teoría, sí, pero tardaríamos días y rezaríamos mucho”.
Este patrón tiene un primo más moderno y aparentemente más sofisticado: el servidor fénix mal ejecutado. La teoría dice que un servidor fénix muere y renace desde cero con regularidad , por lo que nunca se estanca en un estado imposible de reproducir. La práctica en muchas organizaciones es: “tenemos un script que lo levanta, pero solo lo ha ejecutado Marcos, y Marcos ya no trabaja aquí”. El resultado es el mismo copo de nieve, pero creyéndose fénix.
No es que la gente sea descuidada o irresponsable. Es que hacer clic es lo más fácil, especialmente al principio. Consola abierta, recurso creado, problema resuelto, reunión en diez minutos. El coste no se paga hasta meses después, cuando hay que reproducir ese entorno en staging, o auditarlo, o recuperarlo tras un fallo. Y para entonces el conocimiento vive en la cabeza de una persona que puede estar de baja, en otro continente o simplemente haber olvidado qué hizo exactamente.
Amazon lo resume con la frialdad habitual de quien vende la solución: los procesos manuales son lentos, propensos a errores y no escalan. Pero el impacto real es más humano que técnico: el viernes a las 14:37, todos mirándose las caras, nadie con nada que desplegar, es el precio diferido de no haber escrito nada.
Qué es Infrastructure as Code (y qué problema viene a arreglar)
La Infraestructura como código (IaC) es la práctica de definir y gestionar recursos de infraestructura – máquinas virtuales, redes, balanceadores, bases de datos, roles de IAM, etc. – mediante ficheros de texto versionables, en lugar de hacer clic por la consola o lanzar comandos sueltos desde tu terminal.
En la práctica, IaC da respuesta a cuatro quebraderos de cabeza del equipo que gestiona infra:
Primero, la repetibilidad: levantar un entorno nuevo no debería requerir rezar para que alguien recuerde “los pasos exactos”. Con IaC, el “paso exacto” es aplicar el mismo código contra otra cuenta o región.
Segundo, la trazabilidad: cada cambio en infra deja un
git diff. Sabes quién añadió ese puerto, quién cambió ese tipo de instancia, cuándo y (si hay suerte) por qué.Tercero, la consistencia: staging y producción dejan de ser primos lejanos que “más o menos se parecen” para ser, dentro de lo razonable, hijos del mismo código. Menos “en mi entorno va” y más “aquí y allí se ha aplicado el mismo plan”.
Y cuarto, la automatización: si tu CI/CD ya despliega código, ¿por qué ibas a seguir gestionando la mitad del sistema a mano? IaC te permite que la creación/actualización de infra sea parte del mismo pipeline, con revisiones, aprobaciones y controles de seguridad incluidos.
Hay un concepto que distingue el IaC real de “un script bash con buena presentación”: la idempotencia .
Una operación idempotente produce el mismo resultado sin importar cuántas veces se ejecute.
Si ejecutas terraform apply y ya existe la infraestructura que describes, Terraform no crea otra igual por encima: comprueba el estado actual, lo compara con el código y solo actúa sobre las diferencias. Si no hay diferencias, no toca nada. Este comportamiento parece obvio hasta que lo contrastas con el mundo de los scripts imperativos, donde ejecutar create_server.sh dos veces puede terminar en dos servidores, una factura doble y una conversación incómoda con el equipo de finanzas.
Red Hat , AWS y otras llevan años con la misma cantinela: IaC reduce errores humanos, acelera despliegues y hace tu postureo de “DevOps” algo menos impostado.
¿Es IaC para ti? (sin anestesia)
Aquí es donde la mayoría de los artículos sobre IaC hacen trampa: te explican qué es, cuánto mola, y dan por sentado que la respuesta es “sí, adopta IaC ahora mismo”. Pero eso es hacerte trampas al solitario, y tú mereces una respuesta más útil.
Probablemente sí, si…
Tu equipo tiene más de una persona que toca la infraestructura. Con una sola persona que “sabe cómo está montado”, no tienes un problema de IaC, tienes un problema de bus factor —la pregunta incómoda de qué pasaría si esa persona se va o es atropellada por un autobús—. IaC no resuelve la rotación, pero sí hace que el conocimiento esté escrito en lugar de en la cabeza de alguien.
Gestionas más de un entorno (desarrollo, staging, producción, demo para el cliente, entorno de pruebas de seguridad…). A partir de dos entornos que quieres que se parezcan, el coste de mantenerlos sincronizados a mano empieza a comerse el tiempo de maneras poco habituales.
Trabajas en la nube y tus recursos cambian con frecuencia. Escalar, cambiar tipos de instancia, añadir regiones, ajustar permisos… cada una de esas operaciones manuales es una oportunidad de olvido o error. Si tu infraestructura en la práctica no cambia nunca, la ecuación cambia.
Tienes requisitos de cumplimiento normativo o auditoría. Si alguien puede pedirte demostrar quién cambió qué recurso y cuándo, un git log es infinitamente mejor que “bueno, creo que fue Pedro en algún momento de 2024”.
Probablemente no (todavía), si…
Es un proyecto personal, un experimento de fin de semana o algo que vas a tirar en tres meses. IaC tiene un coste de arranque real: escribir el código, aprender la herramienta, integrar el pipeline. Si el proyecto tiene más posibilidades de morir que de crecer, ese coste no se amortiza.
Tienes una sola instancia sencilla y no vas a añadir más. Una VM que no cambia, gestionada por una sola persona, en un entorno que no necesita reproducirse. En este caso, IaC es un martillo para un clavo que no existe.
Estás en plena fase de aprendizaje de cloud y todavía no entiendes bien qué recursos estás creando. Antes de automatizar, conviene entender qué estás automatizando. Pulsar botones en la consola al principio no es pecado: es exploración. El problema es quedarse ahí cuando ya sabes lo que necesitas.
La regla práctica que circula entre ingenieros veteranos es algo así: si vas a crear el mismo recurso más de dos veces, o si más de una persona necesita entender cómo está montada tu infraestructura, empieza a considerar IaC seriamente. Antes de eso, es optimización prematura.
Las familias: Terraform, OpenTofu, Pulumi, CDK y demás fauna
En el panorama de IaC hay tres herramientas que salen en todas las guías modernas : Terraform/OpenTofu, Pulumi y CDK.
Terraform fue durante mucho tiempo el rey del mambo: lenguaje declarativo propio (HCL), soporte para casi cualquier proveedor cloud, miles de módulos de la comunidad. Escribes “quiero una VPC, estas subredes, estos grupos de seguridad y una EC2” y Terraform habla con la API de AWS, calcula qué cambiar y lo aplica. Todo muy civilizado: plan para ver qué pasaría, apply para hacerlo realidad.
Hasta que llegó la cláusula de Netflix.
Bueno, no se llamaba así, pero casi.
En 2023 HashiCorp decidió cambiar la licencia de Terraform de MPL (open source de toda la vida) a Business Source License (BSL): el código se ve, pero hay limitaciones muy serias para que otras empresas monten servicios comerciales compatibles. El argumento oficial: “no queremos que los hyperscalers nos usen de base para ganar dinero sin contribuir”. El efecto colateral: cientos de equipos y proveedores que habían apostado por Terraform empezaron a oler a riesgo de lock-in y a decir “un momento”.
La respuesta fue OpenTofu : un fork de Terraform auspiciado por la Linux Foundation, con la misma sintaxis de HCL y la misma filosofía, pero bajo licencia realmente libre. El manifiesto de OpenTofu es básicamente una carta de amor al open source de siempre y una colleja elegante a HashiCorp: “gracias por todo, pero a partir de aquí seguimos por nuestra cuenta”. Hoy, muchas comparativas serias de IaC plantean directamente Terraform vs OpenTofu según cuánto te preocupen las implicaciones de la BSL.
En otro extremo está Pulumi, que dijo: “¿y si escribimos IaC en lenguajes normales?”. Nada de HCL ni YAML: usas TypeScript, Python, Go, C#, o lo que prefieras, con librerías que modelan recursos de AWS, Azure, GCP y compañía. Ventaja: puedes reutilizar ecosistema, tipado, librerías, tests… todo lo que ya conoces del lenguaje. Inconveniente: la comunidad y el catálogo aún son más pequeños que los de Terraform/OpenTofu, y tiendes a atarte más a la plataforma de Pulumi como tal.
Por último, AWS CDK (y sus primos en otros clouds) juegan la carta de “si ya estás en mi casa, quédate a vivir”: defines tu infraestructura AWS usando constructos de alto nivel en TypeScript, Python, Java, o algún otro oscuro lenguaje, que luego se traducen a CloudFormation por debajo. Es comodísimo si vives solo en AWS y te da igual el multi-cloud; menos útil si mañana quieres que el mismo stack funcione en Azure sin reescribir medio proyecto.
Las comparativas recientes vienen a decir: Terraform/OpenTofu si quieres multi-cloud y ecosistema masivo; CDK si eres fan de AWS y no piensas cambiarte; Pulumi si tu equipo dev quiere IaC en el mismo idioma que el backend y está dispuesto a tragarse más curva de aprendizaje.
Una última variable que no suele aparecer en los tutoriales es el dinero.
El CLI de Terraform y el de OpenTofu son gratuitos. La diferencia empieza cuando necesitas gestión de estado remoto en equipo, pipelines de CI/CD integrados o control de acceso fino: Terraform Cloud arranca gratis con uso limitado y pasa a unos 20 $/usuario/mes en el plan Team. OpenTofu, al ser open source puro, no tiene plan de pago propio: usas el backend remoto que quieras (S3, GitLab, etc.) y pagas por eso, no por la herramienta. Pulumi tiene un nivel gratuito con historial de estado limitado y pasa a unos 50 $/mes por el plan Team. AWS CDK es gratis como herramienta; pagas CloudFormation si superas el millón de llamadas al API al mes, lo que en proyectos normales no ocurre. La moraleja: para un equipo pequeño o mediano, el coste directo de la herramienta rara vez es el factor decisivo; el coste real está en el tiempo de aprendizaje y migración, del que hablaremos en la siguiente sección.
Por qué tu infraestructura merece git log igual que tu código
Imagina que tu código se mantuviera “a base de clics”: copiar/pegar desde Stack Overflow directamente en producción, cambios a mano en ficheros, sin control de versiones, sin pull requests. Te echarías a reír. O a llorar.
Eso es exactamente lo que sigue pasando en muchas infraestructuras.
Cuando describes tu infra como código, pasan varias cosas casi mágicas:
Tus servidores, redes y permisos dejan de ser “ese estado misterioso que hay ahora mismo en la consola” para convertirse en algo que se puede leer y discutir. Puedes hacer un git blame a un grupo de seguridad igual que a una función. Puedes ver, en un PR, que alguien propone abrir 0.0.0.0/0 al puerto 22 y devolverle un cariñoso “¿pero tú estás bien, chaval?”.
Tus entornos dejan de ser criaturas mutantes. Staging y producción se configuran con los mismos módulos, las mismas plantillas, cambiando variables (región, tamaños, cuentas) en lugar de repetir clics. No son gemelos idénticos – siempre hay particularidades–, pero dejan de ser primos lejanos.
Y, sobre todo, puedes volver atrás con cierto orden. Si aplicas un cambio que rompe medio chiringuito, tienes un commit concreto que revertir o corregir, no una sucesión de “creo que toqué esto y luego aquello” perpetrada desde un navegador.
Red Hat resumía los pros de IaC en tres palabras: velocidad, consistencia y control; los contras, sobre todo, en que ahora tus errores de diseño están codificados y pueden replicarse en todas partes. Pero, siendo sinceros, ya te equivocabas antes: al menos ahora dejas huellas.
El coste real de adoptar IaC
Que conste: IaC merece la pena. Pero hay una diferencia entre decirte “merece la pena” y ayudarte a entender lo que te vas a comer antes de que la inversión empiece a devolver algo.
La curva de aprendizaje inicial
Si vienes del mundo de “clic y funciona” o de shell scripts, las primeras semanas con Terraform o Pulumi serán… interesantes.
HCL no es difícil, pero tiene sus peculiaridades: los bloques de locals, la gestión de dependencias implícitas entre recursos, los ciclos que no son ciclos del todo, las funciones de interpolación. Estudios y encuestas en equipos que adoptaron IaC
apuntan consistentemente a que la productividad baja durante las primeras dos a cuatro semanas mientras el equipo aprende la herramienta y los patrones. No es un fracaso; es el peaje de cualquier cambio de paradigma. Pero conviene planificarlo en lugar de descubrirlo el lunes que tienes que entregar.
El impuesto de la migración
Si ya tienes infraestructura funcionando, adoptar IaC no empieza con “crear recursos nuevos”: empieza con el tedioso proceso de describir en código lo que ya existe.
Antes de ver ningún beneficio, dedicas tiempo a escribir Terraform/OpenTofu para recursos que ya están ahí, importarlos al estado, verificar que el plan no destruye nada, y convencer a tu colega que lleva tres años con la consola abierta de que esto no es perder el tiempo. Este impuesto es real y la literatura técnica lo llama el “brownfield problem”
: migrar infraestructura existente es siempre más lento y menos glamuroso que arrancar desde cero.
La resistencia humana
Hay un personaje en casi todos los equipos: la persona que “sabe cómo está montado todo”.
Esa persona ha acumulado años de conocimiento implícito, y la llegada de IaC significa externalizar ese conocimiento a un repositorio donde cualquiera puede verlo, cuestionarlo y cambiarlo. No siempre es bienvenida.
La adopción de IaC tiene tanto de proceso de gestión del cambio como de proceso técnico. Si el equipo no está alineado, el resultado frecuente es tener los dos mundos: el código IaC “oficial” y los cambios manuales que se siguen haciendo porque “era más rápido”.
Cuándo empieza a pagar
El momento que más se describe en retrospectivas de equipos que hicieron la transición es este: la primera vez que alguien del equipo con menos experiencia levanta un entorno nuevo completamente solo, sin preguntar a nadie, siguiendo solo el repositorio.
Ese momento —normalmente entre el mes uno y el mes tres— es cuando el ROI se vuelve tangible y los escépticos empiezan a callarse. HashiCorp lo documenta como el segundo estadio de adopción : pasar de “lo usa una persona” a “el equipo entero confía en ello como fuente de verdad”.
Los riesgos: automatizar también la cagada
IaC no es la panacea; es una forma distinta de equivocarse, pero dejando rastro.
Uno de los grandes miedos de la gente de seguridad es el fallo de configuración en cadena . Antes bastaba con que alguien abriera un puerto de más en un servidor: mal menor. Ahora, si tu componente “estándar” de seguridad tiene un fallo, lo vas a replicar en todas las cuentas, todas las regiones y todos los entornos con una elegancia que asusta.
CrowdStrike y otros llevan tiempo avisando: mover la infraestructura a código sin meter la seguridad en el mismo pipeline es receta para el desastre —aunque, viniendo de quien en julio de 2024 tumbó ocho millones y medio de máquinas Windows con una actualización defectuosa , es un poco como que el pirómano te explique cómo instalar extintores.
El caso es que si haces plan y apply sin pasar por escáneres de configuración, validación de políticas o revisiones mínimamente decentes, solo has conseguido equivocarte más rápido y en más sitios a la vez.
Otro clásico es la gestión de secretos como si fueran post-its. Contraseñas, claves de API, tokens de acceso… todo ello embutido en ficheros .tf o .ts y alegremente subido a repositorios. Los mismos artículos que te venden IaC te repiten como un mantra: secretos, siempre, en gestores dedicados (Vault, AWS Secrets Manager, SSM, etc.), nunca incrustados en el código de infraestructura.
Y luego está el monstruo de Frankenstein: el proyecto IaC inabarcable. Empiezas con un repositorio pequeño, añades bloques, metes condicionales para diez clientes, cinco clouds, tres continentes, y cuando quieres darte cuenta tienes un árbol de ficheros que parece el guion de una telenovela larga. Nadie sabe qué depende de qué, la gente tiene miedo de tocar nada, y has pasado de “infraestructura declarativa” a “puzzle declarativo del infierno”.
Las buenas prácticas insisten en lo aburrido pero eficaz: modularizar, separar por dominios (red, compute, datos…), no mezclar producción con entornos personales, y documentar patrones claros para que cada equipo no invente su propia religión de componentes.
Y hablando de dramas silenciosos: el fichero de estado de Terraform (terraform.tfstate) merece su propio párrafo de advertencia.
Ese fichero es el mapa entre tu código y los recursos reales que existen en el cloud. Sin él, Terraform no sabe qué ha creado, qué gestiona y qué debe dejar en paz.
El problema clásico ocurre cuando ese fichero vive en el portátil de alguien: si esa persona se va de la empresa, sufre un accidente de hardware o simplemente no conecta la VPN cuando hay una urgencia, tu capacidad de gestionar la infraestructura queda en el aire. El escenario más dramático —y más documentado en foros de Terraform— es el de las aplicaciones concurrentes
: dos personas hacen apply al mismo tiempo sobre el mismo estado, el fichero se corrompe, y el resultado es una infraestructura parcialmente aplicada que ni Terraform ni la consola de AWS saben describir con coherencia.
La solución es usar un backend remoto con bloqueo de estado: S3 + DynamoDB en AWS, Terraform Cloud, GitLab-managed state, o cualquier otra opción que garantice que (a) el estado no vive en una máquina personal y (b) solo un ejecutor puede modificarlo a la vez. No es opcional cuando hay más de una persona en el equipo; es tan básico como no guardarse las credenciales en un post-it.
Tengo infra existente: ¿qué hago?
Si llegas a este artículo con infraestructura ya en marcha —servidores, redes, bases de datos, roles IAM— la pregunta inevitable es: “¿cómo encaja esto?”. La respuesta corta es: con paciencia y a pasitos.
El escenario de partir de cero (greenfield) es el más sencillo: empiezas escribiendo todo en IaC desde el primer día, no hay legado que gestionar y el coste de migración es cero. Es la situación ideal y la que describe casi todos los tutoriales de Internet, lo cual es ligeramente irritante cuando tienes tres años de infraestructura ya desplegada.
El escenario real para la mayoría es el brownfield: infraestructura existente, en producción, que no puedes tirar y volver a montar sin una conversación muy incómoda con tu equipo.
La estrategia que funciona tiene dos patas:
La primera es
terraform import(o su equivalente en OpenTofu, que es igual): un comando que le dice a Terraform “este recurso que ya existe en la nube, quiero que empieces a gestionarlo tú”. Escribes el bloque de código correspondiente al recurso, ejecutasterraform import <tipo.nombre> <id_del_recurso>y Terraform incorpora ese recurso a su estado sin destruirlo ni recrearlo. A partir de ahí, cualquier cambio se hace a través del código, no de la consola. Parece magia, pero tiene trampa: si el bloque de código que has escrito no coincide exactamente con la configuración real del recurso, el siguienteplanmostrará “voy a cambiar estas veintisiete propiedades” y tendrás que reconciliar manualmente. Tedioso, sí. Vale la pena igualmente.La segunda pata es la migración incremental: no intentes importar toda tu infraestructura en un asalto heroico de dos semanas. Empieza por un servicio o un dominio concreto —por ejemplo, las redes (VPC, subredes, grupos de seguridad)— impórtalo, verifica que el
plansale vacío (“no hay diferencias”), y márcalo como migrado. Luego el siguiente. Este enfoque es más lento en el papel, pero evita el escenario en que llevas cuatro semanas con un repositorio IaC a medio migrar que no puedes ni aplicar ni descartar.
Que conste: Terraform import ha mejorado mucho
desde Terraform 1.5, que introduce bloques import declarativos en el propio HCL en lugar de tener que lanzar el comando desde la CLI. OpenTofu ha adoptado la misma funcionalidad. Aun así, hay tipos de recursos complejos (IAM policies con muchas condiciones, configuraciones de RDS con decenas de parámetros, stacks de CloudFormation importados) donde la reconciliación manual sigue siendo laboriosa. Forma parte del precio de haber vivido en la consola durante años.
Un flujo razonable para no morir el primer mes
Cada empresa acaba encontrando su propia coreografía, pero hay un patrón que se suele repetir.
Lo primero es elegir herramienta sin dejarse arrastrar por modas: si ya tienes mucha inversión en Terraform y te preocupa la licencia, miras OpenTofu; si tu mundo es AWS y no tienes intención de salir de ahí, CDK te permite ir muy rápido; si tus devs son fans de TypeScript o Python y quieren IaC en ese idioma, consideras Pulumi.
En lugar de pasarlo todo a IaC como quien se apunta al gimnasio en enero, se empieza por una parte concreta: por ejemplo, la VPC base, o la parte de compute principal de un servicio. Se describe eso en IaC, se prueba en un entorno de laboratorio, se itera, se integra en CI/CD y, cuando funciona, se extiende al resto.
El flujo típico con Terraform/OpenTofu tiene algo de liturgia (de la buena):
Escribes o modificas código en una rama. Lanzas un plan que muestra qué va a cambiar (recursos a crear, modificar, destruir). Añades ese plan como comentario en un pull request, para que quienes revisen vean no solo el HCL, sino las consecuencias. Al aprobar y fusionar, un pipeline ejecuta el apply contra el entorno adecuado, con los permisos mínimos necesarios.
En paralelo, vas añadiendo guardarraíles: linters de IaC (para no repetir anti-patrones), escáneres de seguridad (para detectar S3 públicos, grupos 0.0.0.0/0, etc.), validación de normas internas (“toda instancia debe llevar estos tags”, “toda base de datos debe estar en subred privada”, etc.).
Y se establece el pacto de sangre: no tocar producción a mano salvo emergencia, y si se toca, se refleja luego en el código. Porque si no, tu IaC deja de ser la fuente de verdad y se convierte en fan fiction.
Mini-ejemplo: una EC2 con Terraform sin invocar a Satán
El movimiento se demuestra andando, así que vamos con un “hola mundo” de IaC tradicional: levantar una instancia EC2 en AWS con Terraform.
No es la infra de tu banco, pero sí lo justo para ver la mecánica.
Suponiendo que ya tienes Terraform instalado y tus credenciales de AWS configuradas (en ~/.aws/credentials o variables de entorno), puedes crear un archivo main.tf como este:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = ">= 1.6.0"
}
provider "aws" {
region = "eu-west-1"
}
resource "aws_instance" "demo" {
ami = "ami-0c55b159cbfafe1f0" # Ejemplo: Amazon Linux 2 en eu-west-1
# Busca la AMI actualizada en: https://console.aws.amazon.com/ec2/v2/home#AMICatalog
instance_type = "t3.micro"
tags = {
Name = "demo-iac-article"
}
}
En la línea de comandos, en esa carpeta:
terraform init
para que se descargue el proveedor de AWS y deje todo listo. Luego:
terraform plan
para ver qué tiene intención de hacer. Verás algo como “se va a crear aws_instance.demo con estas propiedades”. Si te parece bien:
terraform apply
aceptas cuando te lo pregunte, y Terraform crea la instancia en AWS.
Si mañana cambias el instance_type a t3.small y repites plan + apply, Terraform calculará que tiene que actualizar ese recurso, no recrearlo entero (salvo que ese cambio requiera reemplazo; lo indicará).
Si lo borras del código y haces apply, Terraform propondrá destruir la instancia.
El código manda, la consola obedece.
En un entorno profesional, harías varias cosas más:
Separarías variables (ami, instance_type, tags) en un variables.tf. Usarías un backend remoto (S3 + DynamoDB, Terraform Cloud o similar) para el estado, en vez de dejar terraform.tfstate en tu portátil. Ejecutarías plan y apply desde CI, no desde tu máquina personal. Y, posiblemente, migrarías a OpenTofu si quieres evitar líos de licencia a futuro y beneficiarte del ecosistema abierto.
Pero como ejemplo mínimo, ya ves la idea: tu servidor no “vive” en la consola de AWS, vive en un fichero de texto con historial, comentarios y capacidad de revertir si algo sale mal.
La moraleja es sencilla: tu infraestructura ya es software, te guste o no.
Tiene versiones, bugs, efectos secundarios y maneras creativas de fallar.
La infraestructura como código no garantiza que no la líes, pero al menos te permite que tus errores queden escritos, se puedan revisar y, con un poco de suerte, se puedan deshacer con un commit, no con una novena a San ChatGPT.
Glosario rápido
Porque apply sin entender primero el vocabulario es exactamente la clase de imprudencia de la que habla este artículo.
- AMI (Amazon Machine Image): la “foto” de un sistema operativo y su configuración que AWS usa para arrancar una instancia EC2. Cada región tiene sus propios identificadores de AMI, y las AMIs oficiales se actualizan con frecuencia. Puedes buscar las imágenes disponibles en el catálogo de AMIs de la consola de AWS
o a través de la CLI con
aws ec2 describe-images. - HCL (HashiCorp Configuration Language): el lenguaje declarativo propio de Terraform y OpenTofu. Se parece al JSON pero es más legible; describe qué recursos quieres, no cómo crearlos.
- BSL (Business Source License): licencia adoptada por HashiCorp en 2023 para Terraform. Permite ver el código fuente pero prohíbe usarlo para construir servicios comerciales competidores. No es open source según la definición de la OSI.
- IAM (Identity and Access Management): el sistema de permisos de AWS (y, con distintos nombres, de otros clouds). Define quién puede hacer qué sobre qué recursos. En IaC se gestiona junto con el resto de la infraestructura.
- CloudFormation: el servicio nativo de AWS para definir infraestructura como código en formato YAML o JSON. AWS CDK lo usa como motor de despliegue por debajo.
- VPC (Virtual Private Cloud): red privada virtual en AWS. La unidad básica de aislamiento de red en la nube; casi toda infraestructura no trivial empieza por definir una.
- Terraform state: fichero (
terraform.tfstate) donde Terraform guarda el mapa entre tu código y los recursos reales en el cloud. Si se pierde o corrompe, Terraform pierde el hilo. En entornos de equipo se almacena en un backend remoto (S3, Terraform Cloud, etc.) para que no viva solo en el portátil de alguien. - Idempotencia: propiedad de una operación que produce el mismo resultado sin importar cuántas veces se ejecute. En IaC significa que aplicar el mismo código dos veces sobre la misma infraestructura no crea el doble de recursos: si ya existe lo que describes, la herramienta no hace nada. Cardinal para distinguir IaC real de scripts imperativos glorificados.
terraform import: comando (y desde Terraform/OpenTofu 1.5, también bloque declarativo en HCL) que trae un recurso ya existente en el cloud bajo la gestión de Terraform sin destruirlo ni recrearlo. Pieza clave en migraciones brownfield.
Fuentes y referencias
Todo lo que aparece aquí existe en un repositorio. A diferencia de la infra de tu primer trabajo.
- Infraestructura como código: beneficios y mejores prácticas - Nix United. Guía de beneficios y mejores prácticas de IaC.
- Glosario: Infrastructure as Code - Port.io. Definición rápida del concepto.
- ¿Qué es Infrastructure as Code? - AWS. Explicación oficial de Amazon sobre IaC.
- Infrastructure as Code - Fortinet. Glosario de ciberseguridad.
- Infrastructure as Code - Enterprise Networking Planet. Visión práctica de IaC en empresas.
- IaC Security - CrowdStrike. Seguridad en IaC y riesgos de misconfiguración.
- Pros and Cons of Infrastructure as Code - Red Hat. Ventajas e inconvenientes de IaC.
- Infrastructure as Code Comparison 2026 - Oneuptime. Comparativa actualizada de herramientas de IaC.
- AWS CDK vs Terraform - Towards the Cloud. Cuándo elegir CDK y cuándo Terraform.
- OpenTofu anuncia su fork de Terraform - OpenTofu. Anuncio oficial del fork.
- Terraform Licensing Change - KodeKloud. Análisis del cambio de licencia de HashiCorp.
- El manifiesto de OpenTofu - OpenTofu. El documento fundacional del proyecto.
- Terraform vs OpenTofu - Platform Engineering. Comparativa directa de ambas herramientas.
- Pulumi vs Terraform vs CDK: comparativa detallada - Alpacked. Análisis en profundidad de las tres herramientas principales.
- Pros and Cons of Infrastructure as Code - Waferwire. Riesgos y ventajas de adoptar IaC.
- SnowflakeServer - Martin Fowler. El anti-patrón del servidor irrepetible explicado por quien lo nombró.
- PhoenixServer - Martin Fowler. El patrón del servidor que muere y renace desde cero.
- Why Teams Struggle with Infrastructure as Code - The New Stack. Análisis de los obstáculos reales en la adopción de IaC.
- Terraform Adoption Stages - HashiCorp. Las fases de madurez en la adopción de Terraform en equipos.
- Terraform State Locking - HashiCorp Developer. Documentación oficial sobre bloqueo de estado y backends remotos.
- Terraform import (CLI)
- HashiCorp Developer. Documentación del comando
terraform import. - Terraform import (bloques declarativos, ≥1.5) - HashiCorp Developer. Importación declarativa en HCL desde Terraform 1.5.
- Terraform Cloud Pricing - HashiCorp. Planes y precios de Terraform Cloud.
- Pulumi Pricing - Pulumi. Planes y precios de la plataforma Pulumi.
- AWS CDK (sin coste de herramienta) - AWS. Página oficial del AWS Cloud Development Kit.
