Blog
Refactoring von Terraform mit ein wenig Hilfe von Python

Terraform bietet Ihnen eine gute Möglichkeit, Ihre Cloud-Ressourcen zu orchestrieren. Sie können damit mehrere Ressourcen in wiederverwendbaren Modulen oder sogar in separaten Terraform-Läufen organisieren, wobei die Datenressource als Klebstoff dient.
Instandhaltbarkeit
Wie bei jedem Code kann es eine Herausforderung sein, ihn zu pflegen, damit er nicht zum schlimmsten Albtraum für andere oder für Sie selbst wird. Normalerweise verschiebe ich Ressourcen genauso oft wie ich sie erstelle.
Besonders zu Beginn eines Projekts oder Produkts, wenn Sie viele Ressourcen erstellen. Die Anforderungen ändern sich im Laufe der Zeit und die Veränderung der Infrastruktur ist die Folge.
Refactoring
Nach einiger Zeit stelle ich in der Regel fest, dass einige Ressourcen in einem anderen Modul oder sogar in einem anderen Terraform-Lauf besser aufgehoben wären. Der Vorteil der Cloud ist, dass Sie alles unveränderlich machen können, also einfach alles wegwerfen, könnte man sagen. Aber es ist nicht immer bequem, dies mit der unveränderlichen Denkweise zu tun.
Einfach zerstören und neu erstellen ist in verschiedenen Fällen nicht erwünscht, zum Beispiel:
VPN-Verbindungen mit bereits gemeinsam genutzten Schlüsseln, gemeinsam genutzte VPC, von denen viele Instanzen abhängen, Komponenten, die in live laufenden Anwendungen verwendet werden, oder Ressourcen, deren Erstellung einfach ewig dauert und auf die Sie nicht warten möchten.
Beispiel: Manuelles Ändern des Status
- Sie lassen es für Dev arbeiten.
- Dann brauchen Sie eine Testumgebung, aus der Sie ein Modul erstellen und 2 Versionen bereitstellen.
- Einige Zeit später geht die Sache in der Entwicklungsabteilung kaputt und Ihr Status in der Testumgebung ist blockiert.
- Sie möchten eine env-Datei an einen anderen Speicherort der Statusdatei verschieben.
Dies ist eine recht einfache Aufgabe, die Sie mit state move erledigen können.
Usage: terraform state mv [options] SOURCE DESTINATION
Wenn Sie nur 1 oder 2 Ressourcen verschieben, ist das völlig in Ordnung, aber wenn Sie mehr ändern, kann das zu ernsthaften Kopfschmerzen führen. Tippfehler können seltsame Dinge bewirken. Auch hier ist Automatisierung Ihr Freund.
Wie Sie viele Änderungen automatisieren
Wenn Sie mehrere Ressourcen verschieben, ist ein Skript zum Extrahieren der Konfiguration einfacher und weniger fehleranfällig.
Terraform verwendet HCL, eine Konfigurationssprache, die von HashiCorp entwickelt wurde. Die Sprache wurde mit dem Ziel entwickelt, sowohl menschen- als auch maschinenfreundlich zu sein.
Dank des python-hcl2 Python-Pakets können wir die Struktur leicht lesen und Terraform-Befehle für die Kommandozeile erzeugen.
TL;DR;
Ich möchte einfach nur Ressourcen an andere Speicherorte verschieben, ohne sie neu erstellen zu müssen und ohne alle Ressourcennamen eingeben zu müssen.
Installation der virtuellen Umgebung und der Abhängigkeiten in einem Verzeichnis Ihrer Wahl:
virtualenv -p python3 venv
. venv/bin/activate
pip install fire python-hcl2
Kopieren Sie das zu verwendende Skript:
import fire
import hcl2
class Parser():
def hcl2(self, file, state="terraform.tfstate", state_out="to.tfstate"):
with(open(file, 'r')) as file:
dict = hcl2.load(file)
for modules in dict.get("module", []):
for module in modules.keys():
print(modules.keys())
print(f"terraform state mv -state {state} -state-out {state_out} module.{module} module.{module}")
for resources in dict.get("resource", []):
for resource in resources.keys():
for resource_name in resources[resource].keys():
print(
f"terraform state mv -state={state} -state-out={state_out} {resource}.{resource_name} {resource}.{resource_name}")
if __name__ == '__main__':
fire.Fire(Parser)
python ~/parse.py hcl2 src/saml-roles.tf
Erzeugt den mv-Befehl für terraform, der verwendet werden soll. Wenn Sie ihn an die Bash (python ~/parse.py hcl2 src/saml-roles.tf | bash) weiterleiten, wird der Umzug sofort ausgeführt,
terraform state mv -state terraform.tfstate -state-out to.tfstate module.iam module.iam
terraform state mv -state=terraform.tfstate -state-out=to.tfstate aws_vpc.this aws_vpc.this
…
terraform state mv -state=terraform.tfstate -state-out=to.tfstate aws_default_vpc.this aws_default_vpc.this
Fazit
Das Ziel von all dem ist, dass Sie sich bei der Änderung der Ressourcenorganisation wohler fühlen. Wenn Sie Infra als Code nicht sauber halten, könnte es sein, dass Sie sich selbst in den Fuß schießen.
Wenn Sie das nicht erschreckt, tun Sie es bitte für Ihre Teammitglieder. Ich hoffe, das Skript hilft Ihnen. Terraform bietet eine einfache Möglichkeit, Ressourcen zu verschieben, und die Verwendung dieser Funktion hält Ihre Infrastrukturautomatisierung in Form.
Verfasst von

Thijs de Vries
Unsere Ideen
Weitere Blogs
Contact



