Terraform-Zustand in einem Cloud Storage-Bucket speichern

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. Verwenden Sie den Preisrechner.

Neuen Google Cloud Nutzern vonsteht möglicherweise eine kostenlose Testversion zur Verfügung.

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.

Hinweis

  1. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

    In Cloud Shell ist Terraform vorinstalliert.

  2. Wenn Sie eine lokale Shell verwenden, führen Sie die folgenden Schritte aus:

    • Installieren Sie Terraform.
    • Lokale Anmeldedaten zur Authentifizierung für Ihr Nutzerkonto erstellen:

      gcloud auth application-default login

      Wenn ein Authentifizierungsfehler zurückgegeben wird und Sie einen externen Identitätsanbieter (IdP) verwenden, prüfen Sie, ob Sie sich mit Ihrer föderierten Identität in der gcloud CLI angemeldet haben.

  3. Erstellen Sie ein Google Cloud Projekt oder wählen Sie eines aus.

    Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können ein beliebiges Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die resourcemanager.projects.create Berechtigung enthält. Rollen zuweisen.
    • Projekt erstellen: Google Cloud

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch Ihren Google Cloud Projektnamen.

  4. Prüfen Sie, ob für Ihr Google Cloud Projekt die Abrechnung aktiviert ist.

  5. Aktivieren Sie die Cloud Storage API.

    Erforderliche Rollen zum Aktivieren von APIs

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) mit der serviceusage.services.enable Berechtigung. Rollen zuweisen.

    gcloud services enable storage.googleapis.com
  6. Weisen Sie Ihrem Nutzerkonto Rollen zu. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus: roles/storage.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Ersetzen Sie Folgendes:

    Alternativ können Sie eine benutzerdefinierte IAM-Rolle mit den folgenden Berechtigungen erstellen:

    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.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

  1. Klonen Sie das GitHub-Repository mit Terraform-Beispielen:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  2. Wechseln Sie in das Arbeitsverzeichnis:

    cd terraform-docs-samples/storage/remote_terraform_backend_template
    

Terraform-Dateien prüfen

  1. Prüfen Sie die Datei main.tf.

    cat main.tf
    

    Die Ausgabe sieht etwa so aus:

    resource "random_id" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name     = "${random_id.default.hex}-terraform-remote-backend"
      location = "US"
    
      force_destroy               = false
      public_access_prevention    = "enforced"
      uniform_bucket_level_access = true
    
      versioning {
        enabled = true
      }
    }
    
    resource "local_file" "default" {
      file_permission = "0644"
      filename        = "${path.module}/backend.tf"
    
      # You can store the template in a file and use the templatefile function for
      # more modularity, if you prefer, instead of storing the template inline as
      # we do here.
      content = <<-EOT
      terraform {
        backend "gcs" {
          bucket = "${google_storage_bucket.default.name}"
        }
      }
      EOT
    }

    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_destroy ist auf false gesetzt, 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_prevention ist auf enforced gesetzt, damit der Bucket-Inhalt nicht versehentlich öffentlich zugänglich gemacht wird.
      • uniform_bucket_level_access ist auf true festgelegt, damit der Zugriff auf den Bucket und seinen Inhalt mit IAM-Berechtigungen anstelle von Zugriffssteuerungslisten gesteuert werden kann.
      • versioning ist 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

  1. Initialisieren Sie Terraform:

    terraform init
    

    Wenn Sie terraform init zum ersten Mal ausführen, gibt es den in der Datei main.tf angegebenen Cloud Storage-Bucket noch nicht. Daher initialisiert Terraform ein lokales Backend, um den Status im lokalen Dateisystem zu speichern.

  2. Wenden Sie die Konfiguration an, um die in der Datei main.tf beschriebenen Ressourcen bereitzustellen:

    terraform apply
    

    Geben Sie bei Aufforderung yes ein.

    Wenn Sie terraform apply zum 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

  1. Terraform-Zustand in das Remote-Cloud Storage-Backend migrieren:

    terraform init -migrate-state
    

    Terraform 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 yes ein.

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

Damit Ihrem Konto die auf dieser Seite verwendeten Ressourcen nicht in Rechnung gestellt werden, führen Sie die folgenden Schritte aus. Google Cloud

  1. Öffnen Sie die Datei main.tf.

  2. Aktualisieren Sie in der Ressource google_storage_bucket.default den Wert von force_destroy auf true.

  3. Wenden Sie die aktualisierte Konfiguration an:

    terraform apply
    

    Geben Sie bei Aufforderung yes ein.

  4. Löschen Sie die Statusdatei:

    rm backend.tf
    
  5. Konfigurieren Sie das Backend als lokal neu:

    terraform init -migrate-state
    

    Geben Sie bei Aufforderung yes ein.

  6. Führen Sie den folgenden Befehl aus, um die Terraform-Ressourcen zu löschen:

    terraform destroy
    

    Geben Sie bei Aufforderung yes ein.

Nächste Schritte