Ya sabes que el estado es el inventario de Terraform. La siguiente pregunta es: ¿dónde se guarda ese inventario? Por defecto, en tu propio ordenador. Pero eso causa problemas en cuanto trabajas en equipo. En este subcapítulo veremos la diferencia entre estado local y remoto, y cómo configurar el clásico backend de S3 + DynamoDB, una de las prácticas más importantes de Terraform profesional.

State local: el punto de partida

Por defecto, Terraform guarda el estado en un archivo terraform.tfstate en la carpeta de tu proyecto, en tu ordenador. Esto se llama estado local.

Para aprender y experimentar tú solo, está bien. Pero tiene problemas graves en cuanto la cosa se pone seria:

Problema 1: No se puede colaborar

Si el estado está en tu portátil, tus compañeros no lo tienen. Cada uno tendría su propia versión del estado, que se contradicen entre sí. Imposible trabajar en equipo.

Problema 2: Riesgo de pérdida

Si tu portátil se rompe, se pierde o borras la carpeta por error, pierdes el estado. Y ya sabes (subcapítulo 11.2) lo grave que es perder el estado: Terraform «se olvida» de todo lo que gestiona.

Problema 3: Sin bloqueo (locking)

Si dos personas ejecutaran apply a la vez sobre la misma infraestructura, podrían corromper el estado o pisarse los cambios. El estado local no tiene forma de evitarlo.

Problema 4: Seguridad

Un archivo con datos sensibles (subcapítulo 11.2) en tu portátil, sin cifrar, es un riesgo.

State remoto: la solución profesional

El estado remoto guarda el tfstate en un lugar central y compartido (en la nube), en lugar de en tu ordenador. Esto resuelve todos los problemas anteriores:

  • Colaboración: todo el equipo lee y escribe el mismo estado central.
  • Seguridad: se guarda cifrado y protegido.
  • Durabilidad: no se pierde si falla tu portátil.
  • Bloqueo: evita que dos personas modifiquen a la vez (lo veremos enseguida).

A la configuración de dónde se guarda el estado se le llama backend. Hay varios tipos de backend remoto; el más clásico en AWS es S3 + DynamoDB.

El backend clásico: S3 + DynamoDB

Esta combinación usa dos servicios que ya conoces de la Parte II:

Servicio Papel en el backend
S3 (Capítulo 5) Guarda el archivo de estado (cifrado, versionado, duradero)
DynamoDB (Capítulo 8) Gestiona el bloqueo (locking) para que no haya dos apply a la vez

Analogía:

  • S3 es la caja fuerte compartida donde se guarda el inventario (el estado), accesible para todo el equipo, segura y respaldada.
  • DynamoDB es el sistema de "ocupado/libre" de un baño: cuando alguien está usando el estado (ejecutando apply), pone el cartel de «ocupado» (un bloqueo) para que nadie más entre hasta que termine.

Por qué S3 es ideal para el estado

  • Durable (recuerda los «once nueves» del Capítulo 5): casi imposible perderlo.
  • Cifrado en reposo: protege los datos sensibles.
  • Versionado (subcapítulo 5.3): guarda el historial del estado, así puedes recuperar una versión anterior si algo va mal.
  • Compartido: todo el equipo accede al mismo archivo.

Por qué DynamoDB para el bloqueo

DynamoDB gestiona un «candado»: antes de modificar el estado, Terraform pone un bloqueo en una tabla de DynamoDB. Mientras ese bloqueo existe, nadie más puede ejecutar apply. Cuando termina, lo libera. Así se evita la corrupción por accesos simultáneos. Veremos el locking a fondo en el Capítulo 20.

Nota: Versiones recientes de Terraform/S3 permiten gestionar el bloqueo directamente en S3 sin DynamoDB. Pero el patrón S3 + DynamoDB sigue siendo el más conocido y el que verás en la mayoría de proyectos y documentación.

Cómo se configura (visión general)

La configuración del backend se declara en el bloque terraform:

terraform {
  backend "s3" {
    bucket         = "mi-empresa-terraform-state"
    key            = "produccion/red/terraform.tfstate"
    region         = "eu-west-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}
  • bucket: el bucket de S3 donde se guarda el estado.
  • key: la «ruta» dentro del bucket (organiza estados de distintos proyectos/entornos).
  • dynamodb_table: la tabla para el bloqueo.
  • encrypt = true: cifra el estado.

Tras escribir esto, ejecutas terraform init y Terraform configura el backend. Veremos los detalles paso a paso en el Capítulo 20.

El problema del huevo y la gallina: para guardar el estado en S3, necesitas un bucket de S3… pero ese bucket también es infraestructura. La solución habitual: crear el bucket y la tabla una vez (a mano o con un Terraform pequeño de estado local) y luego usarlos como backend para todo lo demás. Lo veremos en el Capítulo 20.

Local vs remoto: tabla comparativa

Estado local Estado remoto (S3 + DynamoDB)
Dónde vive Tu ordenador En la nube, compartido
Colaboración en equipo No
Riesgo de pérdida Alto Bajo (durable, versionado)
Bloqueo (evita conflictos) No Sí (DynamoDB)
Cifrado / seguridad Manual
Cuándo usarlo Aprender, pruebas en solitario Cualquier proyecto serio o en equipo

Lo que debes recordar

  • Por defecto, el estado es local (en tu ordenador): vale para aprender solo, pero no para equipos ni producción.
  • El estado remoto lo guarda en un lugar central y compartido (un backend), resolviendo colaboración, seguridad, durabilidad y bloqueo.
  • El backend clásico en AWS es S3 + DynamoDB: S3 guarda el estado (cifrado, versionado, duradero) y DynamoDB gestiona el bloqueo (evita dos apply simultáneos).
  • Se configura en el bloque terraform { backend "s3" { ... } } y se activa con terraform init.
  • Para cualquier proyecto serio o en equipo, usa estado remoto. Lo veremos en detalle en el Capítulo 20.

En el último subcapítulo de este capítulo repasaremos los comandos esenciales de Terraform que usarás a diario: init, plan, apply, destroy, fmt y validate.

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