Topik ini menjelaskan cara menyelesaikan masalah manajemen dengan sumber daya cloud yang sudah ada menggunakan Terraform.
Informasi latar belakang
Topik ini berlaku untuk skenario operasi dan pemeliharaan (O&M) berikut:
Skenario 1: Terraform digunakan untuk pertama kalinya, tetapi Konsol Web, Alibaba Cloud CLI, ROS, atau API telah digunakan untuk membuat dan mengelola sumber daya.
Skenario 2: Terraform sudah digunakan untuk mengelola sumber daya. Status sumber daya harus tetap tidak berubah jika properti suatu sumber daya diubah.
Skenario 3: Semua sumber daya didefinisikan dalam sebuah template. Penambahan sumber daya tidak menyebabkan kesulitan dalam mengelola template atau status sumber daya jika template yang ada dibangun ulang atau dibagi.
Skenario 4: Parameter baru dari penyedia terbaru perlu disinkronkan ke dokumen asli.
Terraform dapat menggunakan definisi template sumber daya tidak hanya untuk membuat, mengubah, dan menghapus sumber daya baru, tetapi juga untuk mengimpor dan mengelola sumber daya yang berada di luar sistem manajemen Terraform melalui perintah sederhana untuk manajemen terpusat.
Impor sumber daya yang sudah ada
Anda dapat melakukan operasi berikut untuk mengimpor sumber daya yang sudah ada di Terraform:
Peroleh ID sumber daya.
Kueri sumber daya berdasarkan ID mereka dan peroleh propertinya.
Nyatakan sumber daya yang akan diimpor dalam template.
Terraform menggunakan metode berbasis template. Anda harus mendeklarasikan sumber daya yang akan diimpor dalam template.
Lengkapi definisi template sumber daya.
Setelah sumber daya diimpor, lengkapi definisi sumber daya yang dinyatakan dalam template berdasarkan properti sumber daya.
Peroleh ID sumber daya.
Anda bisa mendapatkan ID sumber daya dengan menggunakan metode seperti Konsol Web, Alibaba Cloud CLI, dan API. Cara termudah adalah memasukkan kondisi kueri sederhana melalui sumber data Terraform. Contoh berikut menunjukkan cara mendapatkan ID instance SLB:
data "alicloud_slbs" "default" { name_regex = "for-demo*" } output "slb_ids" { value = data.alicloud_slbs.default.ids }Jalankan perintah terraform apply untuk melihat ID semua instance SLB yang memenuhi syarat:
$ terraform apply data.alicloud_slbs.default: Memperbarui state... Apply complete! Resources: 0 ditambahkan, 0 diubah, 0 dihapus. Outputs: slb_ids = [ "lb-gw8vinrqxxxxxxxxxxx", "lb-gw8axostxxxxxxxxxxx", ]Nyatakan sumber daya yang akan diimpor dalam template.
Mirip dengan pembuatan sumber daya, Anda harus mendeklarasikan sumber daya dalam template sebelum mengimpor sumber daya untuk menentukan jalur penyimpanan sumber daya dalam state. Contoh berikut mendeklarasikan instance SLB:
resource "alicloud_slb" "this" {}Anda dapat mengimpor sumber daya tanpa mendefinisikan parameter spesifik setelah deklarasi sederhana. Di Terraform, Anda dapat menjalankan perintah impor untuk mengimpor sumber daya. Format perintah lengkapnya adalah
Terraform import <Jenis Sumber Daya>.<Nama Sumber Daya> <ID Sumber Daya>.$ terraform import alicloud_slb.this lb-gw8vinrqxxxxxxxxxxx alicloud_slb.this: Mengimpor dari ID "lb-gw8vinrqxxxxxxxxxxx"... alicloud_slb.this: Impor siap! Menyiapkan alicloud_slb untuk impor alicloud_slb.this: Memperbarui state... [id=lb-gw8vinrqxxxxxxxxxxx] Impor berhasil! Sumber daya yang diimpor ditampilkan di atas. Sumber daya ini sekarang ada di state Terraform Anda dan selanjutnya akan dikelola oleh Terraform.Lengkapi definisi template sumber daya.
Template tersebut tidak berisi definisi lengkap dari sumber daya yang diimpor, sehingga isi template berbeda dari konten yang disimpan dalam state setelah sumber daya diimpor. Saat Anda menjalankan perintah plan, pembaruan akan ditampilkan.
$ terraform plan Memperbarui state Terraform di memori sebelum rencana... State yang diperbarui akan digunakan untuk menghitung rencana ini, tetapi tidak akan disimpan ke penyimpanan state lokal atau remote. data.alicloud_slbs.default: Memperbarui state... alicloud_slb.this: Memperbarui state... [id=lb-gw8vinrqxxxxxxxxxxx] ------------------------------------------------------------------------ Rencana eksekusi telah dihasilkan dan ditampilkan di bawah. Tindakan sumber daya ditunjukkan dengan simbol berikut: ~ pembaruan di tempat Terraform akan melakukan tindakan berikut: # alicloud_slb.this akan diperbarui di tempat ~ resource "alicloud_slb" "this" { address = "47.254.181.122" ... ~ delete_protection = "on" -> "off" id = "id=lb-gw8vinrqxxxxxxxxxxx" ... ~ name = "for_demo-test" -> "tf-lb-20191108144235105700000001" ... } Rencana: 0 untuk ditambahkan, 1 untuk diubah, 0 untuk dihapus. ------------------------------------------------------------------------ Catatan: Anda tidak menentukan parameter "-out" untuk menyimpan rencana ini, jadi Terraform tidak dapat menjamin bahwa tindakan persis ini akan dilakukan jika "terraform apply" kemudian dijalankan.Untuk menjaga agar template tetap konsisten dengan state sumber daya, Anda harus secara manual menambahkan definisi parameter yang hilang dalam template hingga tidak ada pembaruan yang ditampilkan saat Anda menjalankan perintah plan.
resource "alicloud_slb" "this" { delete_protection = "on" name = "for_demo-test" }Anda harus menambahkan bidang yang menyebabkan pembaruan. Jalankan perintah plan untuk memeriksa hasilnya setelah Anda menyelesaikan definisi parameter.
$ terraform plan Memperbarui state Terraform di memori sebelum rencana... State yang diperbarui akan digunakan untuk menghitung rencana ini, tetapi tidak akan disimpan ke penyimpanan state lokal atau remote. data.alicloud_slbs.default: Memperbarui state... alicloud_slb.this: Memperbarui state... [id=lb-gw8vinrqtqx1ro1r94c96] ------------------------------------------------------------------------ Tidak ada perubahan. Infrastruktur sudah mutakhir. Ini berarti Terraform tidak mendeteksi perbedaan apa pun antara konfigurasi Anda dan sumber daya fisik nyata yang ada. Akibatnya, tidak ada tindakan yang perlu dilakukan.Informasi sebelumnya menunjukkan bahwa tidak diperlukan perubahan lebih lanjut dan proses impor sumber daya selesai.
Hapus sumber daya yang sudah ada
Beberapa masalah mungkin terjadi dalam praktik: sumber daya yang salah diimpor, sumber daya diimpor ke jalur yang salah, jalur sumber daya perlu dimodifikasi, atau beberapa sumber daya perlu dipertahankan secara permanen. Solusi sederhana untuk masalah-masalah ini: hapus sumber daya yang diimpor dari state dan kemudian impor lagi.
Anda dapat menjalankan perintah state rm untuk menghapus sumber daya. Format perintah lengkapnya adalah terraform state rm <Jenis Sumber Daya>.<Nama Sumber Daya>.
$ terraform state rm alicloud_slb.this
Menghapus alicloud_slb.this
Berhasil menghapus 1 instance sumber daya.Perintah state rm hanya menghapus sumber daya tertentu dari file state dan tidak menghapusnya. Oleh karena itu, Anda dapat mengimpor sumber daya tersebut lagi.
Ringkasan
Solusi berikut dapat digunakan untuk mengatasi empat skenario di atas:
Solusi untuk skenario 1:
Jalankan perintah terraform import untuk mengimpor sumber daya yang sudah ada untuk manajemen terpusat dengan Terraform.
Solusi untuk skenario 2:
Anda harus menentukan nilai properti parameter. Jika nilai dalam template akan digunakan, Anda harus menjalankan perintah apply dan kemudian mengubah nilainya. Jika nilai dalam Konsol Web akan digunakan, Anda harus menambahkan atau memodifikasi nilai dalam template.
Solusi untuk skenario 3:
Jalankan perintah terraform state rm untuk menghapus semua sumber daya yang akan dibangun ulang dari state. Lalu jalankan perintah terraform import untuk mengimpor sumber daya.
Solusi untuk skenario 4:
Mirip dengan solusi untuk skenario 3, hapus sumber daya dan kemudian impor lagi.
Terraform menyediakan perintah sederhana. Perintah terraform import dapat digunakan untuk manajemen terpusat sumber daya yang sudah ada berdasarkan prinsip bahwa template dan state harus memiliki konten yang konsisten. Anda tidak perlu khawatir apakah sumber daya berada di luar sistem manajemen Terraform atau apakah sumber daya dihapus dari state.