Read in English · Lire en français · Auf Deutsch lesen
Sección 10.4 de 10.8 · Avanzado · 24 min de lectura
Infraestructura como código e infraestructura inmutable
Videolección
5 min · narrado en inglés, con subtítulosSolo escuchar (audio)
Leer la transcripción
Hacer clic en una consola de la nube no se revisa, no queda registrado y no puede repetirse. En esta lección verás cómo la infraestructura se convierte en código: declarada, planificada, revisada, aplicada y mantenida a raya.
Imagina que tienes que amueblar un hotel con doscientas habitaciones idénticas. Podrías decirle a cada decorador qué hacer y esperar que lo recuerde. O podrías escribir una especificación precisa de una habitación, guardarla en una carpeta y exigir que cada cambio se apruebe por escrito. Así, cualquier habitación puede comprobarse frente a ella, una habitación dañada puede reconstruirse exactamente igual y una nueva ala puede amueblarse en días. La infraestructura como código es esa especificación para las computadoras, las redes y las bases de datos sobre las que se ejecuta un sistema.
La infraestructura como código, o IaC, consiste en definir redes, máquinas, bases de datos y permisos en archivos guardados en control de versiones. Un script imperativo enumera los pasos: crear una red, luego una subred y luego una base de datos. Si lo ejecutas dos veces, intenta crearlo todo dos veces. Una herramienta declarativa, en cambio, describe el estado final y deduce los pasos comparando esa descripción con lo que existe. Así que aplicarla dos veces no cambia nada la segunda vez. Esa propiedad, la idempotencia, es lo que hace que el código de infraestructura pueda ejecutarse de forma segura una y otra vez, de forma automatizada. Terraform se convirtió en la herramienta multinube más usada. En 2023, HashiCorp la pasó de una licencia de código abierto a la Business Source License, y la comunidad la bifurcó como OpenTofu. La lección: la licencia y la gobernanza de una herramienta forman parte de su riesgo.
Así funciona una herramienta como Terraform u OpenTofu. El código, guardado en Git, dice qué debería existir. El archivo de estado asocia cada recurso del código con el objeto real que creó la herramienta. Debe ser remoto, estar bloqueado durante los cambios, versionado y tratarse como un secreto, porque a menudo contiene contraseñas en texto plano. El plan compara el código, el estado y la infraestructura real, leída de la API del proveedor. Muestra qué cambiaría antes de que ocurra nada, y los revisores lo leen en el pull request. Solo se aplica después de la revisión. La aplicación modifica la infraestructura real y registra el resultado en el estado. Pero si alguien cambia algo a mano en la consola, la infraestructura real deja de coincidir con el código. Eso es la deriva, y el siguiente plan intentará deshacerla.
Veamos la deriva en la práctica. Durante un incidente un viernes por la noche, un ingeniero abre el firewall de la base de datos de pedidos de producción a la dirección IP de un contratista, a través de la consola. Nadie actualiza el código. El sábado, el trabajo nocturno de detección de deriva ejecuta un plan para cada estado de producción. Informa de un cambio, en ese firewall, y lo publica para el equipo de plataforma. El plan muestra la dirección de más, y el registro de auditoría de la nube muestra quién la añadió, cuándo y en qué incidente. El acceso era temporal y el incidente ha terminado, así que el código tiene razón y la realidad está equivocada. Aplicar el plan elimina la regla. Si el cambio hubiera sido necesario de forma definitiva, habría entrado en el código mediante un pull request revisado. Después, el acceso de escritura a la consola en producción pasa a ser un rol de emergencia que exige un motivo y genera una alerta. La regla práctica: cualquier diferencia se codifica o se revierte antes del siguiente día laborable.
Los módulos reutilizables ocultan los detalles del proveedor detrás de una interfaz pequeña, como el nombre, el tamaño y la alta disponibilidad. Staging y producción usan los mismos módulos versionados con entradas diferentes, nunca código copiado, que diverge en cuestión de meses. La infraestructura inmutable significa no modificar nunca un servidor en ejecución. Cada cambio, incluso un parche del sistema operativo, es una imagen nueva que sustituye a las instancias antiguas. No hay deriva, y el rollback consiste en volver a desplegar la imagen anterior. Y la política como código convierte reglas, como no tener buckets de almacenamiento públicos y cifrar las bases de datos, en comprobaciones automáticas sobre cada plan, explicadas en el pull request.
GitOps aplica el bucle de reconciliación de la Sección diez punto dos a entornos completos. Un desarrollador hace push del código, y el pipeline lo prueba, compila una imagen y hace push de ella a un registro. Después, el pipeline hace commit del nuevo digest de la imagen en un repositorio de configuración, que contiene el estado deseado. Los cambios en él se revisan como cualquier código. Dentro del clúster, un agente como Argo CD o Flux obtiene ese repositorio, lo aplica y sigue corrigiendo la deriva. Una edición manual dura solo hasta la siguiente sincronización. Como es el agente quien obtiene los cambios, el pipeline no necesita credenciales de producción. Git se convierte en el registro de auditoría, y hacer rollback es un revert revisado.
La sección completa compara las herramientas, muestra cómo probar el código de infraestructura y termina con una lista de comprobación para producción. A continuación, en la Sección diez punto cinco, seguiremos un cambio desde el commit hasta producción. Nos vemos allí.
Lo que necesitas saber
- La infraestructura como código define la infraestructura en archivos con control de versiones que aplican herramientas, lo que hace que los entornos sean reproducibles, revisables, auditables y rápidos de crear.
- Las herramientas declarativas describen el estado final deseado y calculan los pasos, lo que hace idempotentes las ejecuciones repetidas; los scripts imperativos enumeran pasos y son difíciles de volver a ejecutar con seguridad.
- HashiCorp pasó Terraform a la Business Source License en agosto de 2023; le siguió la bifurcación OpenTofu bajo la Linux Foundation (estable en enero de 2024 y proyecto sandbox de la CNCF desde 2025); CloudFormation, Bicep, Pulumi y Crossplane son las principales alternativas.
- El estado asocia el código con los recursos reales; debe ser remoto, estar bloqueado, versionado, con acceso controlado y dividido para limitar el radio de impacto (blast radius), y la deriva debe detectarse con planes programados y después codificarse o revertirse.
- Los módulos versionados con interfaces pequeñas, reutilizados en los distintos entornos con entradas diferentes, evitan que los entornos hechos a base de copiar y pegar diverjan.
- La infraestructura inmutable sustituye los servidores y los contenedores a partir de imágenes nuevas en lugar de modificarlos in situ; la gestión de la configuración sigue siendo útil para los parques de sistemas de larga duración y para construir imágenes.
- GitOps guarda el estado deseado en Git y deja que unos agentes dentro del clúster (Argo CD, Flux) lo obtengan y lo reconcilien continuamente; la política como código y las pruebas por capas hacen seguros los cambios.
Qué es la infraestructura como código
La infraestructura como código (IaC) consiste en definir las redes, las máquinas virtuales, los clústeres, las bases de datos, las colas, los registros DNS, los permisos y cualquier otra pieza de infraestructura en archivos de texto guardados en control de versiones, y dejar que las herramientas creen y modifiquen los recursos reales a partir de esos archivos. En lugar de que un ingeniero vaya haciendo clic en una consola de la nube, un cambio es un commit: revisado en un pull request, probado en un pipeline, aplicado automáticamente y registrado para siempre.
La idea es anterior a la nube pública. CFEngine (1993), de Mark Burgess, gestionaba máquinas Unix a partir de políticas declarativas; Puppet (2005), Chef (2009) y Ansible (2012) generalizaron la gestión de la configuración. La nube la hizo imprescindible, porque la propia infraestructura pasó a estar disponible mediante API: AWS CloudFormation (2011) y Terraform (2014), de HashiCorp, describen entornos completos, no solo el software de los servidores. El libro de Kief Morris Infrastructure as Code, ya en su tercera edición (2025), es la referencia estándar sobre la práctica y sus principios.
Los beneficios son los de la ingeniería de software aplicada a la infraestructura. Los entornos se vuelven reproducibles: staging puede construirse a partir de las mismas definiciones que producción, y una región puede reconstruirse tras un desastre a partir del código y no de la memoria. Los cambios se vuelven revisables y auditables, algo que valoran los reguladores y los equipos de seguridad. El conocimiento deja de vivir en la cabeza de un solo ingeniero. Y la velocidad aumenta, porque crear un entorno para un nuevo servicio de reparto de comida pasa a ser un pull request en lugar de una solicitud que espera dos semanas.
Declarativo frente a imperativo
Un enfoque imperativo enumera los pasos: crear una red, luego una subred, luego una base de datos y después abrir este puerto. Ejecutar el script dos veces intenta crearlo todo dos veces. Un enfoque declarativo describe el estado final, el estado deseado de la Sección 10.2: una red con estas subredes, una base de datos de este tamaño, un firewall que permite este puerto. La herramienta compara la descripción con lo que existe y deduce los pasos, de modo que aplicarla dos veces no cambia nada la segunda vez. Esa propiedad, la idempotencia, es lo que hace que el código de infraestructura pueda ejecutarse de forma segura una y otra vez, y de forma automatizada.
La mayoría de las herramientas maduras son declarativas en su núcleo, pero difieren en el lenguaje con el que se escribe la declaración y en quién lleva la cuenta de lo que existe. La tabla resume las principales familias.
Enfoques del código de infraestructura
| Enfoque | Lo que escribes | Ejemplos | Ventajas | Puntos débiles |
|---|---|---|---|---|
| Scripts imperativos | Secuencias de llamadas a la CLI o al SDK | Scripts de shell que llaman a las CLI de la nube, programas con el SDK | Conocidos, flexibles, rápidos para tareas puntuales | No son idempotentes sin muchísimo cuidado; no hay registro de lo que existe; difíciles de cambiar con seguridad |
| Declarativo, lenguaje específico de dominio | Los recursos y sus relaciones en un lenguaje de configuración | Terraform y OpenTofu (HCL), AWS CloudFormation (YAML o JSON), Azure Bicep, manifiestos de Kubernetes | Planes legibles y revisables; idempotente; grandes ecosistemas de proveedores | Los bucles, las condiciones y la abstracción pueden resultar incómodos; hay que aprender un lenguaje |
| Modelo declarativo, lenguaje de propósito general | Código en TypeScript, Python, Go, C# o Java que construye un modelo declarativo | Pulumi, AWS Cloud Development Kit (CDK) | Abstracciones reales, herramientas de prueba y editores; conocido por los desarrolladores | Es fácil escribir infraestructura ingeniosa y difícil de revisar; el plan se ve menos en el código |
| Reconciliación continua | Recursos al estilo de Kubernetes que describen la infraestructura en la nube | Crossplane, controladores de Kubernetes de los proveedores de nube | El mismo bucle de reconciliación y las mismas herramientas que las aplicaciones; la deriva se corrige continuamente | Necesita un plano de control de Kubernetes; la depuración abarca dos sistemas |
| Gestión de la configuración | La configuración deseada del software en servidores existentes | Ansible, Chef, Puppet | Gestiona máquinas de larga duración, dispositivos de red y parques de sistemas locales (on-premises) | Los servidores acumulan historia y deriva; más lento y menos predecible que sustituirlos |
Las herramientas y la bifurcación OpenTofu
Terraform se convirtió en la herramienta multinube más usada porque un solo lenguaje y un solo flujo de trabajo cubren miles de proveedores: AWS, Azure, Google Cloud, Cloudflare, Kubernetes, GitHub, servicios de monitorización y muchos más. El 10 de agosto de 2023, HashiCorp pasó Terraform de la licencia de código abierto Mozilla Public License 2.0 a la Business Source License 1.1, que permite el uso interno y comercial pero prohíbe ofrecerlo en productos que compitan con los de HashiCorp. La versión 1.5.7 fue la última lanzada con la licencia anterior.
La respuesta de la comunidad fue una bifurcación. A los pocos días apareció un manifiesto que pedía volver al código abierto; en septiembre de 2023, la Linux Foundation aceptó la bifurcación con el nombre de OpenTofu; su primera versión estable, la 1.6.0, llegó en enero de 2024; y en 2025 fue aceptada en la CNCF como proyecto sandbox. IBM completó la adquisición de HashiCorp en febrero de 2025. Las dos herramientas siguen siendo en gran medida compatibles en lenguaje y proveedores, pero sus funcionalidades divergen: OpenTofu añadió, por ejemplo, el cifrado del estado en el lado del cliente, mientras que la plataforma comercial de Terraform añadió capacidades propias. Para un arquitecto, el episodio recuerda que la licencia y la gobernanza de una herramienta forman parte de su perfil de riesgo, y que los estándares abiertos y una alternativa creíble mantienen ese riesgo bajo control.
Entre las herramientas para una sola nube, AWS CloudFormation (2011) y Bicep de Microsoft (presentado en 2020, que se compila a plantillas de Azure Resource Manager) los ejecuta el propio proveedor, que lleva la cuenta de lo que existe, así que no hay ningún archivo de estado que gestionar, a cambio de quedar atado a una sola nube. Pulumi (2018) y AWS CDK permiten a los desarrolladores escribir la infraestructura en lenguajes de propósito general; Crossplane amplía Kubernetes para gestionar recursos en la nube mediante reconciliación. La elección correcta depende de qué nubes uses, de las habilidades de tu equipo, de la madurez de los proveedores que necesites, de la política de licencias y de lo que ya utilice el resto de la organización; la coherencia entre equipos suele valer más que los méritos marginales de cualquier herramienta concreta.
terraform {
required_version = ">= 1.6"
backend "gcs" { # remote state; this backend locks natively
bucket = "fd-infra-state"
prefix = "orders/prod"
}
}
variable "environment" { type = string }
module "orders_db" {
source = "git::https://git.example.com/modules/postgres.git?ref=v3.2.0"
name = "orders-${var.environment}"
size = var.environment == "prod" ? "large" : "small"
high_avail = var.environment == "prod" # standby in a second zone
backup_days = 14
}
output "orders_db_host" {
value = module.orders_db.host
}Ejecutar tofu plan (o terraform plan) muestra qué cambiaría antes de que ocurra nada. El plan es el artefacto más importante del flujo de trabajo: los revisores lo leen en el pull request, junto al código, y es lo que se aplica.
# module.orders_db.google_sql_database_instance.this will be updated in-place
~ resource "google_sql_database_instance" "this" {
~ settings {
~ tier = "db-custom-2-8192" -> "db-custom-4-16384"
}
}
Plan: 0 to add, 1 to change, 0 to destroy.Estado, bloqueo y deriva
Las herramientas declarativas necesitan saber qué recursos reales corresponden a qué definiciones. Terraform y OpenTofu guardan esto en el estado: un archivo que asocia cada recurso del código con el identificador del objeto real, junto con sus últimos atributos conocidos. Planificar compara tres cosas: el código (lo que debería existir), el estado (lo que creó la herramienta) y la infraestructura real, leída de la API del proveedor (lo que existe de verdad).
Plan, aplicación, estado y deriva
El estado requiere cuidado porque es crítico y sensible. Debe guardarse en remoto (en almacenamiento de objetos o en un servicio gestionado), no en una computadora portátil, para que todo el equipo y el pipeline compartan una única versión. Debe estar bloqueado durante los cambios, para que dos aplicaciones no se intercalen y lo corrompan. Debe tener copias de seguridad y versiones, porque un archivo de estado perdido deja a la herramienta sin saber qué recursos creó. Y es un secreto: el estado contiene a menudo contraseñas de bases de datos y claves en texto plano, así que el acceso a él debe restringirse y debe cifrarse en reposo (OpenTofu también puede cifrarlo en el lado del cliente).
La deriva es cualquier diferencia entre el código y la realidad, normalmente por cambios manuales hechos con prisas, por otra herramienta que modifica el mismo recurso o por un fallo parcial durante la aplicación. La deriva es peligrosa porque la siguiente aplicación puede revertir en silencio un cambio del que alguien dependía, o fallar en producción por una diferencia cuya existencia nadie conocía. Los equipos la detectan ejecutando un plan de forma programada (por ejemplo, cada noche) y alertando ante cualquier cambio propuesto, y la previenen restringiendo el acceso de escritura a la consola a un procedimiento de emergencia (break-glass) registrado.
El estado también define el radio de impacto. Un único estado gigante para toda una empresa significa que cada plan es lento, cada aplicación lo arriesga todo y un solo bloqueo frena a todos los equipos. Dividir el estado por componente y entorno (la red, el clúster compartido, los recursos de cada servicio; producción separada de staging) mantiene los planes rápidos y los fallos contenidos, a cambio de tener que pasar salidas, como los identificadores de red, entre estados. La refactorización está soportada: los bloques moved renombran recursos sin destruirlos, e import pone bajo gestión los recursos existentes creados a mano.
Ejemplo práctico
Ejemplo práctico: una regla de firewall con deriva
Durante un incidente un viernes por la noche, un ingeniero abre a través de la consola de la nube el firewall de la base de datos de pedidos de producción a la dirección IP de un contratista, para que este ayude a diagnosticar una consulta lenta. Nadie actualiza el código.
| Detección | El trabajo nocturno de detección de deriva ejecuta tofu plan para cada estado de producción. El sábado informa de 1 to change para el firewall de la base de datos de pedidos y publica el plan en el canal del equipo de plataforma. |
|---|---|
| Diagnóstico | El plan muestra una dirección de origen permitida de más. El registro de auditoría de la nube identifica quién la añadió, cuándo y en qué incidente. |
| Decisión | El acceso era temporal y el incidente está cerrado, así que el código tiene razón y la realidad está equivocada. Aplicar el plan elimina la regla. Si el cambio hubiera sido necesario de forma permanente, la solución habría sido añadirlo al código mediante un pull request revisado. |
| Prevención | El acceso de escritura a la consola en producción se sustituye por un rol de emergencia (break-glass) que exige un motivo y genera una alerta al usarse. Una regla de política (ver más abajo) rechaza cualquier regla de firewall de base de datos abierta a todo internet. |
| Lo que muestra | La deriva no es solo un problema de orden: un agujero no documentado en un firewall es una exposición de seguridad y, sin detección, la siguiente aplicación no relacionada lo habría eliminado sin que nadie supiera por qué el contratista perdió el acceso. |
La regla práctica: la realidad puede diferir del código durante minutos en una emergencia, pero la diferencia debe codificarse o revertirse antes del siguiente día laborable.
Módulos y entornos
Un módulo es una unidad reutilizable de código de infraestructura con entradas y salidas: una base de datos PostgreSQL con copias de seguridad y monitorización, la red y el balanceador de carga de un servicio, un namespace estándar de Kubernetes con sus cuotas y políticas. Un buen módulo aplica la ocultación de información del Capítulo 3: una interfaz pequeña (nombre, tamaño, alta disponibilidad o no) delante de los muchos detalles específicos del proveedor que un equipo de servicio no debería tener que conocer. Los módulos se versionan y se lanzan como bibliotecas, y los entornos hacen referencia a una versión concreta, como hace el ref=v3.2.0 del ejemplo, para que un cambio en un módulo llegue a producción solo cuando alguien lo actualice deliberadamente.
Los entornos deben construirse a partir de los mismos módulos con entradas diferentes, no a partir de código copiado. Una organización habitual es un directorio (o repositorio) por entorno y componente, cada uno con su propio estado, que llama a módulos compartidos y versionados; un cambio se promueve actualizando la versión o las entradas del módulo en staging y después en producción. Los entornos hechos a base de copiar y pegar divergen en cuestión de meses, hasta que staging deja de predecir lo que pasará en producción. Los workspaces, que dan a una configuración varios estados, encajan mejor con copias de corta duración, como los entornos de prueba por rama, que con producción y staging, que duran mucho.
Cuidado con el exceso de abstracción. Un módulo con cuarenta entradas booleanas que intenta servir a todos los equipos es tan difícil de cambiar como el código al que sustituyó. Es preferible tener unos pocos módulos con criterio propio que plasmen los estándares de la organización, que es exactamente lo que un equipo de plataforma ofrece como camino dorado en la Sección 10.7.
Infraestructura inmutable frente a gestión de la configuración
Las herramientas de gestión de la configuración mantienen servidores de larga duración en un estado descrito: Ansible se conecta por SSH y aplica los cambios sin agente; Chef y Puppet ejecutan agentes que obtienen su configuración y convergen hacia ella periódicamente. Funcionan, pero cada servidor acumula historia: paquetes instalados durante un incidente, archivos editados a mano, actualizaciones aplicadas a medias. Martin Fowler llamó al resultado servidor copo de nieve (snowflake server), único e imposible de reproducir, y propuso como remedio el servidor fénix (phoenix server), que se quema y se reconstruye desde cero con regularidad.
La infraestructura inmutable, un término popularizado por Chad Fowler en 2013, lleva el remedio hasta sus últimas consecuencias: no modificar nunca un servidor en ejecución. Cada cambio, ya sea un lanzamiento de la aplicación o un parche del sistema operativo, se hace construyendo una imagen nueva (una imagen de contenedor, o una imagen de máquina con una herramienta como Packer), probándola y sustituyendo las instancias antiguas, normalmente mediante un despliegue gradual o azul-verde. Los contenedores en Kubernetes son inmutables por defecto. Los beneficios son la ausencia de deriva, instancias idénticas, entornos trivialmente repetibles y el rollback mediante el redespliegue de la imagen anterior; los costos son un pipeline de imágenes, la necesidad de procesos desechables y sin estado (Sección 10.3) y una respuesta más lenta para un único cambio urgente.
La gestión de la configuración no ha desaparecido. Sigue siendo la herramienta adecuada para los parques de sistemas que no pueden sustituirse en bloque: servidores locales (on-premises), equipos de red, bases de datos en hardware dedicado y las propias imágenes base, que a menudo se construyen ejecutando Ansible dentro de la compilación de la imagen. La regla arquitectónica es llevar la mutabilidad lo más abajo y lo antes posible: configurar al construir las imágenes y después tratar lo que se ejecuta como de solo lectura.
GitOps
GitOps aplica el bucle de reconciliación de la Sección 10.2 a entornos completos. El término lo acuñó en 2017 Alexis Richardson, de Weaveworks, la empresa que creó la herramienta Flux. El proyecto OpenGitOps, un grupo de trabajo de la CNCF, define cuatro principios: el estado deseado es declarativo; está versionado y es inmutable, con un historial completo; lo obtienen automáticamente agentes de software; y se reconcilia continuamente, con agentes que observan el estado real y aplican el deseado. Los dos agentes principales, Argo CD y Flux, son proyectos graduados de la CNCF; Flux continuó como proyecto comunitario después de que Weaveworks cerrara en 2024.
Un flujo de entrega con GitOps
El modelo pull tiene una ventaja de seguridad frente a un pipeline que empuja los cambios al clúster: el sistema de CI no necesita credenciales de producción, porque el agente dentro del clúster va a buscar lo que debe ejecutar. Git se convierte en el registro de auditoría y en la interfaz para los cambios, también para las operaciones: escalar un servicio o hacer rollback es un commit revisado o un revert. La deriva se corrige automáticamente, así que un kubectl edit manual dura solo hasta la siguiente sincronización.
GitOps trae sus propias preguntas de diseño. Los secretos no deben estar en Git en texto plano; los equipos los cifran (SOPS, Sealed Secrets) o guardan referencias que External Secrets Operator resuelve a partir de un gestor de secretos. La promoción entre entornos necesita una convención, como un directorio por entorno con pull requests que copian un nuevo digest de imagen de staging a producción. La corrección automática de la deriva debe pausarse deliberadamente durante algunas emergencias, y la estructura del repositorio debe reflejar la propiedad para que los equipos puedan cambiar sus propios servicios sin tocar los de otros. GitOps es lo más natural para Kubernetes, pero los mismos principios se aplican a la infraestructura en la nube mediante Crossplane o mediante pipelines que planifican y aplican el código de infraestructura a partir de los commits fusionados.
Política como código
La política como código expresa las reglas sobre la infraestructura como código comprobable por máquina en lugar de como una página de wiki: los buckets de almacenamiento no deben ser públicos, las bases de datos deben estar cifradas y tener copias de seguridad, todo recurso debe llevar una etiqueta de propietario y de centro de costos, solo pueden usarse regiones aprobadas, los contenedores no deben ejecutarse como root, las imágenes de producción deben venir del registro de la empresa. Las comprobaciones se ejecutan en varios puntos: sobre el plan en el pull request (Open Policy Agent con Conftest, Checkov, HashiCorp Sentinel en sus productos comerciales), en la admisión en un clúster de Kubernetes (OPA Gatekeeper, Kyverno) y de forma continua sobre los recursos en ejecución (los servicios de políticas de los proveedores de nube).
La política como código convierte la gobernanza, que deja de ser una reunión de revisión, en una salvaguarda rápida y coherente que se explica a sí misma en el pull request. Funciona mejor cuando las políticas son pocas, están claramente justificadas, versionadas y probadas como cualquier código, cuando empiezan en modo de advertencia antes de bloquear y cuando existe un proceso de excepciones registrado. El Capítulo 11 trata cómo encajan estas comprobaciones automatizadas en la gobernanza de la arquitectura (gobernanza en organizaciones ágiles).
Probar el código de infraestructura, de lo rápido a lo lento
- Comprobaciones estáticas en cada commitEl formateo,
validate, el linting (por ejemplo, TFLint) y los escáneres de seguridad detectan en segundos errores de sintaxis, argumentos obsoletos y configuraciones erróneas evidentes. - Comprobaciones de políticas sobre el planGenera el plan como JSON y evalúalo frente a las políticas de la organización; los revisores ven las infracciones en el pull request.
- Pruebas de módulos
terraform testytofu testejecutan aserciones sobre un módulo, con proveedores simulados para pruebas rápidas de tipo unitario o con proveedores reales para pruebas de integración. - Pruebas de integración en entornos efímerosAplica el módulo o el entorno a una cuenta desechable, comprueba que funciona (una base de datos acepta conexiones, un servicio responde) y después destrúyelo. Herramientas como Terratest automatizan esto; es lento y cuesta dinero, así que resérvalo para los módulos compartidos.
- Revisión del plan y despliegue por etapasAplica primero en staging y después en producción, a partir de las mismas versiones; una persona lee cada plan de producción, sobre todo las destrucciones y las sustituciones.
- Detección de deriva y simulacros de restauraciónLos planes programados detectan la deriva; reconstruir periódicamente un entorno a partir del código demuestra que la fuente de verdad es el código, no la memoria.
Lista de comprobación: código de infraestructura listo para producción
Úsala al revisar el repositorio de infraestructura de un equipo o un nuevo módulo de la plataforma.
- Todo está en códigoNingún recurso de producción existe solo porque alguien hizo clic; los recursos existentes creados a mano se han importado.
- Estado remoto, bloqueado y cifradoBackend compartido con bloqueo, versionado y acceso restringido; estado dividido por componente y entorno para limitar el radio de impacto.
- Planes revisadosCada cambio es un pull request que muestra el plan; las destrucciones y sustituciones de recursos con estado requieren una aprobación explícita.
- Módulos versionadosLos entornos fijan las versiones de los módulos; staging y producción usan los mismos módulos con entradas diferentes, no copias.
- Políticas aplicadas automáticamenteLas reglas de cifrado, exposición de red, etiquetado y regiones se comprueban en cada plan y en la admisión al clúster.
- Secretos fuera del código y de GitLas credenciales vienen de un gestor de secretos o de la identidad de carga de trabajo; el acceso al estado se trata como acceso a secretos.
- Pruebas en el pipelineComprobaciones estáticas y de políticas en cada cambio; pruebas de módulos para los módulos compartidos; pruebas de integración para los críticos.
- Deriva detectada y gestionadaLos planes programados alertan de las diferencias; el acceso de escritura a la consola es un procedimiento de emergencia (break-glass) registrado.
- Inmutable siempre que sea posibleLos servidores y los contenedores se sustituyen a partir de imágenes en lugar de parchearse in situ; la configuración se hace al construir la imagen.
- Recuperación ensayadaSe ha reconstruido un entorno a partir del código dentro del tiempo de recuperación acordado, incluida la restauración de datos (ver la Sección 10.6).
Comprueba lo que has entendido
¿Por qué es importante la idempotencia en el código de infraestructura?
Porque la automatización vuelve a ejecutar el código a menudo. Una herramienta declarativa e idempotente no cambia nada cuando la realidad ya coincide con el código, así que volver a ejecutarla es seguro; un script no idempotente puede intentar crearlo todo otra vez.
Nombra las tres cosas que compara un plan y qué representa cada una.
El código (lo que debería existir), el estado (lo que la herramienta creó y controla) y la infraestructura real leída de la API del proveedor (lo que existe de verdad).
¿Por qué no debería guardarse el estado como un único archivo para toda una organización?
Un único estado significa planes lentos, un solo bloqueo que frena a todos los equipos y un radio de impacto que lo abarca todo; dividirlo por componente y entorno mantiene los cambios rápidos y los fallos contenidos.
¿Qué ventaja de seguridad tiene el modelo pull de GitOps frente a un pipeline que empuja los cambios al clúster?
El sistema de CI no necesita credenciales de producción, porque un agente dentro del clúster obtiene el estado deseado de Git y lo aplica.
¿Cuándo sigue siendo una buena opción la gestión de la configuración?
Para máquinas de larga duración que no pueden sustituirse sin más, como los servidores locales (on-premises) y los dispositivos de red, y para configurar las imágenes base durante su compilación.
Fuentes y lecturas recomendadas
¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.
Pregunta: “¿Cómo deberíamos dividir el estado de Terraform u OpenTofu de la plataforma de reparto de comida, y cómo evitamos que la gente haga cambios en la consola?”