Utilizzo di DTZ Objectstore per i file di stato di Terraform

created: sabato, set 28, 2024

Usiamo molto Terraform sia per testare la nostra infrastruttura che per distribuire progetti all’interno di DownToZero.

Dal momento che DTZ è supportato come provider abbiamo iniziato a implementare progetti basati su di esso. Una cosa che ricorre regolarmente è la posizione del file di stato. Verificare lo stato nel repository git di solito non è una buona idea (anche se è comunque meglio che tenerlo localmente), ma avere una qualche forma di stato remoto aiuta molto nell’esecuzione di TF nelle pipeline e nel rendere lo stato indipendente dal progetto.

Guardando le nostre opzioni per lo stato remoto, ce ne sono parecchie. Purtroppo la maggior parte sono legate a provider cloud, cosa che al momento non è di grande aiuto per noi. Esiste però il provider backend generico http.

Osservando questo provider abbiamo scoperto che possiamo usarlo per connetterci al nostro objectstore e utilizzare il nostro sistema per conservare il file di stato.

Ecco come apparirebbe.

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
  }
}

Purtroppo il locking non funziona, poiché presenta alcuni dettagli di implementazione non compatibili con il nostro objectstore.

L’objectstore non supporta i metodi http LOCK, UNLOCK (anche se questo è modificabile nel provider).

L’altra limitazione è il codice di ritorno: l’objectstore restituisce sempre uno status HTTP-201 (CREATED) se l’oggetto è stato salvato. Il provider terraform invece si aspetta solo un HTTP-200 (OK). Esiste già una issue aperta e una pull request in merito, ma sono in sospeso da anni. Quindi non mi aspetto una soluzione a breve.

documentazione provider http