Importer vos ressources Google Cloud dans l'état Terraform

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 :

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 de project/name. L'ID de ressource de l'exemple précédent est donc 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 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 de project/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érence google_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

  1. 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
    
  2. 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 commandes terraform 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 commande generate-import dans l'état Terraform.

Importer les modules dans l'état Terraform

  1. Initialisez-le :

    terraform init
    
  2. 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.
    

Étapes suivantes