Eine kurze Anleitung, um Terraform Module in einem Deployment in ein anderes zu verschieben.

Terraform Deployments aufteilen


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