En el subcapítulo anterior añadimos una tabla de DynamoDB a nuestro backend «para el locking». Ahora vamos a entender bien qué es el state locking y por qué es imprescindible cuando varias personas trabajan sobre la misma infraestructura. Es la pieza que evita uno de los peores desastres posibles con Terraform: la corrupción del estado.

El problema: dos personas a la vez

Recuerda que el estado (Capítulo 11) es el archivo que registra qué recursos existen y cómo se relacionan. Es la «fuente de la verdad» de Terraform. Ahora imagina esta situación en un equipo:

   Ana ejecuta "terraform apply"    ┐
                                     ├─► ¡a la VEZ! sobre el MISMO estado
   Carlos ejecuta "terraform apply" ┘

Si ambos modifican el estado al mismo tiempo, sus cambios se mezclan y se corrompen. El archivo de estado puede quedar inconsistente: registros a medias, recursos duplicados, o un estado que ya no refleja la realidad. Un estado corrupto es una pesadilla: Terraform pierde la noción de qué existe, y arreglarlo a mano es lento y peligroso.

Analogía: es como dos personas editando el mismo documento a la vez sin coordinación, cada una guardando encima de la otra. El resultado es un documento destrozado donde se pierden cambios y nada tiene sentido. Necesitas que, mientras uno edita, el otro espere su turno.

La solución: el state locking (bloqueo del estado)

El state locking (bloqueo del estado) resuelve esto con una regla sencilla: mientras alguien está modificando el estado, nadie más puede hacerlo a la vez. Terraform pone un «cerrojo» (lock) antes de empezar a trabajar y lo quita al terminar.

   Ana ejecuta apply  →  Terraform pone el CERROJO 🔒
                         (Ana trabaja tranquila)
   Carlos ejecuta apply →  "El estado está bloqueado, espera..."
                         (Carlos espera)
   Ana termina  →  Terraform quita el cerrojo 🔓
   Carlos  →  ahora sí, pone su cerrojo y trabaja

Así, las operaciones se serializan: ocurren una detrás de otra, nunca a la vez. El estado nunca se corrompe por accesos simultáneos.

Cómo funciona con DynamoDB

Aquí entra la tabla de DynamoDB que configuramos en el subcapítulo 20.1. Funciona como el «portero del cerrojo»:

  1. Cuando alguien ejecuta apply (o plan), Terraform escribe un registro de bloqueo en la tabla DynamoDB (en la clave LockID).
  2. Si otra persona intenta ejecutar Terraform, este comprueba la tabla, ve que ya hay un bloqueo activo y espera (o avisa de que está bloqueado).
  3. Cuando el primero termina, Terraform borra el registro de bloqueo, liberando el cerrojo.
DynamoDB (tabla de locks)
  LockID: "mi-estado"  →  ocupado por Ana desde las 10:32  🔒
                          (Carlos ve esto y espera)

DynamoDB es ideal para esto porque garantiza operaciones atómicas y consistentes: dos personas no pueden «coger el cerrojo» a la vez; solo uno gana.

Qué ves cuando el estado está bloqueado

Si intentas ejecutar Terraform mientras otra persona tiene el cerrojo, verás un mensaje parecido a este:

Error: Error acquiring the state lock

Lock Info:
  ID:        a1b2c3d4-...
  Who:       [email protected]
  Created:   2024-...

Esto te dice quién tiene el bloqueo y desde cuándo. No es un error «malo»: es Terraform protegiéndote. Simplemente esperas a que la otra persona termine y vuelves a intentarlo.

El locking ocurre automáticamente

La buena noticia: una vez configurado el backend con DynamoDB (subcapítulo 20.1), el locking funciona solo, sin que tengas que hacer nada. Terraform pone y quita el cerrojo automáticamente en cada operación. Tú simplemente trabajas con normalidad, y el sistema te protege por detrás.

Cuando un lock se queda «atascado»

Ocasionalmente, un bloqueo puede quedarse «pegado»: por ejemplo, si la conexión de alguien se corta a mitad de un apply, el cerrojo podría no liberarse. En esos casos raros, existe el comando terraform force-unlock para quitar el cerrojo manualmente:

terraform force-unlock <ID-del-lock>

⚠️ Úsalo con muchísimo cuidado. Antes de forzar el desbloqueo, asegúrate de que de verdad nadie está trabajando sobre el estado. Si fuerzas el desbloqueo mientras otra persona realmente está aplicando cambios, vuelves a arriesgarte a la corrupción que el locking pretendía evitar. Confirma siempre con tu equipo primero.

Por qué esto es tan importante

El state locking, junto con el estado remoto (subcapítulo 20.1), es lo que hace que Terraform sea seguro en equipo. Sin él, la colaboración sería una bomba de relojería: tarde o temprano dos personas coincidirían y corromperían el estado. Con él, decenas de personas pueden trabajar sobre la misma infraestructura sin miedo. Es la base, junto con el flujo de PR (subcapítulo 12.5), del trabajo profesional con Terraform.

Lo que debes recordar

  • Si dos personas modifican el estado a la vez, este se corrompe (queda inconsistente), lo que es un desastre difícil de arreglar. Como dos personas editando el mismo documento sin coordinación.
  • El state locking (bloqueo) evita esto: mientras alguien trabaja, pone un cerrojo que impide que otros modifiquen el estado a la vez. Las operaciones se serializan (una tras otra).
  • Con el backend S3 + DynamoDB, el locking funciona automáticamente: Terraform escribe un registro de bloqueo en DynamoDB al empezar y lo borra al terminar.
  • Si el estado está bloqueado, verás un mensaje indicando quién lo tiene; no es un error malo, es protección. Simplemente esperas.
  • En casos raros de bloqueo «atascado», existe terraform force-unlock, pero úsalo con extremo cuidado y solo tras confirmar que nadie está trabajando.

En el siguiente subcapítulo veremos cómo mover el estado entre backends de forma segura, algo necesario cuando reorganizas o migras tu infraestructura.

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