Getty Images/iStockphoto
Multiple Umgebungen mit Terraform Workspaces verwalten
Mit Terraform Workspaces können DevOps-Teams Konfigurationen für verschiedene Umgebungen zentral verwalten. Lernen Sie in diesem Artikel, wie Sie mit Workspaces arbeiten können.
Terraform ist ein beliebtes Tool für die Bereitstellung von Infrastruktur und die Verwaltung ihrer Konfiguration. Dank der Fähigkeit von Terraform, Anwendungskonfigurationen im Code zu erfassen, können Sie Ihre Infrastruktur jederzeit auf genau dieselbe Konfiguration zurücksetzen.
Dies ist ideal für die Aufrechterhaltung des gewünschten Zustands Ihrer Produktionsumgebung, aber was ist mit anderen Umgebungen? Wenn Sie zum Beispiel Ihre Anwendung in einer Staging- oder Entwicklungsumgebung testen, bevor Sie sie in die Produktion überführen, möchten Sie vielleicht die Produktionsumgebung in diesen Umgebungen spiegeln, ohne Ihren Code zu ändern.
Workspaces sind ein eingebautes Terraform-Feature, mit dem Sie die gleiche Konfiguration für jede Umgebung wiederverwenden können. Dies macht Workspaces zu einem unschätzbaren Werkzeug für DevOps-Teams, die mit mehreren Umgebungen arbeiten.
Wenn Sie beispielsweise eine Anwendungsinfrastruktur über eine CI/CD-Pipeline bereitstellen, können Sie Workspaces verwenden, um einen neuen Satz von Ressourcen für Tests bereitzustellen, ohne Ihre Produktionsressourcen zu verwenden. Oder wenn Sie ein Problem beheben müssen, ohne andere Ressourcen zu beeinträchtigen, können Sie Ihren Code in einem neuen Workspace (Arbeitsbereich) bereitstellen und dann die Testumgebung aus dem Workspace zerstören.
Wie State in Terraform funktioniert
Da der State (Zustand) der Schlüssel zur Funktion von Workspaces ist, ist es hilfreich zu verstehen, was genau ein Status in Terraform ist, bevor man sich mit Workspaces beschäftigt.
Terraform-Konfigurationen werden als eine oder mehrere Dateien in einem einzigen Verzeichnis gespeichert. Sie können die HashiCorp Configuration Language (HCL) verwenden, um Ressourcen von einem oder mehreren Anbietern wie AWS, Google Cloud oder Microsoft Azure zu konfigurieren.
Wenn Sie die Befehle terraform plan oder terraform apply ausführen, prüft Terraform die in Ihrer HCL konfigurierten Ressourcen mit den im Terraform State enthaltenen Ressourcen. Wenn sich die in Ihrem Terraform-Status definierten Ressourcen von Ihrer Infrastruktur unterscheiden, fragt Terraform Sie, ob Sie die Änderungen auf die Ressourcen in Ihrem Konto anwenden möchten, und speichert dann die neue Konfiguration der mit Terraform erstellten Ressourcen im Status.
Erste Schritte mit Terraform Workspaces
Um diesem Ratgeber folgen zu können, benötigen Sie folgendes:
- Ein Linux- oder macOS-Gerät mit installiertem Terraform. Die Demos in diesem Artikel verwenden Terraform Version 1.4.5.
- Ein AWS-Konto mit konfigurierten Anmeldedaten. Obwohl diese Demo AWS verwendet, sind Workspaces nicht auf einen bestimmten Cloud-Anbieter beschränkt. Da sie ein Sprachkonstrukt sind, können Sie sie in jeder Terraform-Konfiguration und bei jedem Anbieter verwenden.
Um zu beginnen, erstellen Sie ein neues Verzeichnis namens workspace und eine neue Terraform-Datei namens main.tf, indem Sie die folgenden Bash-Befehle ausführen. Diese Datei und dieses Verzeichnis werden Ihre Konfiguration enthalten.
mkdir workspace
cd workspace
touch main.tf
Als nächstes geben Sie die folgende Konfiguration in Ihre main.tf-Datei ein.
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualisierungs-typ"
values = ["hvm"]
}
Owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = {
Name = "HelloWorld"
}
}
Obwohl dieses Beispiel aus der Terraform AWS-Provider-Dokumentation für die Erstellung einer Amazon Elastic Compute Cloud (EC2)-Instanz stammt, können Sie auch andere Ressourcen erstellen, wenn Sie dies wünschen. Sobald Ihre Konfigurationsdatei gespeichert ist, führen Sie den Befehl terraform init in Ihrem Konfigurationsverzeichnis aus.
Sie werden es vielleicht gar nicht bemerken, aber Sie benutzen bereits einen Terraform-Workspace. Wenn Sie den Befehl terraform init ausführen, werden Sie in einem Workspace namens default platziert - nun, standardmäßig. Um dies zu überprüfen, können Sie den Namen des Workspace mit folgendem Befehl anzeigen.
terraform workspace show
Wenn Sie nun den Befehl terraform apply ausführen, wird eine EC2-Instanz mit dem Namens-Tag HelloWorld unter Verwendung des Standard-Workspace bereitgestellt, der in der Terraform state file (Statusdatei) dieses Workspace gespeichert ist. Wenn Sie das nächste Mal den Befehl terraform apply ausführen, prüft Terraform diese Zustandsdatei und vergleicht die Ressourcen mit denen, die in Ihrem AWS-Konto bereitgestellt werden.
Da HelloWorld kein guter Name für eine Instanz ist, die in der Produktion läuft - oder in einer anderen Umgebung - ändern Sie die Zeile mit dem Namens-Tag in Ihrer Konfiguration so, dass sie dem folgenden Code entspricht.
Name = "${terraform.workspace}-instance"
Diese Änderung ermöglicht es Terraform, den Namen des Workspace zu lesen und ihn in Ihrer Konfiguration zu referenzieren. Führen Sie den Befehl terraform apply aus, um eine Instanz mit dem Namen default-instance zu erstellen, wie in Abbildung 1 gezeigt.
Einen neuen Terraform Workspace erstellen
Wenn Sie terraform plan oder terraform apply ausführen, erhalten Sie eine Meldung, die besagt, dass keine Änderungen notwendig sind und Ihre Konfiguration mit Ihrer Infrastruktur übereinstimmt, was bedeutet, dass sie mit der Infrastruktur in der Statusdatei unter dem Standard-Workspace übereinstimmt.
Erstellen Sie einen neuen Workspace für Ihre Staging-Umgebung, indem Sie den folgenden Befehl ausführen.
terraform workspace new staging
Führen Sie anschließend erneut terraform workspace show aus. Sie sollten nun sehen, dass ein neuer Workspace erstellt wurde und Sie nicht mehr den Standard-Workspace verwenden.
Terraform Workspaces erzeugen nicht nur einen neuen Namen, auf den Sie verweisen können, sie enthalten auch ihre eigenen isolierten Statusdateien. Das bedeutet, dass jede Umgebung die gleichen Konfigurationsdateien verwenden kann, aber der Status, der festhält, welche Ressourcen eingesetzt werden, ist für jeden Workspace separat.
Wenn Sie terraform plan oder terraform apply erneut ausführen, nachdem Sie den neuen Staging Workspace erstellt haben, stimmt die Infrastruktur nicht mehr überein. Stattdessen wird eine neue Instanz mit dem Namen staging-instanceerstellt. Obwohl Sie immer mit dem Standard-Workspace beginnen, können Sie so viele Workspaces anlegen, wie Sie wollen, und sie sind mit den meisten Terraform-Backends kompatibel.
Um alle Workspaces zu sehen, die Sie erstellt haben, führen Sie den Befehl terraform workspace list aus, um eine vollständige Liste der Workspaces für Ihr Konfigurationsverzeichnis zu erhalten. Sie sind in Ihrem Remote-Backend gespeichert, wenn Sie eines verwenden, oder im Terraform-Datenverzeichnis, wenn Sie keines verwenden.
Wenn Sie es noch nicht getan haben, wenden Sie die Konfiguration für die staging-instance an. Kehren Sie dann zum Standard-Workspace zurück, indem Sie den folgenden Befehl ausführen.
terraform workspace select default
Nun, da Sie wieder im Standard-Workspace sind, wie in Abbildung 2 gezeigt, können Sie Änderungen an der Infrastruktur in diesem Workspace vornehmen oder ihn sogar ganz zerstören, ohne die Ressourcen im anderen Workspace zu beeinträchtigen.
Führen Sie terraform destroy aus, nachdem Sie den Standard-Workspace ausgewählt haben, und überprüfen Sie dann, ob die Staging-Instanzen noch vorhanden sind.
Ändern von Parametern basierend auf Workspace
In einem realen Szenario kann es vorkommen, dass Sie Änderungen zwischen Produktions- und Staging-Umgebungen vornehmen wollen. Sie könnten zum Beispiel eine größere Instanz in der Produktionsumgebung benötigen, um den gesamten Datenverkehr zu bewältigen, aber nur eine kleine Instanz in der Staging-Umgebung, damit Sie mit einer weniger teuren Instanz testen können.
In Terraform können Sie diese Umgebungen mit denselben Konfigurationsdateien verwalten. Gehen Sie zurück zu Ihrer Datei main.tf und ändern Sie den Parameter instance_type auf den unten dargestellten Wert.
instance_type = terraform.workspace == "production" ? "t3.large" : "t3.micro"
Wählen Sie nun Ihren Staging-Workspace aus und führen Sie den Befehl terraform apply erneut aus. Da Sie sich nicht im Produktions-Workspace befinden, sollte es keine Änderungen geben.
Führen Sie den Befehl terraform workspace new production aus, und wiederholen Sie dann den Befehl terraform applyaus dem neu erstellten Produktions-Workspace. Sie sollten nun zwei verschiedene Instanzen haben, wie in Abbildung 3 gezeigt: eine t3.micro Instanz mit dem Tag staging und eine t3.large Instanz mit dem Tag production.
Die Verwendung von terraform.workspace als Schlüssel zum Erstellen von Bedingungen in Ihrer Konfiguration ermöglicht es Ihnen, Konfigurationsänderungen in verschiedenen Umgebungen mit denselben Dateien vorzunehmen. Sie können diese Funktion nutzen, um Unterschiede zwischen Ihren Umgebungen zu finden - zum Beispiel verschiedene virtuelle Private Clouds, Instanzklassen oder Sicherheitsgruppenregeln.
Wenn Sie mit den Ressourcen, die Sie in dieser Demo erstellt haben, fertig sind, führen Sie den Befehl terraform destroyaus, um sie zu entfernen. Da jeder Workspace seine eigene unabhängige Statusdatei hat, müssen Sie dies für jeden Workspace, den Sie erstellt haben, einmal tun.