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 para desplegar proyectos dentro de DownToZero.

Dado que DTZ es compatible como proveedor, empezamos a implementar proyectos sobre él. Una cosa que surgía regularmente es la ubicación del archivo de estado. Comprobar el estado en el repositorio git por lo general no es una buena idea (aunque aún es mejor que mantenerlo local), pero tener algún tipo de estado remoto ayuda mucho a ejecutar Terraform en pipelines y a hacer que el estado sea independiente del proyecto.

Al revisar nuestras opciones para el estado remoto, hay una buena lista. Lamentablemente la mayoría están vinculadas a proveedores en la nube, lo cual no nos es muy útil en este momento. Sin embargo, existe el proveedor de backend genérico http.

Al revisar este proveedor descubrimos que podemos usarlo para conectar con nuestro objectstore y utilizar 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, UNLOCK (aunque esto es ajustable en el proveedor).

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

documentación del proveedor http