Google Cloud-Ressourcen in den Terraform-Zustand importieren

Terraform kann die vorhandene Infrastruktur importieren. Dadurch können Sie Ressourcen, die Sie auf andere Weise erstellt haben, unter Terraform-Verwaltung unterbringen.

Sie können den Status für jede Google Cloud-Ressource importieren.

Terraform unterstützt mehrere Möglichkeiten zum Importieren von Ressourcen:

Ressourcen einzeln importieren

Der Befehl import verwendet zwei Argumente: die Ressourcenadresse und die ID. Die Ressourcenadresse ist eine Kennung, die auf eine Ressourceninstanz innerhalb einer Konfiguration verweist. Die ID ist eine Kennung für eine Ressource in Google Cloud angibt, die importiert wird. Das Format der ID unterscheidet sich je nach Ressourcentyp und wird für jede vom Anbieter unterstützte Ressource dokumentiert. Wir empfehlen die Verwendung der vollständigen Kennung, die die Projekt-ID enthält, sofern sie unterstützt wird.

  • Ermitteln Sie die Ressourcenadresse, die importiert werden soll.

    resource "google_storage_bucket" "sample" {
     name          = "my-bucket"
     project       = "sample-project"
     location      = "US"
     force_destroy = true
    }
    

    Für eine zuvor definierte Beispielressource wie den Cloud Storage-Bucket ist dies google_storage_bucket.sample.

  • Informationen zum Identifizieren des Ressourcen-ID-Formats finden Sie in der Importdokumentation des Anbieters für die Ressource google_storage_bucket. In diesem Fall hat die ID das Format project/name. Die Ressourcen-ID für das vorherige Beispiel lautet also sample-project/my-bucket.

  • Erstellen Sie die import-Anweisung mit der Ressourcenadresse und der ID so:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    

    Ausgabe:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    google_storage_bucket.sample: Importing from ID "sample-project/my-bucket"...
    google_storage_bucket.sample: Import prepared!
    Prepared google_storage_bucket for import
    google_storage_bucket.sample: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

Ressourcen in Modulen importieren

Module kapseln eine oder mehrere Ressourcen in einer Terraform-Konfiguration. Da für den Import eine Ressourcenadresse erforderlich ist, muss jede Ressource innerhalb eines Moduls einzeln importiert werden.

  • Ermitteln Sie die Ressourcen in einem Modul, die importiert werden sollen.

    module "gcs_bucket" {
     source  = "terraform-google-modules/cloud-storage/google//modules/simple_bucket"
     version = "~> 3.4"
    
     name       = "my-bucket"
     project_id = "sample-project"
     location   = "us-east1"
    }
    

    Zum Ermitteln von Ressourcenadressen können Sie den Modulinhalt prüfen. Alternativ können Sie die Konfiguration anwenden und die vom Anbieter angezeigten Fehler verwenden. Beispiel:

    terraform apply
    module.gcs_bucket.google_storage_bucket.bucket: Creating...
    ╷
    │ Error: googleapi: Error 409: Your previous request to create the named bucket succeeded and you already own it., conflict
    │
    │   with module.gcs_bucket.google_storage_bucket.bucket,
    

    Mit dem vorherigen Log können Sie die Ressourcenadresse ermitteln, die als module.gcs_bucket.google_storage_bucket.bucket importiert werden muss.

  • Informationen zum Identifizieren des Ressourcen-ID-Formats finden Sie in der Importdokumentation des Anbieters für die Ressource google_storage_bucket. In diesem Fall hat die ID das Format project/name. Der Name kann über die Planausgabe identifiziert werden.

    Ausgabe:

    module.gcs_bucket.google_storage_bucket.bucket will be created
    + resource "google_storage_bucket" "bucket" {
        + name                        = "my-bucket"
        + project                     = "sample-project"
        ...
      }
    

    Im vorherigen Beispiel lautet die Ressourcen-ID sample-project/my-bucket.

  • Erstellen Sie die import-Anweisung mit der Ressourcenadresse und der ID so:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    

    Ausgabe:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    module.gcs_bucket.google_storage_bucket.bucket: Importing from ID "sample-project/my-bucket"...
    module.gcs_bucket.google_storage_bucket.bucket: Import prepared!
    Prepared google_storage_bucket for import
    module.gcs_bucket.google_storage_bucket.bucket: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

Ressourcen im Bulk mit einem konfigurationsbasierten import-Block importieren

Mit Terraform Version 1.5 können Sie der Terraform-Konfiguration einen import-Block hinzufügen. Dadurch können Importvorgänge während des plan-Vorgangs eine Vorschau angezeigt und mit dem apply-Vorgang ausgeführt werden.

Sie können auch automatisch Code generieren für importierte Ressourcen, anstatt den Code manuell zu schreiben.

Der Block import hat zwei Parameter:

  • id: Die vom Anbieter definierte Ressourcen-ID der Cloud-Ressource, die importiert werden soll.

    Die akzeptierte anbieterdefinierte Ressourcen-ID finden Sie im Abschnitt Importieren für die Ressource in der Dokumentation des HashiCorp-Google-Anbieters. Beispielsweise ist projects/{project}/global/networks/{name} eine Ressourcen-ID für ein VPC-Netzwerk, wie auf der Referenzseite zu google_compute_network dargestellt.

  • to: Die Terraform-Ressourcenadresse, die erstellt werden soll. In der Regel im Format RESOURCE TYPE.NAME.

Hier sehen Sie ein Beispiel für einen import-Block für ein Virtual Private Cloud-Netzwerk:

import {
  # Provider-defined resource ID of the cloud resource to be imported
  id = "projects/PROJECT_ID/global/networks/my-network"

  # Terraform resource address to be created
  to = google_compute_network.my_network
}

Wenn Sie Ihren Ressourcenblock manuell erstellt haben, führen Sie terraform plan aus, um eine Vorschau des Importvorgangs anzeigen zu lassen.

Wenn Terraform die Ressourcenblöcke für Sie generieren soll, geben Sie mit dem Flag -generate-config-out die Datei an, die die Konfiguration generieren soll.

Beispiel:

 terraform plan -generate-config-out=generated_resources.tf

Führen Sie nach der Überprüfung des generierten Codes den Vorgang terraform apply aus, um die Konfiguration in den Terraform-Zustand zu importieren.

Ressourcen importieren, die nach einem Bulk-Export erstellt wurden

Mit dem Bulk-Export können Sie Google Cloud-Ressourcen als Terraform-Konfigurationen exportieren und den Terraform-Zustand für diese Ressourcen importieren, damit Sie Ihre Bereitstellung in Terraform verwalten können.

Hinweis

  • Bereiten Sie Cloud Shell vor.

    Starten Sie Cloud Shell und legen Sie das Google Cloud-Standardprojekt fest, in dem Sie Terraform-Code für die bereitgestellten Ressourcen generieren möchten.

    Sie müssen diesen Befehl nur einmal pro Projekt und in einem beliebigen Verzeichnis ausführen.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Umgebungsvariablen werden überschrieben, wenn Sie in der Terraform-Konfigurationsdatei explizite Werte festlegen.

  • Installieren Sie in Cloud Shell die Befehlszeile für Config Connector.

    gcloud components install config-connector
    

    Mit Config Connector können Sie das Bulk-Exporttool Terraform von Google Cloud verwenden.

    Wenn ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation angezeigt wird, führen Sie stattdessen den folgenden Befehl aus:

    sudo apt-get install google-cloud-sdk-config-connector
    
  • Aktivieren Sie die Cloud Asset API.

    gcloud services enable cloudasset.googleapis.com
    

Terraform-Code für Ihre Ressourcen generieren

  1. Erstellen Sie das Verzeichnis, in dem Sie die Projektkonfiguration ausgeben möchten, falls Sie dies noch nicht getan haben.

    mkdir OUTPUT_DIRECTORY
    
  2. Führen Sie den Befehl gcloud beta resource-config bulk-export aus, um die gesamte Konfiguration des Projekts an den Pfad OUTPUT_DIRECTORY auszugeben:

    gcloud beta resource-config bulk-export \
       --path=OUTPUT_DIRECTORY \
       --project=PROJECT_ID \
       --resource-format=terraform
    

Terraform-Module aus dem generierten Code erstellen

Führen Sie den Befehl gcloud beta resource-config terraform generate-import aus, der auf den Inhalt im Ausgabeverzeichnis verweist:

gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY

Dieser Befehl generiert Terraform-Module und ein Importskript:

  • Die Datei gcloud-export-modules.tf. Diese Datei verweist auf alle Module der Unterressourcen. Der Inhalt dieser Datei sieht so aus:

    provider "google" {
     project = "PROJECT_ID"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeBackendService-global" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeBackendService/global"
    }
    

    ...und so weiter.

  • Ein ausführbares Shell-Skript namens terraform_import_20220331-19-12-33.sh. Das Shell-Skript enthält eine Liste von terraform import-Befehlen:

    #!/bin/sh
    # Terraform Import Script generated by gcloud cli
    
    terraform import module.OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    

    ...und so weiter.

    Die terraform import-Befehle dienen zum Importieren der vom Befehl generate-import erstellten Module in den Terraform-Zustand.

Module in den Terraform-Zustand importieren

  1. Initialisieren Sie sie:

    terraform init
    
  2. Führen Sie das Skript aus:

    ./terraform_import_20220331-19-12-33.sh
    

    Ausgabe:

    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Importing from ID
    "projects/PROJECT_ID/zones/us-central1-a/instances/instance-1"...
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Import prepared!
     Prepared google_compute_instance for import
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Refreshing state...
    [id=projects/PROJECT_ID/zones/us-central1-a/instances/instance-1]
    
    Import successful!
    
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

Nächste Schritte