Mengimpor resource Google Cloud Anda ke status Terraform

Terraform dapat mengimpor infrastruktur yang ada. Dengan begitu, Anda dapat mengambil resource yang telah dibuat dengan cara lain dan membawanya ke pengelolaan Terraform.

Anda dapat mengimpor status untuk resource Google Cloud apa pun.

Terraform mendukung beberapa cara untuk mengimpor resource:

Mengimpor resource satu per satu

Perintah import menggunakan dua argumen—ID dan alamat resource. Alamat resource adalah ID yang mengarah ke instance resource dalam konfigurasi. ID adalah pengidentifikasi resource di Google Cloud yang sedang diimpor. Format untuk ID berbeda berdasarkan jenis resource dan didokumentasikan untuk setiap resource yang didukung oleh penyedia. Sebaiknya gunakan ID lengkap, yang menyertakan project ID jika didukung.

  • Identifikasi alamat resource yang akan diimpor.

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

    Untuk contoh resource seperti bucket Cloud Storage yang ditentukan sebelumnya, ini adalah google_storage_bucket.sample.

  • Untuk mengidentifikasi format ID resource, lihat dokumentasi impor penyedia untuk resource google_storage_bucket. Dalam hal ini, ID resource memiliki bentuk project/name sehingga ID resource untuk contoh sebelumnya adalah sample-project/my-bucket.

  • Buat pernyataan import menggunakan alamat dan ID resource, seperti berikut:

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

    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.
    

Mengimpor resource dalam modul

Modul mengenkapsulasi satu atau beberapa resource dalam konfigurasi Terraform. Karena proses impor memerlukan alamat resource, setiap resource dalam modul harus diimpor satu per satu.

  • Identifikasi resource dalam modul yang akan diimpor.

    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"
    }
    

    Untuk mengidentifikasi alamat resource, Anda dapat memeriksa konten modul. Atau, terapkan konfigurasi dan gunakan error yang ditampilkan oleh penyedia. Contoh:

    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,
    

    Dengan menggunakan log sebelumnya, Anda dapat mengidentifikasi alamat resource yang perlu diimpor sebagai module.gcs_bucket.google_storage_bucket.bucket.

  • Untuk mengidentifikasi format ID resource, lihat dokumentasi impor penyedia untuk resource google_storage_bucket. Dalam hal ini, formatnya adalah project/name. Namanya dapat diidentifikasi dari output rencana.

    Output:

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

    Untuk contoh sebelumnya, ID resource-nya adalah sample-project/my-bucket.

  • Buat pernyataan import menggunakan alamat dan ID resource, seperti berikut:

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

    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.
    

Mengimpor resource secara massal dengan blok import berbasis konfigurasi

Terraform versi 1.5 memungkinkan Anda menambahkan blok import ke konfigurasi Terraform. Hal ini memungkinkan operasi impor dilihat pratinjaunya selama operasi plan dan dijalankan menggunakan operasi apply.

Anda juga dapat membuat kode secara otomatis untuk resource yang diimpor, alih-alih menulis kode secara manual.

Blok import menggunakan dua parameter:

  • id: ID resource yang ditentukan penyedia dari resource cloud yang akan diimpor.

    Untuk ID resource yang ditentukan penyedia yang diterima, lihat bagian Impor untuk resource dalam dokumentasi penyedia Google Hashicorp. Misalnya, projects/{project}/global/networks/{name} adalah ID resource untuk jaringan VPC, seperti yang ditampilkan di halaman referensi google_compute_network.

  • to: Alamat resource Terraform yang akan dibuat. Biasanya dalam bentuk RESOURCE TYPE.NAME.

Berikut adalah contoh blok import untuk jaringan Virtual Private Cloud:

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
}

Jika Anda telah membuat blok resource secara manual, jalankan terraform plan untuk melihat pratinjau operasi impor.

Jika Anda ingin Terraform membuat blok resource untuk Anda, gunakan flag -generate-config-out untuk menentukan file yang akan membuat konfigurasi.

Contoh:

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

Setelah meninjau kode yang dihasilkan, jalankan operasi terraform apply untuk mengimpor konfigurasi ke status Terraform.

Mengimpor resource yang dibuat setelah melakukan ekspor massal

Dengan ekspor massal, Anda dapat mengekspor resource Google Cloud sebagai konfigurasi Terraform dan mengimpor status Terraform untuk resource tersebut, sehingga Anda dapat mengelola deployment di Terraform.

Sebelum memulai

  • Siapkan Cloud Shell

    Luncurkan Cloud Shell, dan tetapkan project Google Cloud default tempat Anda ingin membuat kode Terraform untuk resource yang di-deploy.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diabaikan jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

  • Di Cloud Shell, instal antarmuka command line (CLI) untuk Config Connector.

    gcloud components install config-connector
    

    Dengan Config Connector, Anda dapat menggunakan alat ekspor massal Terraform Google Cloud.

    Jika Anda melihat ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation, jalankan perintah berikut:

    sudo apt-get install google-cloud-sdk-config-connector
    
  • Aktifkan Cloud Asset API.

    gcloud services enable cloudasset.googleapis.com
    

Membuat kode Terraform untuk resource Anda

  1. Jika Anda belum melakukannya, buat direktori tempat Anda ingin menghasilkan konfigurasi project.

    mkdir OUTPUT_DIRECTORY
    
  2. Jalankan perintah gcloud beta resource-config bulk-export untuk menghasilkan seluruh konfigurasi project ke jalur OUTPUT_DIRECTORY:

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

Membuat modul Terraform dari kode yang dibuat

Jalankan perintah gcloud beta resource-config terraform generate-import, yang mengarah ke konten dalam direktori output:

gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY

Perintah ini menghasilkan modul Terraform dan skrip impor:

  • File gcloud-export-modules.tf. File ini mengarah ke semua modul dari sub-resource. Isi file ini akan terlihat seperti ini:

    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"
    }
    

    ...dan seterusnya.

  • Sebuah skrip shell yang dapat dieksekusi memanggil terraform_import_20220331-19-12-33.sh. Skrip shell berisi daftar perintah 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
    

    ...dan seterusnya.

    Perintah terraform import digunakan untuk mengimpor modul yang dibuat oleh perintah generate-import ke dalam status Terraform.

Mengimpor modul ke dalam status Terraform

  1. Lakukan inisialisasi:

    terraform init
    
  2. Jalankan skrip:

    ./terraform_import_20220331-19-12-33.sh
    

    Output:

    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.
    

Langkah berikutnya