In dieser Anleitung erfahren Sie, wie Sie den Terraform-Zustand in einem Cloud Storage-Bucket speichern.
Standardmäßig speichert Terraform den Status lokal in einer Datei mit dem Namen terraform.tfstate. Diese Standardkonfiguration kann die Verwendung von Terraform für Teams erschweren, wenn mehrere Nutzer Terraform gleichzeitig ausführen und jeder Computer ein eigenes Verständnis der aktuellen Infrastruktur hat.
Um solche Probleme zu vermeiden, erfahren Sie auf dieser Seite, wie Sie einen Remotestatus konfigurieren, der auf einen Cloud Storage-Bucket verweist. Der Remote-Status ist ein Feature von Terraform-Back-Ends.
Ziele
In dieser Anleitung wird Folgendes beschrieben:
- Stellen Sie mit Terraform einen Cloud Storage-Bucket bereit, um den Terraform-Zustand zu speichern.
- Fügen Sie der Terraform-Konfigurationsdatei Vorlagen hinzu, um den Status vom lokalen Backend in den Cloud Storage-Bucket zu migrieren.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Für Cloud Storage fallen Kosten für Speicher, Lese- und Schreibvorgänge, ausgehenden Netzwerktraffic und die Replikation an.
Für den Cloud Storage-Bucket in dieser Anleitung ist die Objektversionsverwaltung aktiviert, um den Verlauf Ihrer Bereitstellungen zu speichern. Durch das Aktivieren der Objektversionsverwaltung werden die Speicherkosten erhöht. Dies können Sie umgehen, indem Sie die Verwaltung des Objektlebenszyklus so konfigurieren, dass alte Statusversionen gelöscht werden.
Hinweise
-
In the Google Cloud console, activate Cloud Shell.
In Cloud Shell ist Terraform vorinstalliert.
Wenn Sie eine lokale Shell verwenden, führen Sie die folgenden Schritte aus:
- Installieren Sie Terraform.
-
Create local authentication credentials for your user account:
gcloud auth application-default login
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Storage API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable storage.googleapis.com
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/storage.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Replace the following:
PROJECT_ID: Your project ID.USER_IDENTIFIER: The identifier for your user account. For examples, see Represent workforce pool users in IAM policies.ROLE: The IAM role that you grant to your user account.
Alternativ können Sie eine benutzerdefinierte IAM-Rolle mit den folgenden Berechtigungen erstellen:
storage.buckets.createstorage.buckets.liststorage.objects.getstorage.objects.createstorage.objects.deletestorage.objects.update
Als Best Practice empfehlen wir, dass der Zugriff auf den Bucket und die dort gespeicherten Statusdateien kontrolliert werden. Nur eine kleine Gruppe von Nutzern (z. B. der Haupt-Cloud-Administrator und die Person, die als alternativer oder Sicherungsadministrator fungiert) sollte Administratorberechtigungen für den Bucket haben. Die anderen Entwickler sollten nur Berechtigungen zum Schreiben und Lesen von Objekten im Bucket haben.
Umgebung vorbereiten
Klonen Sie das GitHub-Repository mit Terraform-Beispielen:
git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branchWechseln Sie in das Arbeitsverzeichnis:
cd terraform-docs-samples/storage/remote_terraform_backend_template
Terraform-Dateien prüfen
Prüfen Sie die Datei
main.tf.cat main.tfDie Ausgabe sieht etwa so aus:
In dieser Datei werden die folgenden Ressourcen beschrieben:
random_id: Dieser wird an den Namen des Cloud Storage-Buckets angehängt, um einen eindeutigen Namen für den Cloud Storage-Bucket zu gewährleisten.google_storage_bucket: Der Cloud Storage-Bucket, in dem die Statusdatei gespeichert werden soll. Dieser Bucket ist so konfiguriert, dass er die folgenden Eigenschaften hat:force_destroyist auffalsegesetzt, damit der Bucket nicht gelöscht wird, wenn sich Objekte darin befinden. So wird verhindert, dass die Statusinformationen im Bucket versehentlich gelöscht werden.public_access_preventionist aufenforcedgesetzt, damit der Bucket-Inhalt nicht versehentlich öffentlich zugänglich gemacht wird.uniform_bucket_level_accessist auftruefestgelegt, damit der Zugriff auf den Bucket und seinen Inhalt mit IAM-Berechtigungen anstelle von Zugriffssteuerungslisten gesteuert werden kann.versioningist aktiviert, damit frühere Versionen des Status im Bucket erhalten bleiben.
local_file: Eine lokale Datei. Der Inhalt dieser Datei weist Terraform an, den Cloud Storage-Bucket als Remote-Back-End zu verwenden, sobald der Bucket erstellt wurde.
Cloud Storage-Bucket bereitstellen
Initialisieren Sie Terraform:
terraform initWenn Sie
terraform initzum ersten Mal ausführen, gibt es den in der Dateimain.tfangegebenen Cloud Storage-Bucket noch nicht. Daher initialisiert Terraform ein lokales Backend, um den Status im lokalen Dateisystem zu speichern.Wenden Sie die Konfiguration an, um die in der Datei
main.tfbeschriebenen Ressourcen bereitzustellen:terraform applyGeben Sie bei Aufforderung
yesein.Wenn Sie
terraform applyzum ersten Mal ausführen, stellt Terraform den Cloud Storage-Bucket für das Speichern des Zustands bereit. Außerdem wird eine lokale Datei erstellt. Der Inhalt dieser Datei weist Terraform an, den Cloud Storage-Bucket als Remote-Backend zum Speichern des Status zu verwenden.
Status in einen Cloud Storage-Bucket migrieren
Terraform-Zustand in das Remote-Cloud Storage-Backend migrieren:
terraform init -migrate-stateTerraform erkennt, dass Sie bereits eine Statusdatei lokal haben, und fordert Sie auf, den Status in den neuen Cloud Storage-Bucket zu migrieren. Geben Sie bei Aufforderung
yesein.
Nach der Ausführung dieses Befehls wird der Terraform-Zustand im Cloud Storage-Bucket gespeichert. Terraform ruft den letzten Status aus diesem Bucket ab, bevor ein Befehl ausgeführt wird, und überträgt den neuesten Status nach Ausführung eines Befehls an den Bucket.
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Projekt löschen
Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud -Konto die auf dieser Seite verwendeten Ressourcen in Rechnung gestellt werden:
Öffnen Sie die Datei
main.tf.Aktualisieren Sie in der Ressource
google_storage_bucket.defaultden Wert vonforce_destroyauftrue.Wenden Sie die aktualisierte Konfiguration an:
terraform applyGeben Sie bei Aufforderung
yesein.Löschen Sie die Statusdatei:
rm backend.tfKonfigurieren Sie das Backend als lokal neu:
terraform init -migrate-stateGeben Sie bei Aufforderung
yesein.Führen Sie den folgenden Befehl aus, um die Terraform-Ressourcen zu löschen:
terraform destroyGeben Sie bei Aufforderung
yesein.
Nächste Schritte