Bitácora técnica · Terraform
Terraform con estado remoto: cuándo el backend local deja de servir
Bloqueos, concurrencia y trabajo en equipo sobre la misma infraestructura
Mientras una sola persona ejecuta terraform apply, tener el archivo terraform.tfstate en la carpeta del proyecto es cómodo y no molesta a nadie. El problema aparece el día que dos ingenieros tocan la misma infraestructura con unas horas de diferencia: uno aplica un cambio, el otro ya tenía un plan armado sobre el estado anterior y lo aplica encima. El resultado no es un error limpio, es un plan que parece válido pero destruye o recrea recursos que el primero acababa de crear.
Las señales de que el estado local ya no alcanza son bastante reconocibles. Aparecen recursos huérfanos que nadie recuerda haber creado, planes que muestran destrucciones inesperadas de volúmenes o buckets, y mensajes de "resource already exists" al importar algo que en teoría ya estaba gestionado. En equipos chicos suele pasar que alguien copió el archivo de estado a su máquina para "revisar algo" y desde entonces hay dos versiones circulando. Cuando eso ocurre, el estado deja de ser una fuente de verdad y se convierte en un archivo más que se sincroniza a mano.
El backend remoto resuelve dos cosas al mismo tiempo: centraliza el estado en un único lugar y agrega locking, es decir, un bloqueo que impide que dos apply corran en paralelo sobre el mismo estado. La configuración mínima es un bloque backend dentro del terraform block, apuntando a un bucket o a un servicio de almacenamiento con soporte de bloqueo. Antes de mover el archivo hay que hacer una copia, correr terraform init -migrate-state y confirmar que el plan posterior sigue mostrando exactamente los mismos cambios que antes de la migración. Si el plan cambia, algo se leyó mal y conviene detenerse.
Un detalle que se pasa por alto: el locking no reemplaza la disciplina de revisar el plan. Un backend remoto evita que dos personas pisen el mismo estado, pero no evita que alguien aplique un cambio que no revisó. La lista de comprobaciones previa a la migración incluye verificar que no haya un apply en curso, que el estado local esté al día, que las variables sensibles no estén hardcodeadas en el archivo y que el backend elegido tenga versionado habilitado para poder volver atrás si algo sale mal.