En el Capítulo 11 vimos por encima el estado remoto. Ahora vamos a profundizar, porque es uno de los pilares del trabajo en equipo con Terraform. En este subcapítulo configuraremos el backend más usado del mundo AWS: S3 + DynamoDB. S3 guarda el estado, y DynamoDB se encarga del «locking» (bloqueo) para que varias personas no se pisen. Veámoslo paso a paso.

Repaso: por qué necesitas un backend remoto

Recuerda del subcapítulo 11.3 el problema del estado local: si el archivo terraform.tfstate está en tu portátil, tu equipo no puede colaborar (cada uno tendría su propia copia), y si pierdes el archivo, pierdes el control de tu infraestructura. La solución es guardar el estado en un sitio central y compartido: un backend remoto.

Estado local (mal para equipos):     Estado remoto (bien):
  tfstate en tu portátil               tfstate en S3 (central)
  - solo tú lo tienes                  - todo el equipo lo comparte
  - se puede perder                    - seguro, con copias y versiones

El backend S3 + DynamoDB: los dos componentes

El backend estándar en AWS combina dos servicios que ya conoces, cada uno con un papel:

┌─────────────── Backend remoto ───────────────┐
│  S3        → guarda el archivo de estado      │
│  DynamoDB  → gestiona el "lock" (bloqueo)     │
└────────────────────────────────────────────────┘
  • S3 (Capítulo 5): almacena el archivo tfstate. Es duradero, está versionado y cifrado.
  • DynamoDB (subcapítulo 8.3): gestiona el bloqueo para evitar que dos personas modifiquen el estado a la vez (lo veremos a fondo en el subcapítulo 20.2).

Paso 1: Crear el bucket de S3 y la tabla de DynamoDB

Estos dos recursos son los «cimientos» que deben existir antes de configurar el backend. Se suelen crear una sola vez:

# Bucket de S3 para guardar el estado
resource "aws_s3_bucket" "estado" {
  bucket = "mi-empresa-terraform-estado"
}

# Activar versionado: guarda el historial del estado (¡muy recomendable!)
resource "aws_s3_bucket_versioning" "estado" {
  bucket = aws_s3_bucket.estado.id
  versioning_configuration {
    status = "Enabled"
  }
}

# Tabla de DynamoDB para el locking
resource "aws_dynamodb_table" "locks" {
  name         = "terraform-locks"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"

  attribute {
    name = "LockID"
    type = "S"
  }
}

Fíjate en dos detalles importantes:

  • El versionado del bucket (recuerda el subcapítulo 5.3) guarda el historial del estado. Si algo sale mal, puedes volver a una versión anterior. Es una red de seguridad valiosísima.
  • La tabla de DynamoDB usa una clave LockID: ahí es donde Terraform escribe el «cerrojo» cuando alguien está trabajando.

Paso 2: Configurar el backend en tu proyecto

Una vez existen el bucket y la tabla, configuras tu proyecto para que use ese backend. Esto se hace en el bloque terraform:

terraform {
  backend "s3" {
    bucket         = "mi-empresa-terraform-estado"   # el bucket S3
    key            = "produccion/terraform.tfstate"  # ruta del estado
    region         = "eu-west-1"
    dynamodb_table = "terraform-locks"               # la tabla de locking
    encrypt        = true                            # cifra el estado
  }
}

Repasemos cada línea:

  • bucket: el bucket de S3 donde se guarda el estado.
  • key: la ruta del archivo dentro del bucket. Fíjate en produccion/...: usar una ruta distinta por entorno es clave para la estrategia de directorios (subcapítulo 19.2). Cada entorno tiene su propio estado separado.
  • dynamodb_table: la tabla que gestiona los bloqueos.
  • encrypt = true: cifra el estado en reposo. Importante, porque el estado puede contener datos sensibles (subcapítulo 11.2).

Paso 3: Inicializar

Tras configurar el backend, ejecutas terraform init (subcapítulo 11.4). Terraform detecta el backend y, si ya tenías estado local, te pregunta si quieres migrarlo al remoto:

terraform init
  → Terraform detecta el backend S3
  → "¿Migrar el estado existente a S3?" → yes
  → a partir de ahora, el estado vive en S3

¡Listo! Tu estado ya está centralizado, versionado, cifrado y con bloqueo. Tu equipo puede colaborar de forma segura.

Un detalle: el «problema del huevo y la gallina»

Quizá te preguntes: si Terraform crea el bucket y la tabla... ¿dónde se guarda el estado de esos recursos antes de que el backend exista? Es un pequeño dilema circular. La solución habitual:

  1. Creas el bucket y la tabla con estado local (sin backend todavía).
  2. Una vez existen, añades la configuración del backend y haces init para migrar el estado a S3.

Otra opción es crear estos recursos «base» manualmente una vez. En cualquier caso, es un paso inicial que solo se hace una vez por organización.

Lo que debes recordar

  • El estado local no sirve para equipos (no se comparte y se puede perder); necesitas un backend remoto central y compartido.
  • El backend estándar en AWS es S3 + DynamoDB: S3 guarda el archivo de estado (duradero, versionado, cifrado) y DynamoDB gestiona el bloqueo (lock) para que nadie se pise.
  • Configuración: crea el bucket S3 (con versionado, como red de seguridad) y la tabla DynamoDB (clave LockID); luego declara el backend "s3" con bucket, key (ruta por entorno), dynamodb_table y encrypt = true.
  • Usa una key distinta por entorno (produccion/..., dev/...) para separar los estados (estrategia del subcapítulo 19.2).
  • Tras configurarlo, terraform init migra el estado al backend. Los recursos «base» (bucket y tabla) se crean una sola vez (con un paso inicial para el «huevo y la gallina»).

En el siguiente subcapítulo profundizaremos en la pieza que hace seguro el trabajo en equipo: el state locking y cómo evita la corrupción del estado.

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