Toda aplicación real necesita varios entornos: uno de desarrollo para probar, otro de staging (preproducción) para validar, y el de producción donde están los usuarios reales. En este capítulo veremos cómo gestionar esos entornos con Terraform. Empezamos por una herramienta que el propio Terraform ofrece: los workspaces. Pero, ojo, también veremos por qué tienen limitaciones importantes.

Por qué necesitas varios entornos

Nunca debes probar cambios directamente en producción: sería como hacer experimentos con los clientes reales mirando. Por eso se separan los entornos:

Desarrollo (dev)  → pruebas libremente, puede romperse sin problema
Staging (stg)     → réplica de producción para validar antes de lanzar
Producción (prod) → el entorno real, con usuarios; aquí no se experimenta

Cada entorno suele tener la misma estructura de infraestructura (una VPC, unos servidores, una base de datos...), pero con diferencias: producción es más grande y robusta, desarrollo es más pequeño y barato. El reto es: ¿cómo gestiono el mismo código para varios entornos sin duplicarlo todo?

Qué son los workspaces

Recuerda el estado de Terraform (Capítulo 11): el archivo que registra qué recursos existen. Un workspace (espacio de trabajo) es, en esencia, un estado separado dentro del mismo código. Cambiando de workspace, Terraform usa un estado distinto, lo que te permite tener varias copias de la misma infraestructura sin que se mezclen.

Mismo código Terraform
 ├── workspace "dev"   → su propio estado → infraestructura de desarrollo
 ├── workspace "stg"   → su propio estado → infraestructura de staging
 └── workspace "prod"  → su propio estado → infraestructura de producción

Los comandos básicos:

terraform workspace new dev       # crear un workspace
terraform workspace select prod   # cambiar a otro workspace
terraform workspace list          # ver los workspaces

Dentro del código, puedes saber en qué workspace estás con terraform.workspace, y adaptar valores en consecuencia:

locals {
  # en producción usamos instancias grandes; en el resto, pequeñas
  tipo_instancia = terraform.workspace == "prod" ? "t3.large" : "t3.micro"
}

Analogía: los workspaces son como tener varias partidas guardadas del mismo videojuego. El juego (el código) es el mismo, pero cada partida (workspace) tiene su propio progreso (estado) independiente. Cambias de partida y trabajas sobre otra realidad sin afectar a las demás.

Las limitaciones (importante)

Los workspaces parecen la solución perfecta, pero tienen problemas serios que debes conocer antes de adoptarlos para gestionar entornos. De hecho, la comunidad no recomienda usar workspaces para separar dev/stg/prod. Veamos por qué.

  1. Mismo código, mismo backend: poca separación real

Todos los workspaces comparten el mismo código y el mismo backend (el mismo bucket de estado). Esto significa que la separación entre producción y desarrollo es frágil: un error puede afectar a varios entornos, y no hay una barrera fuerte entre ellos.

  1. Riesgo de equivocarte de entorno

Como cambias de entorno con un simple workspace select, es fácil olvidar en cuál estás y aplicar un cambio en el sitio equivocado. Imagina ejecutar un apply pensando que estás en dev cuando en realidad estás en prod. ⚠️ Este error ha causado incidentes reales.

  1. Difícil tener configuraciones muy distintas

Si tus entornos son muy diferentes (no solo en tamaño, sino en estructura: producción tiene componentes que desarrollo no), forzar todo en un mismo código con condicionales (terraform.workspace == ...) se vuelve enrevesado y difícil de leer.

  1. Visibilidad pobre

No es evidente, mirando el código, qué hay en cada entorno. Todo está mezclado y depende de en qué workspace estés, lo que dificulta entender y auditar la infraestructura.

¿Cuándo SÍ usar workspaces?

Los workspaces tienen su sitio en casos sencillos:

  • Cuando los entornos son casi idénticos y solo cambian detalles menores (un tamaño, un nombre).
  • Para crear copias temporales de prueba (por ejemplo, un entorno por cada rama de desarrollo, que creas y destruyes rápido).
  • En proyectos pequeños donde la separación fuerte no es crítica.

¿Cuándo NO? (y qué hacer en su lugar)

Para gestionar entornos serios (dev/stg/prod en una empresa), la recomendación general es no usar workspaces, sino una estrategia de directorios separados por entorno, que veremos en el siguiente subcapítulo (19.2). Esa estrategia da una separación mucho más clara, segura y visible.

Conclusión clave: los workspaces existen y son útiles para casos simples, pero no son la mejor herramienta para separar producción de desarrollo en proyectos reales. Conócelos, pero sé consciente de sus límites.

Lo que debes recordar

  • Toda aplicación real necesita varios entornos (dev, staging, producción) para no experimentar nunca directamente sobre los usuarios reales.
  • Un workspace de Terraform es un estado separado dentro del mismo código, lo que permite tener varias copias de la infraestructura (como «partidas guardadas» del mismo juego). Se gestiona con terraform workspace new/select/list.
  • Limitaciones importantes: comparten código y backend (separación débil), es fácil equivocarse de entorno (peligroso), se complican si los entornos son muy distintos, y dan poca visibilidad.
  • Úsalos para casos sencillos (entornos casi idénticos, copias temporales), pero no como forma principal de separar dev/stg/prod en proyectos serios.
  • La alternativa recomendada para entornos serios es la separación por directorios, que veremos a continuación.

En el siguiente subcapítulo veremos esa estrategia recomendada: organizar tu infraestructura en directorios por entorno.

Cloud, AWS & Terraform — De cero a experto

Capítulo 1 · Qué es el cloud computing

Capítulo 2 · El mercado cloud y los grandes proveedores

Capítulo 3 · Regiones, zonas de disponibilidad y edge

Capítulo 4 · Cómputo: EC2

Capítulo 5 · Almacenamiento: S3

Capítulo 6 · Redes: VPC

Capítulo 7 · Identidad y acceso: IAM

Capítulo 8 · Bases de datos gestionadas

Capítulo 9 · Por qué Infraestructura como Código

Capítulo 10 · HCL: el lenguaje de Terraform

Capítulo 11 · Providers y estado

Capítulo 12 · Tu primera infraestructura real en Terraform

Capítulo 13 · Balanceo de carga y autoescalado

Capítulo 14 · Serverless con Lambda

Capítulo 15 · Mensajería y eventos

Capítulo 16 · Entrega de contenido y DNS

Capítulo 17 · Contenedores en AWS

Capítulo 18 · Módulos: reutilización y composición

Capítulo 19 · Workspaces y gestión de entornos

Capítulo 20 · Backends remotos y locking

Capítulo 21 · Testing de infraestructura

Capítulo 22 · Terraform en CI/CD

Capítulo 23 · Seguridad en profundidad

Capítulo 24 · Observabilidad: logs, métricas y trazas

Capítulo 25 · Optimización de costes

Capítulo 26 · Alta disponibilidad y disaster recovery

Capítulo 27 · Well-Architected Framework de AWS

Capítulo 28 · Arquitecturas serverless a escala

Capítulo 29 · Plataformas de datos en AWS

Capítulo 30 · Multi-cuenta y landing zones

Capítulo 31 · Platform Engineering e Internal Developer Platform

Capítulo 32 · Certificaciones AWS relevantes

Capítulo 33 · Proyectos para consolidar lo aprendido

Capítulo 34 · Recursos y comunidad

© Copyright 2024. Todos los derechos reservados