Wir verwenden Terraform häufig, entweder um unsere eigene Infrastruktur zu testen oder Projekte innerhalb von DownToZero bereitzustellen.
Da DTZ als Provider unterstützt wird, haben wir damit begonnen, Projekte darauf aufzubauen. Ein Thema, das regelmäßig aufkam, ist der Ort der State-Datei. Den State im Git-Repo zu speichern ist normalerweise keine gute Idee (obwohl es immer noch besser ist als lokal zu bleiben), aber eine Art von Remote-State hilft sehr dabei, Terraform in Pipelines auszuführen und den State unabhängig vom Projekt zu machen.
Wenn man sich unsere Optionen für Remote State ansieht, gibt es eine ziemlich lange Liste. Leider sind die meisten davon an Cloud-Provider gebunden, was für uns momentan nicht wirklich hilfreich ist. Es gibt jedoch den generischen http Backend-Provider.
Beim Blick auf diesen Provider haben wir festgestellt, dass wir ihn nutzen können, um eine Verbindung zu unserem Objectstore herzustellen und unser eigenes System zur Persistenz der State-Datei verwenden können.
Und so würde das aussehen.
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
}
}
Leider funktioniert das Locking nicht, da es einige Implementierungsdetails gibt, die mit unserem Objectstore nicht kompatibel sind.
Der Objectstore unterstützt die HTTP-Methoden LOCK und UNLOCK nicht (obwohl dies im Provider anpassbar ist).
Eine weitere Einschränkung ist der Rückgabe-Statuscode, der Objectstore liefert immer einen HTTP-201 (CREATED) Status, wenn das Objekt gespeichert wurde. Der Terraform-Provider erwartet jedoch nur HTTP-200 (OK). Es gibt bereits ein offenes Issue und Pull-Request dazu, aber beide sind seit Jahren offen. Daher ist in nächster Zeit keine Lösung zu erwarten.