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:
- Einzelne Schritte mit dem Unterbefehl
terraform import
. - Im Bulk durch Einfügen eines
import
-Blocks in die Konfiguration (erfordert Terraform-Version 1.5 oder höher). - Über ein Google Cloud-Feature, mit dem Sie Ressourcen nach einem Bulk-Export importieren können.
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 Formatproject/name
. Die Ressourcen-ID für das vorherige Beispiel lautet alsosample-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. Beispiele:
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 Formatproject/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 zugoogle_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-Status 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-Status für diese Ressourcen importieren, sodass 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
Erstellen Sie das Verzeichnis, in dem Sie die Projektkonfiguration ausgeben möchten, falls Sie dies noch nicht getan haben.
mkdir OUTPUT_DIRECTORY
Führen Sie den Befehl
gcloud beta resource-config bulk-export
aus, um die gesamte Konfiguration des Projekts an den PfadOUTPUT_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 vonterraform 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 Befehlgenerate-import
erstellten Module in den Terraform-Status.
Module in den Terraform-Status importieren
Initialisieren Sie sie:
terraform init
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.