Uso de 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 provider comenzamos a implementar proyectos sobre él. Una cuestión 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 sigue siendo mejor que mantenerlo local), pero tener alguna forma de estado remoto ayuda mucho al ejecutar TF en pipelines y hacer que el estado sea independiente del proyecto.

Al analizar nuestras opciones para remote state, hay una gran lista detrás de esto. Lamentablemente, la mayoría están vinculadas a proveedores en la nube, lo cual no nos es realmente útil en este momento. Sin embargo, existe el proveedor genérico http para backend.

Al examinar este proveedor encontramos que podemos usarlo para conectarnos a nuestro objectstore y usar nuestro propio sistema para persistir el archivo de estado.

Y así es como 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 y 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 solo espera un HTTP-200 (OK). Ya existe un issue abierto y una solicitud de extracción sobre esto, pero ambos han estado abiertos por años. Así que no esperaría una solución para esto en el corto plazo.

http provider docs