Usando DTZ Objectstore para archivos de estado de Terraform

created: sábado, sept. 28, 2024

Usamos Terraform mucho, ya sea para probar nuestra propia infraestructura o desplegar proyectos dentro de DownToZero.

Dado que DTZ es soportado como proveedor, comenzamos a implementar proyectos sobre él. Una cosa que surgía regularmente es la ubicación del archivo de estado. Revisar el estado en el repositorio git usualmente no es una buena idea (aunque aún es mejor que mantenerlo local), pero tener algún tipo de estado remoto ayuda mucho para correr TF en pipelines y hacer el estado independiente del proyecto.

Mirando nuestras opciones para estado remoto, hay una lista bastante amplia. Lamentablemente la mayoría están ligados a proveedores cloud, lo que no es realmente útil para nosotros en este momento. Sin embargo, existe el proveedor backend genérico http.

Al revisar este proveedor encontramos que podemos usarlo para conectar con nuestro objectstore y usar nuestro propio sistema para persistir el archivo de estado.

Y esto es cómo se vería.

terraform {
  required_providers {
    dtz = {
      source = "DownToZero-Cloud/dtz"
      version = ">= 0.1.24"
    }
  }
  backend "http" {
    address = "http://objectstore.dtz.rocks/api/2022-11-28/obj/tf-test/state.tfstate"
    update_method = "PUT"
    username = "apikey"
    password = var.apikey
  }
}

Lamentablemente el bloqueo no funciona, ya que tiene algunos detalles de implementación que no son compatibles con nuestro objectstore.

El objectstore no soporta los métodos HTTP LOCK, UNLOCK (aunque esto es ajustable en el proveedor).

La otra limitación es el código de retorno, el objectstore siempre devuelve un estado HTTP-201 (CREATED) si el objeto fue persistido. Sin embargo, el proveedor de Terraform sólo busca un HTTP-200 (OK). Ya hay un issue abierto y un pull-request sobre esto, pero ambos llevan años abiertos. Así que no esperaría una solución pronto.

docs del proveedor http