Logo Google Cloud con Eduardo

Google Cloud con Eduardo

Recibe el código de la lección en tu correo
Te enviaremos el enlace directo al archivo (.zip) y te sumaremos a nuestra newsletter de Google Cloud.

Información básica de protección de datos: Responsable: Eduardo Martínez Agrelo. Finalidad: Facilitar el recurso solicitado y enviar comunicaciones periódicas de valor sobre Google Cloud. Legitimación: Consentimiento del interesado (Art. 6.1.a RGPD). Destinatarios: Plataforma Odoo y proveedores de infraestructura técnica (Google Cloud / Firebase). Derechos: Acceso, rectificación y supresión en eduardomartinezagrelo@gmail.com.
✦ Guía Técnica & Arquitectura

Terraform en Producción: Arquitectura, Módulos, State y FinOps

Terraform es mucho más que una herramienta para crear máquinas virtuales, redes o buckets. En una organización enterprise, el verdadero reto consiste en diseñar una plataforma de Infrastructure as Code capaz de escalar equipos, cuentas, regiones y ciclos de despliegue sin convertir el repositorio de infraestructura en un monolito inmanejable.

Esta guía aborda Terraform desde una perspectiva de Staff Engineer / Architect: separación de responsabilidades, diseño de módulos, gestión del State, seguridad, CI/CD, gobernanza, blast radius, drift y control financiero.

Lo que aprenderás

✓
Diseñar una arquitectura Terraform escalable

Separando composición, módulos reutilizables, entornos y responsabilidades de ownership.

✓
Gestionar State sin crear un punto único de fallo

Aplicando backends remotos, locking, aislamiento y controles de acceso adecuados.

✓
Construir pipelines seguros de Terraform

Separando plan y apply, protegiendo credenciales y utilizando revisiones como control de cambio.

✓
Controlar FinOps, drift y blast radius

Limitando cambios peligrosos y haciendo que el coste forme parte del proceso de arquitectura.

Terraform HCL Terraform Modules Remote State CI/CD Policy as Code Cloud FinOps Git

La decisión arquitectónica: ¿cómo estructurar Terraform?

El error más habitual aparece cuando un equipo comienza con un único directorio que contiene todos los recursos de toda la organización. Al principio resulta sencillo. Con el crecimiento aparecen estados gigantes, dependencias implícitas, tiempos de ejecución elevados y un blast radius difícil de controlar.

La pregunta correcta no es simplemente "¿cómo reutilizo código?", sino: ¿cuál es la unidad adecuada de ownership, despliegue y recuperación?

Patrón Latencia de Plan Aislamiento Complejidad Coste Operativo Uso Recomendado
Monolito Terraform Alta Bajo Baja inicialmente Alto al escalar Prototipos o plataformas pequeñas.
Estado por entorno Media Medio Media Medio Equipos pequeños con pocos dominios.
Estado por dominio Baja/Media Alto Media/Alta Óptimo Organizaciones enterprise.
Stack modular + estados aislados Baja Muy alto Alta Óptimo a escala Plataformas multi-equipo y multi-cuenta.

Terraform State: el componente que no debes tratar como un detalle

Terraform no solamente necesita conocer la configuración declarativa. También necesita mantener una representación del mundo que administra. Ese State se convierte, por tanto, en un activo crítico de la plataforma.

01 / AISLAMIENTO

Separar estados

Un cambio en una aplicación no debería requerir analizar todo el estado de una organización. Divide por dominios con límites de ownership claros.

02 / CONCURRENCIA

Locking

Evita que dos procesos de automatización modifiquen simultáneamente el mismo State. El pipeline debe ser consciente de la concurrencia.

03 / RECUPERACIÓN

Backup y versionado

El State debe contar con mecanismos de recuperación adecuados al nivel de criticidad de la infraestructura que representa.

Antipatrones críticos en producción

⚠ Error: utilizar un único State para toda la plataforma

Cuando todos los equipos dependen del mismo State, una modificación aparentemente inocua puede desencadenar un plan enorme. El problema no es únicamente el tiempo: aumenta el blast radius, dificulta las revisiones y hace más difícil determinar qué equipo es responsable de una modificación.

La solución arquitectónica es dividir la infraestructura según límites funcionales y de ownership: red, identidad, datos, plataforma, workloads y servicios compartidos, por ejemplo.

✕ Error: convertir módulos en abstracciones excesivamente genéricas

Un módulo con decenas de variables, flags booleanos y comportamientos condicionales puede parecer reutilizable, pero suele esconder múltiples arquitecturas bajo una única interfaz.

Una buena regla es diseñar módulos alrededor de una capacidad estable, no alrededor de la necesidad de eliminar líneas de código.

Implementación práctica: Terraform preparado para CI/CD

Una estructura empresarial debe separar los módulos reutilizables de la composición específica de cada entorno. El objetivo es que el módulo encapsule invariantes técnicos, mientras que la capa de composición decida cómo se conectan esas capacidades.

infra/environments/prod/main.tf
terraform {


required_version = ">= 1.6.0"

required_providers {
aws = {
source  = "hashicorp/aws"
version = "~> 5.0"
}
}

# En producción el State debe residir en un backend remoto.

# La configuración concreta depende de la plataforma cloud.

backend "s3" {
bucket         = "company-terraform-state"
key            = "platform/prod/terraform.tfstate"
region         = "eu-west-1"
encrypt        = true
dynamodb_table = "terraform-state-lock"
}
}

provider "aws" {
region = var.aws_region

default_tags {
tags = {
Environment = "prod"
ManagedBy   = "terraform"
Owner       = "platform"
}
}
}

module "network" {
source = "../../modules/network"

environment = "prod"
cidr_block  = var.network_cidr
}

module "application" {
source = "../../modules/application"

environment       = "prod"
vpc_id            = module.network.vpc_id
private_subnets   = module.network.private_subnet_ids
instance_count    = var.instance_count
}

output "vpc_id" {
description = "VPC utilizada por el entorno productivo."
value       = module.network.vpc_id
}
modules/application/variables.tf
variable "environment" {


description = "Entorno donde se despliega la aplicación."
type        = string

validation {
condition     = contains(["dev", "staging", "prod"], var.environment)
error_message = "El entorno debe ser dev, staging o prod."
}
}

variable "vpc_id" {
description = "ID de la VPC donde se desplegará la aplicación."
type        = string
}

variable "private_subnets" {
description = "Subnets privadas disponibles."
type        = list(string)

validation {
condition     = length(var.private_subnets) >= 2
error_message = "La aplicación requiere al menos dos subnets privadas."
}
}

variable "instance_count" {
description = "Número deseado de instancias."
type        = number

validation {
condition     = var.instance_count >= 2 && var.instance_count <= 20
error_message = "instance_count debe estar entre 2 y 20."
}
}

Patrones de diseño para una plataforma Terraform enterprise

1. Modules as Products

Un módulo debe tener una API clara, documentación, versionado, tests y ownership. Trátalo como un producto interno, no como un simple directorio compartido.

2. Immutable Infrastructure

Siempre que sea posible, favorece cambios reproducibles y declarativos frente a modificaciones manuales sobre recursos existentes.

3. Least Privilege

El proceso que ejecuta Terraform debe tener únicamente los permisos necesarios para el dominio que administra. Evita credenciales administrativas globales.

4. Policy as Code

Las reglas de seguridad, naming, regiones permitidas, tags obligatorios y límites financieros deben validarse automáticamente antes del apply.

5. Plan ≠ Apply

Un pipeline enterprise debe separar la generación del plan de su ejecución, incorporando revisión y controles de aprobación donde el riesgo lo requiera.

6. Small Blast Radius

Divide estados y unidades de despliegue para que un fallo de infraestructura tenga un impacto acotado y sea sencillo de revertir.

Terraform y FinOps: el coste debe formar parte del diseño

Infrastructure as Code permite automatizar infraestructura, pero automatizar una mala decisión también automatiza su coste. Por eso Terraform debe integrarse con prácticas FinOps desde la fase de diseño.

✓
Tags obligatorios

Cost Center, Owner, Environment, Application y otros metadatos corporativos.

✓
Limitación de recursos

Evitar que una variable permita accidentalmente configuraciones desproporcionadas.

✓
Cost estimation

Incorporar estimación de impacto económico en el flujo de revisión cuando sea viable.

✓
Drift detection

Detectar modificaciones manuales que puedan romper la trazabilidad declarativa.

Gobernanza: cómo escalar sin convertir Terraform en burocracia

La gobernanza efectiva no consiste en impedir que los equipos cambien infraestructura. Consiste en definir guardrails automáticos que permitan autonomía dentro de límites conocidos.

01

Define ownership

Cada módulo y cada estado debe tener un responsable claramente identificado. Sin ownership, los incidentes terminan convirtiéndose en problemas organizativos.

02

Versiona módulos

Evita depender de cambios implícitos. Los consumidores deben poder conocer exactamente qué versión del contrato están utilizando.

03

Automatiza validaciones

Ejecuta fmt, validate, tests, análisis estático y políticas antes de permitir cambios sobre infraestructura crítica.

04

Protege producción

Los cambios de mayor impacto deben requerir controles adicionales, especialmente cuando pueden eliminar datos, modificar redes críticas o incrementar costes.

05

Mide la plataforma

Observa duración de planes, frecuencia de fallos, drift, cambios manuales, incidencias y tiempo de recuperación.

Checklist de implementación paso a paso

1

Inventariar infraestructura

Identifica recursos, owners, dependencias, criticidad, cuentas, regiones y restricciones regulatorias.

2

Definir boundaries

Determina qué recursos deben compartir State y cuáles deben permanecer aislados.

3

Crear módulos con contratos pequeños

Evita módulos gigantescos. Define inputs y outputs explícitos y valida variables en los límites de la abstracción.

4

Configurar State remoto

Implementa almacenamiento remoto, locking, cifrado, control de acceso y procedimientos de recuperación.

5

Construir CI/CD

Automatiza format, validate, plan, validaciones de seguridad y aprobación antes de apply.

6

Aplicar políticas y FinOps

Valida tags, regiones, tipos de recursos, límites de capacidad y potencial impacto económico.

7

Introducir observabilidad y drift detection

Detecta cambios no declarados y establece procedimientos claros para reconciliar el estado real con el estado deseado.

Preguntas frecuentes sobre Terraform en producción

¿Cómo debe gestionarse el Terraform State en producción?

El Terraform State debe almacenarse en un backend remoto con control de acceso, cifrado, mecanismos de locking y capacidades de recuperación adecuadas. Además, conviene dividirlo según dominios funcionales para reducir el blast radius y evitar que todos los equipos dependan del mismo estado.

¿Cuándo conviene crear un módulo de Terraform?

Conviene crear un módulo cuando existe una capacidad de infraestructura reutilizable con una interfaz estable y responsabilidades claras. Un módulo no debería existir únicamente para reducir líneas de código: debe encapsular conocimiento, invariantes, seguridad o una arquitectura que merezca ser reutilizada.

¿Cómo evitar que Terraform genere costes inesperados?

El control debe comenzar en el diseño. Utiliza variables con validaciones, límites de capacidad, tags obligatorios, políticas como código, revisión de planes y mecanismos de estimación de costes. El objetivo es impedir que una configuración técnicamente válida sea financieramente inaceptable.

La conclusión arquitectónica

Terraform escala bien cuando se diseña como una plataforma de ingeniería, no simplemente como un conjunto de archivos HCL.

Los principios fundamentales son claros: estados pequeños y aislados, módulos con contratos estables, permisos mínimos, pipelines reproducibles, políticas automáticas, control del blast radius y FinOps integrado desde el principio.

La madurez de Terraform no se mide por cuántos recursos puedes crear con un comando, sino por qué tan predecible, auditable, recuperable y escalable es el cambio de infraestructura.

Sobre el Autor: Eduardo Martínez Agrelo

AI & Data Architect

Eduardo Martínez Agrelo es AI & Data Architect, especializado en arquitectura tecnológica, datos, inteligencia artificial y diseño de plataformas empresariales. Su enfoque combina profundidad técnica, visión arquitectónica y pragmatismo orientado a sistemas preparados para producción.

Guía técnica sobre Terraform, Infrastructure as Code, arquitectura cloud, gobernanza y FinOps.