Terraform peut importer l'infrastructure existante. Cela vous permet de récupérer les ressources que vous avez créées par d'autres moyens et de les gérer sous Terraform.
Vous pouvez importer l'état de n'importe quelle ressource Google Cloud.
Terraform propose plusieurs méthodes d'importation de ressources :
- Une par une à l'aide de la sous-commande
terraform import
. - De manière groupée en incluant un bloc
import
dans la configuration (nécessite la version 1.5 ou ultérieure de Terraform). - De manière groupée à l'aide d'une fonctionnalité Google Cloud qui vous permet d'importer des ressources après avoir effectué une exportation groupée.
Importer des ressources une par une
La commande import
prend deux arguments : l'adresse de la ressource et l'ID.
L'adresse de ressource est un identifiant qui pointe vers une instance de ressource dans une configuration.
L'ID est un identifiant qui identifie une ressource en cours d'importation dans Google Cloud. Le format de l'ID varie en fonction du type de ressource et est documenté pour chaque ressource acceptée par le fournisseur. Nous vous recommandons d'utiliser l'identifiant complet, qui inclut l'ID du projet lorsqu'il est compatible.
Identifiez l'adresse de la ressource à importer.
resource "google_storage_bucket" "sample" { name = "my-bucket" project = "sample-project" location = "US" force_destroy = true }
Pour un exemple de ressource telle qu'un bucket Cloud Storage défini précédemment, il s'agit de
google_storage_bucket.sample
.Pour identifier le format de l'ID de ressource, consultez la documentation sur l'importation du fournisseur pour la ressource
google_storage_bucket
. Dans ce cas, il s'agit deproject/name
. L'ID de ressource de l'exemple précédent est doncsample-project/my-bucket
.Créez l'instruction
import
à l'aide de l'adresse et de l'ID de la ressource, comme suit :terraform import google_storage_bucket.sample sample-project/my-bucket
Résultat :
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.
Importer des ressources dans des modules
Les modules encapsulent une ou plusieurs ressources au sein d'une configuration Terraform. Comme l'importation nécessite une adresse de ressource, chaque ressource d'un module doit être importée individuellement.
Identifiez les ressources d'un module à importer.
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" }
Pour identifier les adresses de ressources, vous pouvez inspecter le contenu du module. Vous pouvez également appliquer la configuration et utiliser les erreurs identifiées par le fournisseur. Exemple :
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,
À l'aide du journal précédent, vous pouvez identifier l'adresse de la ressource à importer en tant que
module.gcs_bucket.google_storage_bucket.bucket
.Pour identifier le format de l'ID de ressource, consultez la documentation sur l'importation du fournisseur pour la ressource
google_storage_bucket
. Dans ce cas, il s'agit deproject/name
. Vous pouvez identifier le nom dans le résultat du plan.Sortie :
module.gcs_bucket.google_storage_bucket.bucket will be created + resource "google_storage_bucket" "bucket" { + name = "my-bucket" + project = "sample-project" ... }
Dans l'exemple précédent, l'ID de ressource est
sample-project/my-bucket
.Créez l'instruction
import
à l'aide de l'adresse et de l'ID de la ressource, comme suit :terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
Résultat :
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.
Importer des ressources de manière groupée avec un bloc import
basé sur la configuration
La version 1.5 de Terraform vous permet d'ajouter un bloc import
à votre configuration Terraform. Cela permet d'afficher un aperçu des opérations d'importation pendant l'opération plan
et de les exécuter à l'aide de l'opération apply
.
Vous pouvez également effectuer une génération automatique de code pour les ressources importées au lieu d'écrire le code manuellement.
Le bloc import
prend deux paramètres :
id
: ID de ressource défini par le fournisseur de la ressource cloud à importer.Pour obtenir l'ID de ressource accepté par le fournisseur, consultez la section Importer pour la ressource dans la documentation du fournisseur Google de HashiCorp. Par exemple,
projects/{project}/global/networks/{name}
est un ID de ressource pour un réseau VPC, comme indiqué sur la page de référencegoogle_compute_network
.to
: adresse de la ressource Terraform à créer. Généralement au format RESOURCE TYPE.NAME.
Voici un exemple de bloc import
pour un réseau cloud privé virtuel :
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 }
Si vous avez créé manuellement votre bloc de ressources, exécutez terraform plan
pour prévisualiser l'opération d'importation.
Si vous souhaitez que Terraform génère les blocs de ressources à votre place, utilisez l'option -generate-config-out
afin de spécifier le fichier pour générer la configuration.
Exemple :
terraform plan -generate-config-out=generated_resources.tf
Après avoir examiné le code généré, exécutez l'opération terraform apply
pour importer la configuration dans l'état Terraform.
Importer des ressources créées après une exportation groupée
L'exportation groupée vous permet d'exporter des ressources Google Cloud en tant que configurations Terraform et d'importer l'état Terraform de ces ressources afin de pouvoir gérer votre déploiement dans Terraform.
Avant de commencer
Préparez Cloud Shell.
Lancez Cloud Shell et définissez le projet Google Cloud par défaut dans lequel vous souhaitez générer du code Terraform pour les ressources déployées.
Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.
Dans Cloud Shell, installez l'interface de ligne de commande (CLI) pour Config Connector.
gcloud components install config-connector
Config Connector vous permet d'utiliser l'outil d'exportation groupée Terraform de Google Cloud.
Si
ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation
s'affiche, exécutez plutôt la commande suivante :sudo apt-get install google-cloud-sdk-config-connector
Activez l'API Cloud Asset.
gcloud services enable cloudasset.googleapis.com
Générer du code Terraform pour vos ressources
Si vous ne l'avez pas déjà fait, créez le répertoire dans lequel vous souhaitez générer la configuration du projet.
mkdir OUTPUT_DIRECTORY
Exécutez la commande
gcloud beta resource-config bulk-export
pour sortir la configuration complète du projet dans le chemin d'accès,OUTPUT_DIRECTORY
:gcloud beta resource-config bulk-export \ --path=OUTPUT_DIRECTORY \ --project=PROJECT_ID \ --resource-format=terraform
Créer des modules Terraform à partir du code généré
Exécutez la commande gcloud beta resource-config terraform
generate-import
en pointant vers le contenu du répertoire de sortie :
gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY
Cette commande génère les modules Terraform et un script d'importation :
Le fichier
gcloud-export-modules.tf
. Ce fichier pointe vers tous les modules des sous-ressources. Le contenu de ce fichier se présente comme suit :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" }
Et ainsi de suite.
Un script shell exécutable portant un nom du type
terraform_import_20220331-19-12-33.sh
. Le script shell contient une liste de commandesterraform import
:#!/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
Et ainsi de suite.
Les commandes
terraform import
permettent d'importer les modules créés par la commandegenerate-import
dans l'état Terraform.
Importer les modules dans l'état Terraform
Initialisez-le :
terraform init
Exécutez le script :
./terraform_import_20220331-19-12-33.sh
Sortie :
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.