Importer vos ressources Google Cloud dans l'état Terraform

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

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.

Importer manuellement des ressources

Terraform permet d'importer des ressources à l'aide de la sous-commande terraform import. 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 au sein d'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 compatible avec le fournisseur. Nous vous recommandons d'utiliser l'identifiant complet, qui inclut l'ID du projet lorsqu'il est compatible.

Importer une ressource

  • 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 que le bucket Cloud Storage défini précédemment, il s'agit de google_storage_bucket.sample.

  • Consultez la documentation sur l'importation du fournisseur pour la ressource google_storage_bucket afin d'identifier le format de l'ID de ressource. 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 d'importation en utilisant l'adresse et l'ID de ressource en tant que terraform import google_storage_bucket.sample sample-project/my-bucket, puis exécutez-la.

    Output:

    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 les modules

Les modules encapsulent une ou plusieurs ressources d'une configuration Terraform. Comme l'importation nécessite une adresse de ressource, chaque ressource d'un module doit être importée individuellement.

  • Identifier 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 ressource, vous pouvez inspecter le contenu du module. Vous pouvez également appliquer la configuration et utiliser les erreurs révélé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,
    

    En utilisant le journal précédent, vous pouvez identifier l'adresse de ressource qui doit être importée en tant que module.gcs_bucket.google_storage_bucket.bucket.

  • Consultez la documentation sur l'importation du fournisseur pour la ressource google_storage_bucket afin d'identifier le format de l'ID de ressource. Dans ce cas, il s'agit de project/name. Le nom peut être identifié à partir du résultat du forfait.

    Output:

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

    Pour l'exemple précédent, l'ID de ressource est sample-project/my-bucket.

  • Créez l'instruction d'importation en utilisant l'adresse de ressource et l'ID terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket, puis exécutez-la.

    Output:

    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 créées à l'aide de l'exportation groupée

Google fournit un outil permettant d'exporter des ressources Google Cloud en tant que configurations Terraform et d'importer l'état Terraform pour ces ressources afin de pouvoir gérer votre déploiement dans Terraform.

Avant de commencer

  • Installez gcloud 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.

  • Activez l'API Cloud Asset.

    gcloud services enable cloudasset.googleapis.com
    
  • Assurez-vous que l'agent de service d'éléments Cloud gcp-sa-cloudasset.iam.gserviceaccount.com possède le rôle roles/servicenetworking.serviceAgent.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/servicenetworking.serviceAgent
    

Générer du code Terraform pour vos ressources

Exécutez la commande gcloud beta resource-config bulk-export pour sortir la configuration complète du projet dans le chemin d'accès, entire-tf-output :

gcloud beta resource-config bulk-export \
  --path=entire-tf-output \
  --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 entire-tf-output

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 "entire-tf-output-projects-PROJECT_ID-ComputeFirewall" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeBackendService-global" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeBackendService/global"
    }
    
    ...and so on
    
  • 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.entire-tf-output-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    
    ...and so on
    

    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