Wir verwenden Terraform häufig, sei es zum Testen unserer eigenen Infrastruktur oder zum Bereitstellen von Projekten innerhalb von DownToZero.
Da DTZ als Provider unterstützt wird, haben wir begonnen, Projekte darauf aufzubauen. Ein Thema, das regelmäßig aufkam, ist der Standort der Statusdatei. Den Status im Git-Repository zu prüfen ist normalerweise keine gute Idee (obwohl es immer noch besser ist, als ihn lokal zu behalten), aber eine Art Remote-State hilft enorm dabei, Terraform in Pipelines auszuführen und den Status unabhängig vom Projekt zu machen.
Wenn man sich unsere Optionen für Remote State ansieht, gibt es eine ganz schöne 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.
Bei Prüfung dieses Providers haben wir festgestellt, dass wir diesen verwenden können, um eine Verbindung zu unserem Objectstore herzustellen und unser eigenes System zum Persistieren der Statusdatei zu nutzen.
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 Sperren nicht, da es einige Implementierungsdetails gibt, die mit unserem Objectstore nicht kompatibel sind.
Der Objectstore unterstützt nicht die HTTP-Methoden LOCK
, UNLOCK
(obwohl dies im Provider anpassbar ist).
Die andere Einschränkung ist der Rückgabecode: Der Objectstore gibt immer den HTTP-201 (CREATED) Status zurück, wenn das Objekt gespeichert wurde. Der Terraform-Provider erwartet jedoch nur HTTP-200 (OK). Es gibt bereits ein offenes Issue und einen Pull-Request dazu, aber beide sind seit Jahren offen. Daher würde ich nicht damit rechnen, dass dies in absehbarer Zeit behoben wird.