Kürzlich musste ich ein “gewachsenes” Terraform Deployment in mehrere neue Deployments aufteilen, bestehende Ressourcen und Module aus dem Terraform State “herauslösen” und sie verschieben, ohne die realen Azure-Ressourcen zu verändern.
Hinweis: es ist natürlich möglich (und empfohlen), Ressourcen mit remove
- und import
-Blöcken zwischen Deployments zu “verschieben” - siehe Removing Resources und Import. Bei Modulen, welche aus mehreren bzw. mehreren hundert Ressourcen bestehen ist die unten beschriebene Methode jedoch wesentlich schneller.
Vorbereitung
Zuerst müssen wir zwei Deployments vorbereiten:
- Ein
source
-Deployment als Quelle für Module und Ressouren, die migriert werden sollen. - Ein
destination
-Deployment als Ziel für die Migration.
Das destination
-Deployment sollte im Besten Fall bereits ausführbar sein und kann optional auch eigene Ressourcen enthalten.
Remote states herunterladen
Da meine Deployments mit Remote state arbeiten muss ich zuerst die “state” Dateien herunterladen. Zuerst den source
state herunterladen…
cd /deployments/source-deployment
terraform state pull > source.tfstate
… und anschließend den destination
state:
cd /deployments/destination-deployment
terraform state pull > destination.tfstate
Module und Ressourcen im Terraform STATE verschieben
Wir können jetzt den Befehl terraform state mv
verwenden, um Ressourcen und ganze Module vom source
- in den destination
-State zu verschieben. Im selben Schritt können Objekte optional auch umbenannt werden:
cd /deployments
terraform state mv -state=".\source-deployment\source.tfstate" -state-out=".\destination-deployment\destination.tfstate" module.some_module module.some_module
terraform state mv -state=".\source-deployment\source.tfstate" -state-out=".\destination-deployment\destination.tfstate" module.old_name module.new_name
Module und Ressourcen im Terraform CODE verschieben
Natürlich müssen wir die Änderungen auch im Terraform code nachziehen und den Code aller verschobenen Module/Ressourcen aus den .tf Dateien im source
-Deployment entfernen. Im Code des destination
-Deployments müssen dieselben Ressourcen natürlich angelegt werden. In meinem Fall konnten wir einfach die betroffenen .tf-Dateien ins destination
-Verzeichnis verschieben.
Bitte beachte, dass Referenzen auf die so verschobenen Ressourcen und Module im source
-Deployment natürlich nicht automatisch aktualisiert bzw. korrigiert werden.
Remote states hochladen
Zuletzt müssen wir unsere “state” Dateien wieder hochladen:
cd /deploynts/source-deployment
terraform state push ./source.tfstate
cd /deployments/destination-deployment
terraform state push ./destination.tfstate
Quellen
- Moving Resources > state mv