Cerramos el capítulo de testing con una idea más avanzada: el contract testing (pruebas de contrato) entre módulos. Cuando construyes infraestructura componiendo módulos que se conectan entre sí (recuerda el Capítulo 18), necesitas asegurarte de que esas conexiones siguen encajando aunque los módulos evolucionen. El contract testing protege esos «puntos de unión». Es un concepto más sutil, pero entenderlo te hará diseñar mejores módulos.
Recordatorio: los módulos se conectan por sus interfaces
En el Capítulo 18 vimos que los módulos tienen un contrato: unas entradas (variables) y unas salidas (outputs). Y vimos que se componen conectando la salida de un módulo con la entrada de otro (subcapítulo 18.2):
Esa conexión es un contrato entre los dos módulos: el módulo de servidores confía en que el módulo de red le dará un id_subred válido. Mientras ese contrato se respete, todo encaja.
El problema: los contratos se pueden romper
Aquí está el riesgo. Imagina que alguien modifica el módulo de red y, sin darse cuenta del impacto, cambia el nombre o el formato de su salida id_subred (por ejemplo, lo renombra a subnet_id, o cambia lo que devuelve). El módulo de red, por sí solo, sigue «funcionando»... pero el módulo de servidores que dependía de esa salida se rompe, porque ya no encuentra lo que esperaba.
Antes: módulo red → output "id_subred" → módulo servidores ✓ encaja
Cambio: módulo red → output "subnet_id" → módulo servidores ✗ ¡roto!
(el contrato cambió sin avisar)Este tipo de fallo es traicionero: el módulo modificado parece correcto en aislamiento, pero ha roto a otros módulos que dependían de él. Y en una organización grande, puede haber muchos módulos dependiendo de uno solo (recuerda los módulos compartidos del subcapítulo 18.4).
Qué es el contract testing
El contract testing (prueba de contrato) verifica que la interfaz entre dos módulos —el «contrato» de entradas y salidas— se mantiene estable y compatible. En lugar de probar toda la infraestructura, se centra en los puntos de conexión: comprueba que un módulo sigue ofreciendo las salidas que otros esperan, con el nombre y el formato correctos.
Contract test: "¿el módulo 'red' sigue ofreciendo un output 'id_subred'
con el formato que el módulo 'servidores' espera?"
→ SÍ → el contrato se respeta ✓
→ NO → el contrato se rompió, hay que avisar antes de fusionar ✗Analogía: un contrato entre módulos es como el enchufe y la clavija. El enchufe (la salida de un módulo) tiene una forma estándar, y la clavija (la entrada de otro) encaja en ella. El contract testing comprueba que nadie ha cambiado la forma del enchufe: si alguien lo modifica, los aparatos que dependían de él ya no encajarían. Verificas el «enchufe», no todo el aparato.
Cómo se hace en la práctica
El contract testing entre módulos no es una herramienta única con un botón mágico; es más bien un enfoque que combina varias prácticas que ya conoces:
- Tests centrados en las interfaces
Escribes pruebas (por ejemplo, con Terratest del subcapítulo 21.3) que verifican específicamente que los outputs de un módulo existen y tienen el formato esperado. No pruebas toda la infraestructura, solo el «contrato».
- Versionado estricto de módulos
Aquí brilla el versionado del subcapítulo 18.4. Si cambias la interfaz de un módulo (sus entradas o salidas) de forma incompatible, eso es un cambio mayor (sube la versión MAYOR, ej. de v1.x a v2.0). Así, los módulos que dependían de él no se actualizan automáticamente y siguen usando la versión compatible hasta que se adapten conscientemente.
Cambio compatible (añadir un output nuevo) → versión MENOR (v1.2 → v1.3) Cambio incompatible (quitar/renombrar output) → versión MAYOR (v1.x → v2.0)
- Tests de integración entre módulos en CI
En el CI (subcapítulo 21.1), cuando alguien cambia un módulo compartido, se pueden ejecutar tests que combinan ese módulo con los que lo usan, para confirmar que siguen encajando antes de fusionar el cambio.
Por qué importa, especialmente a gran escala
En un proyecto pequeño con pocos módulos, los contratos se rompen poco y es fácil detectarlo. Pero en una organización grande (que veremos en la Parte VII, con plataformas internas y módulos compartidos por muchos equipos), un solo módulo base puede ser usado por decenas de proyectos. Romper su contrato sin avisar causaría fallos en cascada por toda la empresa.
Ejemplo del mundo real: el equipo de plataforma mantiene un módulo
red-corporativaque usan 30 equipos. Una desarrolladora quiere mejorarlo y, de paso, renombrar una salida para que sea «más clara». Sin contract testing, ese cambio rompería los 30 proyectos. Con contract testing y versionado estricto, el CI detecta que está cambiando la interfaz de forma incompatible y le obliga a publicarlo como versión mayor (v2.0). Los 30 equipos siguen env1.xtranquilos, y migran av2.0cuando puedan, adaptando su código. El cambio mejora el módulo sin romper a nadie.
La idea de fondo: cuidar las interfaces
El mensaje clave de este subcapítulo, más allá de las herramientas, es una mentalidad: cuando diseñas módulos reutilizables, sus interfaces (entradas y salidas) son un contrato sagrado. Otros confían en ellas. Cambiarlas a la ligera rompe a quienes dependen de ti. El contract testing y el versionado son las herramientas que protegen esos contratos, permitiendo que los módulos evolucionen sin causar caos.
Lo que debes recordar
- Los módulos se conectan por sus interfaces (salidas de uno → entradas de otro); esa conexión es un contrato en el que unos módulos confían.
- Si alguien cambia la interfaz de un módulo (renombra o altera una salida), puede romper otros módulos que dependían de ella, aunque el módulo modificado «funcione» en aislamiento. Es un fallo traicionero, sobre todo a gran escala.
- El contract testing verifica que la interfaz entre módulos se mantiene estable y compatible, centrándose en los puntos de conexión (como comprobar que «el enchufe no ha cambiado de forma»).
- Se logra combinando: tests centrados en las interfaces (Terratest), versionado estricto (un cambio incompatible es versión MAYOR, subcap. 18.4) y tests de integración entre módulos en CI.
- Importa especialmente a gran escala, donde un módulo base lo usan muchos equipos. La mentalidad clave: las interfaces de tus módulos son un contrato que debes cuidar.
¡Has terminado el Capítulo 21! Ya sabes asegurar la calidad y seguridad de tu infraestructura en todos los niveles. En el Capítulo 22 uniremos todo esto en un flujo automático completo: Terraform en CI/CD, desde el lint hasta el despliegue automatizado.
Cloud, AWS & Terraform — De cero a experto
Capítulo 1 · Qué es el cloud computing
- 1.1 El modelo cliente-servidor tradicional
- 1.2 Problemas que venía a resolver la nube
- 1.3 On-premise vs cloud vs híbrido
- 1.4 Los tres modelos de servicio: IaaS, PaaS, SaaS
- 1.5 Los cinco pilares del cloud (según NIST)
- 1.6 Ventajas reales: elasticidad, pago por uso, disponibilidad global
Capítulo 2 · El mercado cloud y los grandes proveedores
- 2.1 AWS, Azure y GCP: diferencias y cuotas de mercado
- 2.2 Por qué aprender AWS primero
- 2.3 Conceptos que son universales entre proveedores
Capítulo 3 · Regiones, zonas de disponibilidad y edge
- 3.1 Qué es una región AWS y cómo elegirla
- 3.2 Availability Zones: alta disponibilidad desde el diseño
- 3.3 Edge locations y CloudFront
- 3.4 Latencia, resiliencia y soberanía de datos
Capítulo 4 · Cómputo: EC2
- 4.1 Instancias: tipos, familias y cuándo elegir cada una
- 4.2 AMIs, key pairs y Security Groups
- 4.3 Ciclo de vida de una instancia
- 4.4 Elastic IPs y Placement Groups
- 4.5 Savings Plans vs Reserved vs On-Demand vs Spot
Capítulo 5 · Almacenamiento: S3
- 5.1 Buckets, objetos y claves
- 5.2 Clases de almacenamiento (Standard, IA, Glacier…)
- 5.3 Versionado y ciclo de vida de objetos
- 5.4 Políticas de bucket y ACLs
- 5.5 Hosting de sitios web estáticos
Capítulo 6 · Redes: VPC
- 6.1 Qué es una VPC y por qué la necesitas
- 6.2 Subredes públicas y privadas
- 6.3 Internet Gateway y NAT Gateway
- 6.4 Route Tables y Network ACLs
- 6.5 VPC Peering y endpoints
Capítulo 7 · Identidad y acceso: IAM
- 7.1 Usuarios, grupos, roles y políticas
- 7.2 El principio de mínimo privilegio
- 7.3 Políticas basadas en identidad vs en recurso
- 7.4 MFA y credenciales temporales (STS)
- 7.5 Buenas prácticas de seguridad IAM
Capítulo 8 · Bases de datos gestionadas
- 8.1 RDS: motores, Multi-AZ y réplicas de lectura
- 8.2 Aurora y sus ventajas sobre RDS vanilla
- 8.3 DynamoDB: modelo clave-valor / documentos
- 8.4 ElastiCache para caché en memoria
- 8.5 Cuándo usar cada tipo de base de datos
Capítulo 9 · Por qué Infraestructura como Código
- 9.1 Problemas del aprovisionamiento manual
- 9.2 IaC declarativo vs imperativo
- 9.3 Terraform vs CloudFormation vs Pulumi vs CDK
- 9.4 El ciclo plan → apply → destroy
Capítulo 10 · HCL: el lenguaje de Terraform
- 10.1 Bloques resource, variable, output, locals
- 10.2 Tipos de datos: string, number, bool, list, map, object
- 10.3 Expresiones, referencias y funciones built-in
- 10.4 Condicionales y bucles (count, for_each, for)
Capítulo 11 · Providers y estado
- 11.1 Cómo funciona el provider de AWS
- 11.2 El fichero terraform.tfstate y su importancia
- 11.3 State local vs state remoto (S3 + DynamoDB)
- 11.4 Comandos esenciales: init, plan, apply, destroy, fmt, validate
Capítulo 12 · Tu primera infraestructura real en Terraform
- 12.1 Crear una VPC con subredes desde cero
- 12.2 Levantar una instancia EC2 pública
- 12.3 Asociar un Security Group y una Elastic IP
- 12.4 Outputs y referencias entre recursos
- 12.5 Flujo de trabajo en equipo: PR review de planes
Capítulo 13 · Balanceo de carga y autoescalado
- 13.1 Application Load Balancer vs Network Load Balancer
- 13.2 Target Groups, listeners y reglas
- 13.3 Auto Scaling Groups: políticas y métricas
- 13.4 Warm pools y lifecycle hooks
Capítulo 14 · Serverless con Lambda
- 14.1 El modelo de ejecución de Lambda
- 14.2 Triggers: API Gateway, S3, DynamoDB Streams, SQS
- 14.3 Gestión de dependencias y capas (Layers)
- 14.4 Cold starts y estrategias para reducirlos
- 14.5 Límites y antipatrones
Capítulo 15 · Mensajería y eventos
- 15.1 SQS: colas estándar vs FIFO, DLQ
- 15.2 SNS: topics, suscripciones, fan-out
- 15.3 EventBridge: event buses y reglas
- 15.4 Patrones: pub/sub, desacoplamiento, saga
Capítulo 16 · Entrega de contenido y DNS
- 16.1 Route 53: tipos de registros y routing policies
- 16.2 CloudFront: distribuciones, cachés y origins
- 16.3 ACM: certificados SSL/TLS gratuitos
- 16.4 WAF integrado con CloudFront
Capítulo 17 · Contenedores en AWS
- 17.1 Docker: repaso exprés de conceptos clave
- 17.2 ECR: registro privado de imágenes
- 17.3 ECS: task definitions, services, Fargate vs EC2
- 17.4 EKS: cuándo Kubernetes y cuándo no
Capítulo 18 · Módulos: reutilización y composición
- 18.1 Anatomía de un módulo Terraform
- 18.2 Variables de entrada, outputs y dependencias
- 18.3 Módulos locales vs módulos del Terraform Registry
- 18.4 Versionado de módulos con Git tags
- 18.5 Diseño de módulos genéricos vs específicos de dominio
Capítulo 19 · Workspaces y gestión de entornos
- 19.1 Workspaces de Terraform: casos de uso y limitaciones
- 19.2 Estrategia de directorios por entorno (dev/stg/prod)
- 19.3 Terragrunt: DRY para configuraciones de entorno
- 19.4 Variables de entorno y archivos .tfvars
Capítulo 20 · Backends remotos y locking
- 20.1 Configurar S3 + DynamoDB como backend
- 20.2 State locking: evitar corrupción en equipo
- 20.3 Migración de estado entre backends
- 20.4 terraform import: traer recursos existentes al estado
Capítulo 21 · Testing de infraestructura
- 21.1 Terraform validate y fmt en CI
- 21.2 Checkov y tfsec: análisis de seguridad estático
- 21.3 Terratest: tests de integración en Go
- 21.4 Contract testing entre módulos
Capítulo 22 · Terraform en CI/CD
- 22.1 Pipeline básico: lint → plan → apply en GitHub Actions
- 22.2 Atlantis: GitOps para Terraform
- 22.3 Terraform Cloud / HCP Terraform
- 22.4 Drift detection y reconciliación automática
Capítulo 23 · Seguridad en profundidad
- 23.1 AWS Organizations y Service Control Policies
- 23.2 AWS Config: compliance continuo
- 23.3 GuardDuty: detección de amenazas
- 23.4 Security Hub: visión centralizada
- 23.5 KMS: gestión de claves y rotación
- 23.6 Secrets Manager vs Parameter Store
Capítulo 24 · Observabilidad: logs, métricas y trazas
- 24.1 CloudWatch Logs, métricas y alarmas
- 24.2 CloudWatch Dashboards y Contributor Insights
- 24.3 X-Ray: trazado distribuido
- 24.4 OpenTelemetry en AWS
- 24.5 Managed Grafana y Managed Prometheus
Capítulo 25 · Optimización de costes
- 25.1 AWS Cost Explorer y presupuestos con alertas
- 25.2 Trusted Advisor y Compute Optimizer
- 25.3 Rightsizing: cómo detectar sobredimensionamiento
- 25.4 Savings Plans vs Reserved Instances: decisión estratégica
- 25.5 FinOps: cultura y procesos para controlar el gasto
Capítulo 26 · Alta disponibilidad y disaster recovery
- 26.1 RTO y RPO: definir los objetivos
- 26.2 Estrategias: backup/restore, pilot light, warm standby, multi-site
- 26.3 Route 53 health checks y failover automático
- 26.4 AWS Backup: política centralizada de copias
Capítulo 27 · Well-Architected Framework de AWS
- 27.1 Los seis pilares: excelencia operacional, seguridad, fiabilidad, eficiencia de rendimiento, optimización de costes, sostenibilidad
- 27.2 Well-Architected Tool: revisiones formales
- 27.3 Cómo aplicar el framework en decisiones de diseño
Capítulo 28 · Arquitecturas serverless a escala
- 28.1 Event-driven architecture con Lambda + EventBridge
- 28.2 Saga pattern para transacciones distribuidas
- 28.3 Step Functions: orquestación de workflows complejos
- 28.4 Lambda@Edge y CloudFront Functions
Capítulo 29 · Plataformas de datos en AWS
- 29.1 Data Lake con S3, Glue y Athena
- 29.2 Kinesis Data Streams y Firehose para streaming
- 29.3 Redshift: data warehousing a escala
- 29.4 Lake Formation: gobierno del dato
Capítulo 30 · Multi-cuenta y landing zones
- 30.1 Por qué separar workloads en cuentas distintas
- 30.2 AWS Control Tower y Account Factory
- 30.3 Gestión centralizada de logs y seguridad
- 30.4 Terraform a escala multi-cuenta con módulos compartidos
Capítulo 31 · Platform Engineering e Internal Developer Platform
- 31.1 Golden paths y abstracciones sobre Terraform
- 31.2 Service Catalog de AWS
- 31.3 Backstage como portal de desarrolladores
- 31.4 Módulos Terraform como producto interno
Capítulo 32 · Certificaciones AWS relevantes
- 32.1 Cloud Practitioner: ¿vale la pena?
- 32.2 Solutions Architect Associate → Professional
- 32.3 DevOps Engineer Professional
- 32.4 Specialty: Security, Database, Networking
- 32.5 HashiCorp Terraform Associate
Capítulo 33 · Proyectos para consolidar lo aprendido
- 33.1 Proyecto 1: blog serverless (S3 + CloudFront + Lambda + DynamoDB)
- 33.2 Proyecto 2: API REST con ECS Fargate + RDS + ALB
- 33.3 Proyecto 3: plataforma de datos con Glue + Athena + Redshift
- 33.4 Proyecto 4: landing zone multi-cuenta con Terraform y Control Tower
