Terraform para laboratorios reproducibles

Artículo 2 de 7

29%

completado

Cloud e infraestructuraEngineering guide7 min de lectura

Terraform state: backends, locking y recuperación sin superstición

Cómo razonar sobre state, backends y locking en Terraform/OpenTofu: invariantes, múltiples escritores, fallos parciales y recuperación verificable.

Prerequisitos recomendados

Si alguno de estos conceptos todavía está medio nebuloso, empieza por aquí. Te ahorra tropiezos y un par de cejas fruncidas.

El state no es la infraestructura y tampoco es un caché descartable. Es el mapa que relaciona direcciones del código —por ejemplo, aws_s3_bucket.lab— con objetos remotos concretos. Si ese mapa se pierde, Terraform no olvida que el bucket existe: pierde la evidencia necesaria para saber que ese bucket es su bucket.

Terraform recomienda no guardar state en un sistema sin control de acceso y locking porque puede contener datos sensibles y porque dos escritores pueden producir pérdida de información.

El invariante que conviene proteger

Antes de discutir S3, Consul o un servicio administrado, fija este invariante:

cada operación de escritura debe empezar desde la última versión confirmada del state y terminar publicando una nueva versión completa, o no publicar nada.

El backend decide dónde vive el snapshot y, cuando lo soporta, cómo se serializan las escrituras. El locking no vuelve correcta una configuración; evita que dos ejecuciones correctas por separado se destruyan mutuamente al escribir desde snapshots distintos. Terraform bloquea automáticamente las operaciones que pueden escribir state y se detiene si no logra adquirir el lock.

Transacción operacional

Una escritura segura de state

El lock protege el intervalo entre leer la versión vigente y publicar el nuevo snapshot.
  1. Adquirir lockidentidad y nonce del escritor
  2. Leer statelineage y serial vigentes
  3. Refrescar y planearconfiguración, state y objetos remotos
  4. Aplicarcambios observados paso a paso
  5. Persistir statenuevo serial completo
  6. Liberar locksolo tras confirmar escritura

Backend no significa solo “archivo remoto”

Un backend serio cubre cuatro preguntas:

  1. Durabilidad: ¿hay versionado y recuperación ante borrado o escritura fallida?
  2. Exclusión mutua: ¿el locking existe y qué identidad deja como evidencia?
  3. Acceso: ¿quién puede leer state y quién puede escribirlo?
  4. Trazabilidad: ¿puedes saber qué ejecución publicó cada versión?

Los backends determinan almacenamiento y pueden ofrecer locking; no todos lo hacen. En un error no recuperable al persistir state remoto, Terraform puede escribir un state local de emergencia para evitar pérdida de datos, y esa copia exige una reconciliación consciente.

Matriz de Decisión

Elegir backend por el modo de trabajo

Local versionado fuera de Git

Un solo operador, lab efímero y copia controlada.

Ideal para: Pruebas personales que pueden reconstruirse desde cero.
Ojo con: Pérdida del disco, exposición accidental y ausencia de coordinación.

Backend remoto con locking

★ Recomendado

State compartido, control de acceso y serialización de escrituras.

Ideal para: Equipos, CI y cualquier entorno que no sea descartable.
Ojo con: El backend también necesita backup, auditoría y recuperación probada.

Objeto remoto sin lock

Parece colaboración, pero permite carreras entre planes y applies.

Ideal para: Solo lectura o experimentos donde perder state sea aceptable.
Ojo con: Dos escritores pueden partir de la misma versión y publicar historias incompatibles.
La comodidad local deja de ser una virtud cuando aparece un segundo escritor.

force-unlock no es un botón de desatascar

Un lock viejo puede aparecer por una ejecución interrumpida. Antes de forzarlo, responde con evidencia:

  • ¿la ejecución dueña del lock terminó realmente?;
  • ¿hay un apply todavía hablando con el provider?;
  • ¿qué lock ID reportó el backend?;
  • ¿cuál es el último serial y quién lo escribió?;
  • ¿existe una copia recuperable antes de intervenir?

Forzar el unlock mientras otro proceso sigue vivo devuelve el problema original: múltiples escritores. Por eso el ID del lock funciona como nonce y no como decoración. La recuperación correcta no es “quitar el candado”; es demostrar que no queda un escritor legítimo y que el state vigente representa el último resultado confirmado.

Fallo parcial: objeto creado, state no publicado

El caso más incómodo ocurre cuando el provider creó el recurso, pero el backend no recibió el nuevo state. El siguiente plan puede proponer crearlo otra vez o chocar con un nombre ya existente. La salida segura es detener nuevos applies, conservar logs y state de emergencia, inspeccionar el objeto remoto y reconciliarlo mediante import o una restauración controlada. Nunca empieces editando JSON a mano.

La distinción importante es esta: la nube contiene el hecho; el state contiene la asociación. Recuperar consiste en volver a hacer coincidir ambas capas sin inventar una tercera historia.

Diseñar recuperación antes del incidente

El backend necesita una política de versionado, cifrado, acceso y retención coherente con el impacto del stack. Restringe lectura tanto como escritura: el state puede contener datos sensibles aunque ningún output esté marcado. Separa el rol que ejecuta planes del que administra el backend y evita que un job ordinario pueda borrar versiones o desactivar el lock.

Una restauración debe comenzar con el sistema detenido para nuevos escritores. Conserva state actual, versión candidata, lineage, serial y logs del último apply. Compara bindings con los objetos remotos y ensaya primero en una copia. Después de restaurar, ejecuta un plan refresh-only para observar la realidad y un plan normal para evaluar la intención; no apliques hasta explicar cada diferencia.

La métrica relevante no es “tenemos backups”. Es cuánto tardas en recuperar una asociación consistente y qué evidencia demuestra que no duplicaste, abandonaste ni reemplazaste recursos. Esa prueba convierte el backend de simple almacenamiento en una pieza operable.

Programa el ensayo con un stack descartable y mide desde la detección hasta el plan reconciliado. Las dudas encontradas durante el simulacro pertenecen al runbook, no a la memoria de quien lo ejecutó.

Repite el ejercicio cuando cambien backend, permisos o procedimiento de despliegue.

Contrato de lab

Practica sin credenciales con dos procesos que intenten modificar el mismo state local. El lab debe capturar:

  • identidad y momento de adquisición del lock;
  • rechazo observable del segundo escritor;
  • lineage y serial antes y después;
  • copia del state anterior;
  • procedimiento documentado de recuperación;
  • plan final sin cambios inesperados.

No fuerces el unlock durante la primera corrida. Primero demuestra qué protege. Después simula un lock huérfano, verifica que no queda proceso vivo y recién entonces ensaya la recuperación.

Conexiones dentro de la serie

Referencias

Bibliografía académica

Formato IEEENumerado para ingeniería, sistemas y protocolos.
  1. [1]

    HashiCorp, "State," Terraform Language Documentation.

    official docsID: TF-STATE🔗 Abrir fuente

    Propósito, colaboración y sensibilidad del state.

  2. [2]

    HashiCorp, "State Locking," Terraform Language Documentation.

    official docsID: TF-LOCKING🔗 Abrir fuente

    Semántica del lock y recuperación con lock ID.

  3. [3]

    HashiCorp, "Backends: State Storage and Locking," Terraform Language Documentation.

    official docsID: TF-BACKENDS🔗 Abrir fuente

    Almacenamiento, lineage, serial y fallos de persistencia.

Fuentes primarias, papers seminales y especificaciones técnicas citadas en esta investigación.

Rutas vecinas

Si este tema te abrió hambre, sigue por aquí.

Series y labs que comparten área o dependen de esta ruta. Pocas opciones, para no convertir la curiosidad en menú infinito.

Sigue leyendo

Ideas conectadas con este artículo

Una ruta corta para continuar sin abrir veinte pestañas y perder el hilo.