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:
- Satu per satu menggunakan subperintah
terraform import
. - Secara massal dengan menyertakan blok
import
dalam konfigurasi (memerlukan Terraform versi 1.5 atau yang lebih baru). - Secara massal menggunakan fitur Google Cloud yang memungkinkan Anda mengimpor resource setelah ekspor massal.
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 bentukproject/name
sehingga ID resource untuk contoh sebelumnya adalahsample-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 adalahproject/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 referensigoogle_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
Jika Anda belum melakukannya, buat direktori tempat Anda ingin menghasilkan konfigurasi project.
mkdir OUTPUT_DIRECTORY
Jalankan perintah
gcloud beta resource-config bulk-export
untuk menghasilkan seluruh konfigurasi project ke jalurOUTPUT_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 perintahterraform 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 perintahgenerate-import
ke dalam status Terraform.
Mengimpor modul ke dalam status Terraform
Lakukan inisialisasi:
terraform init
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.