arrow_back

Mengelola Status Terraform

Login Gabung
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Mengelola Status Terraform

Lab 1 jam universal_currency_alt 5 Kredit show_chart Menengah
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Lab ini dikembangkan oleh partner kami, Hashicorp. Jika Anda memilih untuk menerima info terbaru terkait produk, pengumuman, dan penawaran di Profil Akun Anda, informasi pribadi Anda mungkin akan dibagikan kepada Hashicorp, yang merupakan sponsor dari lab ini.

GSP752

Lab Mandiri Google Cloud

Ringkasan

Terraform harus menyimpan status infrastruktur terkelola dan konfigurasi Anda. Status ini digunakan oleh Terraform untuk memetakan resource dunia nyata ke konfigurasi Anda, melacak metadata, dan meningkatkan performa untuk infrastruktur besar.

Status ini disimpan secara default dalam file lokal bernama terraform.tfstate, tapi juga dapat disimpan secara jarak jauh, yang berfungsi lebih baik dalam lingkungan tim.

Terraform menggunakan status lokal ini untuk membuat rencana dan melakukan perubahan pada infrastruktur Anda. Sebelum operasi apa pun, Terraform melakukan refresh untuk memperbarui status dengan infrastruktur nyata.

Tujuan utama status Terraform adalah menyimpan binding di antara objek dalam sistem jarak jauh dan instance resource yang dideklarasikan dalam konfigurasi Anda. Saat Terraform membuat objek jarak jauh sebagai respons terhadap perubahan konfigurasi, Terraform akan mencatat identitas objek jarak jauh tersebut untuk diperiksa terhadap instance resource tertentu, lalu memperbarui atau menghapus objek tersebut sebagai respons terhadap perubahan konfigurasi di masa mendatang.

Tujuan

Di lab ini, Anda akan mempelajari cara melakukan tugas berikut:

  • Membuat backend lokal.
  • Membuat backend Cloud Storage.
  • Me-refresh status Terraform Anda.
  • Mengimpor konfigurasi Terraform.
  • Mengelola konfigurasi yang diimpor dengan Terraform.

Penyiapan dan persyaratan

Sebelum mengklik tombol Mulai Lab

Baca petunjuk ini. Lab memiliki timer dan Anda tidak dapat menjedanya. Timer, yang dimulai saat Anda mengklik Start Lab, akan menampilkan durasi ketersediaan resource Google Cloud untuk Anda.

Lab praktik ini dapat Anda gunakan untuk melakukan sendiri aktivitas lab di lingkungan cloud sungguhan, bukan di lingkungan demo atau simulasi. Untuk mengakses lab ini, Anda akan diberi kredensial baru yang bersifat sementara dan dapat digunakan untuk login serta mengakses Google Cloud selama durasi lab.

Untuk menyelesaikan lab ini, Anda memerlukan:

  • Akses ke browser internet standar (disarankan browser Chrome).
Catatan: Gunakan jendela Samaran atau browser pribadi untuk menjalankan lab ini. Hal ini akan mencegah konflik antara akun pribadi Anda dan akun Siswa yang dapat menyebabkan tagihan ekstra pada akun pribadi Anda.
  • Waktu untuk menyelesaikan lab. Ingat, setelah dimulai, lab tidak dapat dijeda.
Catatan: Jika Anda sudah memiliki project atau akun pribadi Google Cloud, jangan menggunakannya untuk lab ini agar terhindar dari tagihan ekstra pada akun Anda.

Cara memulai lab dan login ke Google Cloud Console

  1. Klik tombol Start Lab. Jika Anda perlu membayar lab, jendela pop-up akan terbuka untuk memilih metode pembayaran. Di sebelah kiri adalah panel Lab Details dengan berikut ini:

    • Tombol Open Google Console
    • Waktu tersisa
    • Kredensial sementara yang harus Anda gunakan untuk lab ini
    • Informasi lain, jika diperlukan, untuk menyelesaikan lab ini
  2. Klik Open Google Console. Lab akan menjalankan resource, lalu membuka tab lain yang menampilkan halaman Login.

    Tips: Atur tab di jendela terpisah secara berdampingan.

    Catatan: Jika Anda melihat dialog Choose an account, klik Use Another Account.
  3. Jika perlu, salin Username dari panel Lab Details dan tempel ke dialog Sign in. Klik Next.

  4. Salin Password dari panel Lab Details dan tempel ke dialog Welcome. Klik Next.

    Penting: Anda harus menggunakan kredensial dari panel sebelah kiri. Jangan menggunakan kredensial Google Cloud Skills Boost. Catatan: Menggunakan akun Google Cloud sendiri untuk lab ini dapat dikenai biaya tambahan.
  5. Klik halaman berikutnya:

    • Setujui persyaratan dan ketentuan.
    • Jangan tambahkan opsi pemulihan atau autentikasi 2 langkah (karena ini akun sementara).
    • Jangan daftar uji coba gratis.

Setelah beberapa saat, Cloud Console akan terbuka di tab ini.

Catatan: Anda dapat melihat menu dengan daftar Produk dan Layanan Google Cloud dengan mengklik Menu navigasi di kiri atas. Ikon menu navigasi

Mengaktifkan Cloud Shell

Cloud Shell adalah mesin virtual yang dilengkapi dengan berbagai alat pengembangan. Mesin virtual ini menawarkan direktori beranda persisten berkapasitas 5 GB dan berjalan di Google Cloud. Cloud Shell menyediakan akses command-line untuk resource Google Cloud Anda.

  1. Klik Activate Cloud Shell Ikon Activate Cloud Shell di bagian atas konsol Google Cloud.

Setelah terhubung, Anda sudah diautentikasi, dan project ditetapkan ke PROJECT_ID Anda. Output berisi baris yang mendeklarasikan PROJECT_ID untuk sesi ini:

Project Cloud Platform Anda dalam sesi ini disetel ke YOUR_PROJECT_ID

gcloud adalah alat command line untuk Google Cloud. Alat ini sudah terinstal di Cloud Shell dan mendukung pelengkapan command line.

  1. (Opsional) Anda dapat menampilkan daftar nama akun yang aktif dengan perintah ini:
gcloud auth list
  1. Klik Authorize.

  2. Output Anda sekarang akan terlihat seperti ini:

Output:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net Untuk menyetel akun aktif, jalankan: $ gcloud config set account `ACCOUNT`
  1. (Opsional) Anda dapat menampilkan daftar project ID dengan perintah ini:
gcloud config list project

Output:

[core] project = <project_ID>

Contoh output:

[core] project = qwiklabs-gcp-44776a13dea667a6 Catatan: Untuk mendapatkan dokumentasi gcloud yang lengkap di Google Cloud, baca panduan ringkasan gcloud CLI.

Tujuan status Terraform

Status adalah persyaratan yang diperlukan oleh Terraform untuk dapat berfungsi. Orang-orang terkadang bertanya apakah Terraform dapat bekerja tanpa status atau tidak menggunakan status dan hanya memeriksa resource cloud di setiap operasi. Dalam skenario di mana Terraform mungkin dapat bekerja tanpa status, hal itu akan memerlukan pemindahan kompleksitas dalam jumlah yang sangat besar dari satu tempat (status) ke tempat lain (konsep pengganti). Bagian ini akan membantu menjelaskan mengapa status Terraform diperlukan.

Pemetaan ke dunia nyata

Terraform memerlukan semacam database untuk memetakan konfigurasi Terraform ke dunia nyata. Jika konfigurasi Anda berisi resource resource "google_compute_instance" "foo", Terraform menggunakan peta ini untuk mengetahui bahwa instance i-abcd1234 diwakili oleh resource tersebut.

Terraform memperkirakan bahwa setiap objek jarak jauh terikat pada hanya satu instance resource, yang biasanya terjamin karena Terraform bertanggung jawab untuk membuat objek dan mencatat identitasnya dalam status. Jika Anda mengimpor objek yang dibuat di luar Terraform, Anda harus memverifikasi bahwa setiap objek yang berbeda diimpor ke hanya satu instance resource.

Jika satu objek jarak jauh terikat pada dua instance resource atau lebih, Terraform mungkin akan melakukan tindakan yang tidak terduga terhadap objek tersebut karena pemetaan dari konfigurasi ke status objek jarak jauh telah menjadi ambigu.

Metadata

Selain melacak pemetaan antara resource dan objek jarak jauh, Terraform juga harus melacak metadata seperti dependensi resource.

Terraform biasanya menggunakan konfigurasi untuk menentukan urutan dependensi. Akan tetapi, saat Anda menghapus resource dari konfigurasi Terraform, Terraform harus mengetahui cara menghapus resource tersebut. Terraform dapat melihat bahwa sudah ada pemetaan untuk resource yang tidak berada dalam file konfigurasi Anda dan membuat rencana untuk menghancurkannya. Akan tetapi, karena tidak ada lagi resource, urutan tidak dapat ditentukan dari konfigurasi itu sendiri.

Untuk memastikan operasi yang tepat, Terraform menyimpan salinan dari serangkaian dependensi terbaru dalam status. Terraform tetap dapat menentukan urutan yang benar untuk penghancuran dari status saat Anda menghapus satu atau beberapa item dari konfigurasi.

Ini dapat dihindari jika Terraform mengetahui urutan yang diperlukan di antara jenis-jenis resource. Misalnya, Terraform dapat mengetahui bahwa server harus dihapus sebelum subnet yang menaunginya. Akan tetapi, kompleksitas untuk pendekatan ini dapat dengan cepat menjadi tidak dapat dikelola; selain memahami semantik urutan setiap resource untuk setiap cloud, Terraform juga harus memahami urutan di berbagai penyedia.

Terraform juga menyimpan metadata lain untuk alasan yang serupa, seperti pointer ke konfigurasi penyedia yang paling terakhir digunakan dengan resource dalam situasi di mana terdapat beberapa penyedia dengan alias.

Performa

Selain pemetaan dasar, Terraform menyimpan cache nilai atribut untuk semua resource dalam status. Ini adalah fitur opsional status Terraform dan hanya digunakan sebagai peningkatan performa.

Saat menjalankan terraform plan, Terraform harus mengetahui status resource saat ini untuk menentukan secara efektif perubahan yang dibutuhkan untuk mencapai konfigurasi yang Anda inginkan.

Untuk infrastruktur kecil, Terraform dapat mengkueri penyedia Anda dan menyinkronkan atribut terbaru dari semua resource Anda. Ini adalah perilaku default Terraform: untuk setiap plan dan apply, Terraform akan menyinkronkan semua resource dalam status Anda.

Untuk infrastruktur yang lebih besar, pembuatan kueri untuk setiap resource berjalan sangat lambat. Banyak penyedia cloud tidak menyediakan API untuk mengkueri beberapa resource pada saat yang bersamaan, dan waktu round trip untuk setiap resource adalah ratusan milidetik. Selain itu, penyedia cloud hampir selalu memiliki pembatasan kapasitas API, jadi Terraform hanya dapat meminta resource dalam jumlah yang terbatas dalam satu waktu. Banyak pengguna Terraform sering menggunakan flag -refresh=false dan flag -target untuk mengatasi hal ini. Dalam skenario-skenario ini, status yang di-cache diperlakukan sebagai catatan kebenaran.

Menyinkronkan

Dalam konfigurasi default, Terraform menyimpan status dalam file pada direktori kerja saat ini tempat Terraform dijalankan. Ini akan berfungsi saat Anda baru akan memulai. Namun, jika Terraform digunakan dalam sebuah tim, penting bagi semua orang untuk bekerja dalam status yang sama sehingga operasi akan diterapkan ke objek jarak jauh yang sama.

Status jarak jauh adalah solusi yang direkomendasikan untuk masalah ini. Dengan backend status berfitur lengkap, Terraform dapat menggunakan penguncian jarak jauh sebagai langkah untuk mencegah beberapa pengguna menjalankan Terraform secara tidak sengaja pada saat yang bersamaan; hal ini memastikan bahwa setiap operasi Terraform dimulai dengan status diperbarui yang paling terkini.

Penguncian status

Jika didukung oleh backend Anda, Terraform akan mengunci status Anda untuk semua operasi yang dapat menulis status. Dengan ini, orang lain tidak akan bisa mendapatkan kunci dan merusak status Anda.

Penguncian status terjadi otomatis pada semua operasi yang dapat menulis status. Anda tidak akan melihat pesan apa pun bahwa itu sedang terjadi. Jika penguncian status gagal, Terraform tidak akan dilanjutkan. Anda dapat menonaktifkan penguncian status untuk sebagian besar perintah dengan flag -lock, tapi itu tidak direkomendasikan.

Jika dibutuhkan waktu yang lebih lama dari yang diperkirakan untuk mendapatkan kunci, Terraform akan mengeluarkan pesan status. Jika Terraform tidak mengeluarkan pesan, penguncian status masih sedang berlangsung.

Tidak semua backend mendukung penguncian. Lihat daftar jenis backend untuk mengetahui detail apakah backend mendukung penguncian atau tidak.

Ruang kerja

Setiap konfigurasi Terraform memiliki backend terkait yang menentukan bagaimana operasi dieksekusi dan di mana data persisten seperti status Terraform disimpan.

Data persisten yang disimpan di backend merupakan bagian dari ruang kerja. Pada awalnya, backend hanya memiliki satu ruang kerja, bernama default, dan oleh karena itu hanya ada satu status Terraform yang terkait dengan konfigurasi tersebut.

Backend tertentu mendukung beberapa ruang kerja bernama, yang memungkinkan beberapa status dikaitkan dengan satu konfigurasi. Konfigurasi tetap hanya memiliki satu backend, tapi beberapa instance unik dari konfigurasi tersebut dapat di-deploy tanpa mengonfigurasi backend baru atau mengubah kredensial autentikasi.

Tugas 1. Bekerja dengan backend

Backend di Terraform menentukan bagaimana status dimuat dan bagaimana operasi seperti apply dieksekusi. Abstraksi ini memungkinkan penyimpanan status file nonlokal, eksekusi jarak jauh, dll.

Secara default, Terraform menggunakan backend "lokal", yang merupakan perilaku normal yang biasa Anda lihat pada Terraform. Ini adalah backend yang dipanggil di lab-lab sebelumnya.

Berikut adalah beberapa manfaat backend:

  • Bekerja dalam tim: Backend dapat menyimpan statusnya secara jarak jauh dan melindungi status tersebut dengan kunci untuk mencegah kerusakan. Beberapa backend, seperti Terraform Cloud, bahkan otomatis menyimpan histori semua revisi status.
  • Menyimpan informasi sensitif di luar disk: Status diambil dari backend sesuai permintaan dan hanya disimpan di memori.
  • Operasi jarak jauh: Untuk infrastruktur yang lebih besar atau perubahan tertentu, terraform apply dapat membutuhkan waktu yang lama. Beberapa backend mendukung operasi jarak jauh, yang memungkinkan operasi dieksekusi secara jarak jauh. Anda kemudian dapat mematikan komputer, dan operasi Anda akan tetap selesai. Jika digabungkan dengan penyimpanan status jarak jauh dan penguncian (dijelaskan di atas), ini juga akan membantu dalam lingkungan tim.

Backend sepenuhnya opsional: Anda dapat menggunakan Terraform dengan sukses tanpa perlu mempelajari atau menggunakan backend. Namun, backend dapat menyelesaikan poin kendala yang dialami oleh tim di skala tertentu. Jika Anda bekerja sebagai individu, Anda mungkin dapat sukses tanpa pernah menggunakan backend.

Meskipun Anda hanya berniat untuk menggunakan backend "lokal", tidak ada salahnya bagi Anda untuk mempelajari backend karena Anda juga dapat mengubah perilaku backend lokal.

Menambahkan backend lokal

Di bagian ini, Anda akan mengonfigurasi backend lokal.

Saat mengonfigurasi backend untuk pertama kali (dari tidak ada backend yang ditentukan hingga mengonfigurasi backend secara eksplisit), Terraform akan memberi Anda opsi untuk memigrasikan status Anda ke backend baru. Ini memungkinkan Anda untuk menggunakan backend tanpa kehilangan status apa pun yang sudah ada.

Agar lebih berhati-hati, kami selalu merekomendasikan agar Anda juga mencadangkan status Anda secara manual. Anda dapat melakukan ini hanya dengan menyalin file terraform.tfstate ke lokasi lain. Proses inisialisasi seharusnya juga akan membuat cadangan, tapi tidak ada salahnya berjaga-jaga!

Mengonfigurasi backend untuk pertama kali tidak ada bedanya dari mengubah konfigurasi di masa mendatang: buat konfigurasi baru dan jalankan terraform init. Terraform akan memandu Anda di sepanjang proses.

  1. Di jendela Cloud Shell baru, buat file konfigurasi main.tf:
touch main.tf
  1. Untuk mengambil Project ID Anda, jalankan perintah berikut:
gcloud config list --format 'value(core.project)'
  1. Di toolbar Cloud Shell, klik Open Editor. Untuk beralih antara Cloud Shell dan editor kode, klik Open Editor atau Open Terminal sesuai kebutuhan, atau klik Open in new window untuk membiarkan Editor terbuka di tab terpisah.
  1. Salin kode resource bucket Cloud Storage ke file konfigurasi main.tf Anda, dengan mengganti definisi variabel project dan name dengan Project ID Anda:
provider "google" { project = "# REPLACE WITH YOUR PROJECT ID" region = "{{{project_0.default_region | REGION}}}" } resource "google_storage_bucket" "test-bucket-for-state" { name = "# REPLACE WITH YOUR PROJECT ID" location = "US" uniform_bucket_level_access = true }

Pelajari lebih lanjut tentang resource Cloud Storage dari Dokumentasi Terraform.

  1. Tambahkan backend lokal ke file main.tf Anda:
terraform { backend "local" { path = "terraform/state/terraform.tfstate" } }

Ini akan mereferensikan file terraform.tfstate di direktori terraform/state. Untuk menentukan jalur file yang berbeda, ubah variabel path.

Backend lokal menyimpan status pada sistem file lokal, mengunci status tersebut menggunakan API sistem, dan melakukan operasi secara lokal.

Terraform harus melakukan inisialisasi backend yang dikonfigurasi sebelum digunakan. Untuk melakukannya, Anda akan menjalankan terraform init. Perintah terraform init harus dijalankan oleh setiap anggota tim Anda pada setiap konfigurasi Terraform sebagai langkah pertama. Aman bagi Anda untuk mengeksekusi beberapa kali dan melakukan semua tindakan penyiapan yang diperlukan untuk lingkungan Terraform, termasuk inisialisasi backend.

Perintah init harus dipanggil:

  • Pada setiap lingkungan baru yang mengonfigurasi backend
  • Pada setiap perubahan konfigurasi backend (termasuk jenis backend)
  • Pada saat menghapus konfigurasi backend sepenuhnya

Anda tidak perlu mengingat kasus-kasus ini secara persis. Terraform akan mendeteksi saat inisialisasi diperlukan dan menampilkan pesan error dalam situasi tersebut. Terraform tidak melakukan inisialisasi otomatis karena mungkin akan memerlukan informasi tambahan dari pengguna atau melakukan migrasi status, dll.

  1. Di toolbar Cloud Shell, klik Open Terminal, lalu lakukan inisialisasi Terraform:
terraform init
  1. Terapkan perubahan. Ketik yes pada prompt untuk mengonfirmasi:
terraform apply

Sekarang, Editor Cloud Shell seharusnya akan menampilkan file status bernama terraform.tfstate di direktori terraform/state.

  1. Periksa file status Anda:
terraform show

Resource google_storage_bucket.test-bucket-for-state Anda seharusnya akan ditampilkan.

Menambahkan backend Cloud Storage

Backend Cloud Storage menyimpan status sebagai objek dalam imbuhan yang dapat dikonfigurasi pada bucket tertentu di Cloud Storage. Backend ini juga mendukung penguncian status. Ini akan mengunci status Anda untuk semua operasi yang dapat menulis status. Dengan ini, orang lain tidak akan bisa mendapatkan kunci dan merusak status Anda.

Penguncian status terjadi otomatis pada semua operasi yang dapat menulis status. Anda tidak akan melihat pesan apa pun bahwa itu sedang terjadi. Jika penguncian status gagal, Terraform tidak akan dilanjutkan. Anda dapat menonaktifkan penguncian status untuk sebagian besar perintah dengan flag -lock, tapi ini tidak direkomendasikan.

  1. Kembali ke file main.tf Anda di editor. Anda sekarang akan mengganti backend lokal saat ini dengan backend gcs.

  2. Untuk mengganti konfigurasi backend lokal yang sudah ada, salin konfigurasi berikut ke file Anda, dengan mengganti backend local:

terraform { backend "gcs" { bucket = "# REPLACE WITH YOUR BUCKET NAME" prefix = "terraform/state" } } Catatan: Pastikan Anda memperbarui definisi variabel bucket. Jika Anda tidak mengubah konfigurasi, ini akan menjadi name dari resource google_storage_bucket. Bucket ini akan digunakan untuk menghosting file status.
  1. Lakukan inisialisasi backend Anda lagi, kali ini untuk memigrasikan status secara otomatis:
terraform init -migrate-state

Ketik yes pada prompt untuk mengonfirmasi.

  1. Di Konsol Cloud, pada Menu navigasi, klik Cloud Storage > Buckets.

  2. Klik bucket Anda dan cari file terraform/state/default.tfstate. File status Anda sekarang berada di bucket Cloud Storage!

Catatan: Jika Anda tidak lagi ingin menggunakan backend, Anda dapat cukup menghapus konfigurasi dari file. Terraform akan mendeteksi ini seperti perubahan lain dan meminta Anda untuk melakukan inisialisasi ulang.

Sebagai bagian dari inisialisasi ulang, Terraform akan bertanya apakah Anda ingin memigrasikan status Anda kembali ke status lokal normal. Setelah ini selesai, Terraform akan kembali memiliki perilaku default seperti semula.

Me-refresh status

Perintah terraform refresh digunakan untuk merekonsiliasi status yang diketahui Terraform (melalui file statusnya) dengan infrastruktur dunia nyata. Ini dapat digunakan untuk mendeteksi setiap penyimpangan dari status yang terakhir diketahui dan memperbarui file status.

Ini tidak memodifikasi infrastruktur, tapi memodifikasi file status. Jika status diubah, ini dapat menyebabkan perubahan terjadi selama plan atau apply berikutnya.

  1. Kembali ke bucket penyimpanan Anda di Konsol Cloud. Pilih kotak centang di sebelah nama.

  2. Klik tab Labels.

  3. Klik Add Label. Tetapkan Key 1 = key and Value 1 = value.

  4. Klik Save.

  5. Kembali ke Cloud Shell dan gunakan perintah berikut untuk memperbarui file status:

terraform refresh
  1. Periksa pembaruan:
terraform show

Pasangan nilai-kunci "key" = "value" harus ditampilkan di atribut label konfigurasi.

Klik Check my progress untuk memverifikasi tujuan. Bekerja dengan backend

Mengosongkan ruang kerja Anda

Sebelum melanjutkan ke tugas selanjutnya, hancurkan infrastruktur yang disediakan.

  1. Pertama, kembalikan backend Anda ke local sehingga Anda dapat menghapus bucket penyimpanan. Salin dan ganti konfigurasi gcs dengan berikut ini:
terraform { backend "local" { path = "terraform/state/terraform.tfstate" } }
  1. Lakukan inisialisasi backend local lagi:
terraform init -migrate-state

Ketik yes pada prompt untuk mengonfirmasi.

  1. Pada file main.tf, tambahkan argumen force_destroy = true ke resource google_storage_bucket Anda. Saat Anda menghapus bucket, opsi boolean ini akan menghapus semua objek yang ditampung. Jika Anda mencoba menghapus bucket yang berisi objek, Terraform akan menggagalkan operasi tersebut. Konfigurasi resource Anda seharusnya menyerupai berikut ini:
resource "google_storage_bucket" "test-bucket-for-state" { name = "qwiklabs-gcp-03-c26136e27648" location = "US" uniform_bucket_level_access = true force_destroy = true }
  1. Terapkan perubahan:
terraform apply

Ketik yes pada prompt untuk mengonfirmasi.

  1. Anda sekarang dapat menghancurkan infrastruktur Anda dengan sukses:
terraform destroy

Ketik yes pada prompt untuk mengonfirmasi.

Tugas 2. Mengimpor konfigurasi Terraform

Di bagian ini, Anda akan mengimpor container dan image Docker yang sudah ada ke ruang kerja Terraform yang kosong. Dengan melakukannya, Anda akan mempelajari strategi dan pertimbangan untuk mengimpor infrastruktur dunia nyata ke Terraform.

Alur kerja Terraform default melibatkan pembuatan dan pengelolaan infrastruktur secara keseluruhan dengan Terraform.

  • Tulis konfigurasi Terraform yang mendefinisikan infrastruktur yang ingin Anda buat.

  • Tinjau rencana Terraform untuk memastikan bahwa konfigurasi akan menghasilkan status dan infrastruktur yang diharapkan.

  • Terapkan konfigurasi untuk membuat status dan infrastruktur Terraform Anda.

Diagram alur kerja Terraform

Setelah Anda membuat infrastruktur dengan Terraform, Anda dapat memperbarui konfigurasi dan rencana dan menerapkan perubahan tersebut. Pada akhirnya, Anda akan menggunakan Terraform untuk menghancurkan infrastruktur saat tidak lagi dibutuhkan. Alur kerja ini mengasumsikan bahwa Terraform akan membuat infrastruktur yang sepenuhnya baru.

Akan tetapi, Anda mungkin perlu mengelola infrastruktur yang tidak dibuat oleh Terraform. Impor Terraform mengatasi masalah ini dengan memuat resource yang didukung ke status ruang kerja Terraform Anda.

Namun demikian, perintah impor tidak otomatis membuat konfiigurasi untuk mengelola infrastruktur. Karena itu, pengimporan infrastruktur yang sudah ada ke Terraform adalah proses yang terdiri dari beberapa langkah.

Membawa infrastruktur yang sudah ada ke dalam kontrol Terraform melibatkan lima langkah utama:

  • Mengidentifikasi infrastruktur yang sudah ada yang akan diimpor.
  • Mengimpor infrastruktur ke status Terraform Anda.
  • Menulis konfigurasi Terraform yang sesuai dengan infrastruktur tersebut.
  • Meninjau rencana Terraform untuk memastikan bahwa konfigurasi sesuai dengan status dan infrastruktur yang diharapkan.
  • Menerapkan konfigurasi untuk memperbarui status Terraform Anda.

Diagram alur kerja impor Terraform

Di bagian ini, Anda akan terlebih dahulu membuat container Docker dengan Docker CLI. Selanjutnya, Anda akan mengimpornya ke ruang kerja Terraform yang baru. Lalu Anda akan memperbarui konfigurasi container menggunakan Terraform sebelum akhirnya menghancurkannya setelah Anda selesai.

Peringatan: Pengimporan infrastruktur akan memanipulasi status Terraform dengan cara yang dapat membuat proyek Terraform yang sudah ada memiliki status yang tidak valid. Buat cadangan dari file terraform.tfstate dan direktori .terraform sebelum menggunakan impor Terraform pada proyek Terraform yang sebenarnya, dan simpan secara aman.

Membuat container Docker

  1. Buat container bernama hashicorp-learn menggunakan image NGINX terbaru dari Docker Hub, dan lihat pratinjau container pada virtual machine Cloud Shell melalui port 80 (HTTP):
docker run --name hashicorp-learn --detach --publish 8080:80 nginx:latest
  1. Pastikan bahwa container sedang berjalan:
docker ps
  1. Pada panel Cloud Shell, klik Web Preview, lalu klik Preview on port 8080.

 Opsi Pratinjau Web

Cloud Shell membuka URL pratinjau pada layanan proxy-nya pada jendela browser baru dan menampilkan halaman indeks default NGINX. Sekarang Anda memiliki image dan container Docker yang dapat diimpor ke ruang kerja Anda dan dikelola dengan Terraform.

Mengimpor container ke Terraform

  1. Clone repositori contoh:
git clone https://github.com/hashicorp/learn-terraform-import.git
  1. Ubah ke direktori tersebut:
cd learn-terraform-import

Direktori ini berisi dua file konfigurasi Terraform yang membentuk konfigurasi yang akan Anda gunakan dalam panduan ini:

  • File main.tf mengonfigurasi penyedia Docker.
  • File docker.tf akan berisi konfigurasi yang diperlukan untuk mengelola container Docker yang Anda buat pada langkah sebelumnya.
  1. Lakukan inisialisasi ruang kerja Terraform Anda:
terraform init Catatan: Jika Anda mendapatkan error seperti Error: Gagal mengkueri paket penyedia yang tersedia, jalankan perintah ini: terraform init -upgrade
  1. Di Editor Cloud Shell, cari learn-terraform-import/main.tf.

  2. Temukan resource provider: docker dan jadikan sebagai komentar atau hapus argumen host:

provider "docker" { # host = "npipe:////.//pipe//docker_engine" } Catatan: Ini adalah solusi sementara untuk masalah yang telah diketahui pada error inisialisasi Docker.
  1. Selanjutnya, cari learn-terraform-import/docker.tf.

  2. Di bawah kode yang telah dijadikan sebagai komentar, definisikan resource docker_container kosong di file docker.tf Anda, yang mewakili container Docker dengan ID resource Terraform docker_container.web:

resource "docker_container" "web" {}
  1. Temukan nama container yang ingin Anda impor: dalam hal ini, container yang Anda buat di langkah sebelumnya:
docker ps
  1. Jalankan perintah terraform import berikut untuk memasang container Docker yang sudah ada pada resource docker_container.web yang baru saja Anda buat. Impor Terraform memerlukan ID resource Terraform ini dan ID lengkap container Docker. Perintah docker inspect -f {{.ID}} hashicorp-learn akan menampilkan ID container SHA256 lengkap:
terraform import docker_container.web $(docker inspect -f {{.ID}} hashicorp-learn) Catatan: ID yang diterima oleh terraform import bervariasi berdasarkan jenis resource dan didokumentasikan dalam dokumentasi penyedia untuk setiap resource yang dapat diimpor ke Terraform. Untuk contoh ini, baca dokumentasi penyedia Docker
  1. Pastikan bahwa container telah diimpor ke status Terraform Anda:
terraform show

Status ini berisi segala sesuatu yang diketahui oleh Terraform mengenai container Docker yang baru saja Anda impor. Namun demikian, impor Terraform tidak membuat konfigurasi untuk resource.

Buat konfigurasi

Anda perlu membuat konfigurasi Terraform sebelum Anda dapat menggunakan Terraform untuk mengelola container ini.

  1. Jalankan kode berikut:
terraform plan Catatan: Terraform akan menampilkan error jika tidak ada argumen image and name yang diperlukan. Terraform tidak dapat membuat rencana untuk resource yang tidak memiliki argumen yang diperlukan.

Ada dua pendekatan untuk memperbarui konfigurasi di docker.tf agar sesuai dengan status yang Anda impor. Anda dapat menerima keseluruhan status saat ini dari resource ke dalam konfigurasi Anda apa adanya atau memilih atribut yang diperlukan ke dalam konfigurasi Anda satu per satu. Masing-masing pendekatan ini dapat berguna dalam keadaan yang berbeda.

  • Menggunakan status saat ini sering kali lebih cepat, tapi dapat menghasilkan konfigurasi yang terlalu panjang karena setiap atribut disertakan dalam status, tanpa memandang apakah itu perlu disertakan dalam konfigurasi atau tidak.

  • Memilih atribut yang diperlukan satu per satu dapat menghasilkan konfigurasi yang lebih dapat dikelola, tapi mengharuskan Anda untuk memahami atribut mana yang perlu disetel dalam konfigurasi.

Untuk tujuan lab ini, Anda akan menggunakan status saat ini sebagai resource.

  1. Salin status Terraform Anda ke file docker.tf:
terraform show -no-color > docker.tf Catatan: Simbol > akan mengganti seluruh isi docker.tf dengan output perintah terraform show. Meskipun ini berfungsi untuk contoh ini, mengimpor resource ke konfigurasi yang sudah mengelola resource akan mengharuskan Anda untuk mengedit output terraform show untuk menghapus resource yang sudah ada yang konfigurasinya tidak ingin Anda ganti secara keseluruhan dan menggabungkan resource baru ke dalam konfigurasi Anda yang sudah ada.
  1. Periksa file docker.tf untuk melihat bahwa isinya telah diganti dengan output perintah terraform show yang baru saja Anda jalankan.

  2. Jalankan kode berikut:

terraform plan

Terraform akan menampilkan peringatan dan error tentang argumen yang tidak digunakan lagi ('link'), dan beberapa argumen hanya baca (ip_address, network_data, gateway, ip_prefix_length, id).

Argumen hanya baca ini adalah nilai-nilai yang disimpan oleh Terraform dalam statusnya untuk container Docker tapi tidak dapat disetel melalui konfigurasi karena dikelola secara internal oleh Docker. Terraform dapat menyetel argumen link dengan konfigurasi, tapi akan tetap menampilkan peringatan karena tidak digunakan lagi dan mungkin tidak didukung oleh versi penyedia Docker di masa mendatang.

Karena pendekatan yang ditunjukkan di sini memuat semua atribut yang diwakili dalam status Terraform, konfigurasi Anda akan mencakup atribut opsional yang nilainya sama seperti nilai defaultnya. Atribut mana yang opsional, dan nilai-nilai defaultnya, akan bervariasi dari satu penyedia ke penyedia lain, dan tercantum dalam dokumentasi penyedia.

  1. Anda sekarang dapat menghapus atribut opsional ini secara selektif. Hapus semua atribut ini, dengan hanya mempertahankan atribut yang diperlukan: image, name, dan ports. Setelah menghapus atribut opsional ini, konfigurasi Anda seharusnya sesuai dengan berikut ini:
resource "docker_container" "web" { image = "sha256:87a94228f133e2da99cb16d653cd1373c5b4e8689956386c1c12b60a20421a02" name = "hashicorp-learn" ports { external = 8080 internal = 80 ip = "0.0.0.0" protocol = "tcp" } }

Saat mengimpor infrastruktur nyata, baca dokumentasi penyedia untuk mempelajari apa fungsi dari masing-masing argumen. Ini akan membantu Anda menentukan cara menangani setiap error atau peringatan dari langkah plan. Misalnya, dokumentasi untuk argumen links berada di dokumentasi penyedia Docker.

  1. Pastikan bahwa error telah diatasi:
terraform plan

Rencana sekarang seharusnya akan berhasil dieksekusi. Perhatikan bahwa rencana mengindikasikan bahwa Terraform akan memperbarui container untuk menambahkan atribut attach, logs, must_run, dan start.

Terraform menggunakan atribut ini untuk membuat container Docker, tapi Docker tidak menyimpannya. Sebagai akibatnya, terraform import tidak memuat nilai-nilainya ke status. Saat Anda merencanakan dan menerapkan konfigurasi, penyedia Docker akan menetapkan nilai-nilai default untuk atribut ini dan menyimpannya dalam status, tapi nilai-nilai tersebut tidak akan memengaruhi container yang sedang berjalan.

  1. Terapkan perubahan dan selesaikan proses sinkronisasi konfigurasi dan status Terraform yang telah diperbarui dengan container Docker yang diwakili oleh perubahan tersebut. Ketik yes pada prompt untuk mengonfirmasi.
terraform apply

Sekarang file konfigurasi, status Terraform, dan container semuanya telah sinkron, dan Anda dapat menggunakan Terraform untuk mengelola container Terraform seperti biasa.

Membuat resource image

Dalam beberapa kasus, Anda dapat membawa resource ke dalam kontrol Terraform tanpa menggunakan perintah terraform import. Ini seringkali merupakan kasus untuk resource yang didefinisikan oleh satu ID atau tag unik, seperti image Docker.

Di file docker.tf, resource docker_container.web menentukan ID hash SHA256 dari image yang digunakan untuk membuat container. Ini adalah cara docker menyimpan ID image secara internal, dan oleh karena itu terraform import memuat ID image secara langsung ke status Anda. Namun demikian, ID image mungkin tidak dapat dibaca manusia semudah tag atau nama image, dan mungkin tidak sesuai dengan intent Anda. Misalnya, Anda mungkin ingin menggunakan versi terbaru image "nginx".

  1. Untuk mengambil nama tag image, jalankan perintah berikut, dengan mengganti <IMAGE-ID> dengan ID image dari docker.tf:
docker image inspect -f {{.RepoTags}}
  1. Tambahkan konfigurasi berikut ke file docker.tf untuk menampilkan image ini sebagai resource:
resource "docker_image" "nginx" { name = "nginx:latest" } Catatan: Jangan mengganti nilai image di resource docker_container.web pada saat ini, atau Terraform akan menghancurkan dan membuat ulang container Anda. Karena Terraform belum memuat resource docker_image.nginx ke status, tidak ada ID image yang dapat dibandingkan oleh Terraform dengan ID image yang di-hardcode, yang akan menyebabkan Terraform berasumsi bahwa container harus diganti. Sebagai solusi sementara atas situasi ini, buat image terlebih dahulu, lalu perbarui container untuk menggunakannya, seperti yang ditunjukkan di lab ini.
  1. Buat resource image di status:
terraform apply

Karena sekarang Terraform telah membuat resource untuk image, Anda dapat merujuknya dalam konfigurasi container Anda.

  1. Ubah nilai image untuk docker_container.web untuk merujuk resource image yang baru:
resource "docker_container" "web" { image = docker_image.nginx.image_id name = "hashicorp-learn" ports { external = 8080 internal = 80 ip = "0.0.0.0" protocol = "tcp" } }
  1. Cari perubahan:
terraform apply

Karena docker_image.nginx.latest akan cocok dengan ID image hardcoded yang Anda ganti, menjalankan terraform apply pada saat ini tidak akan menunjukkan perubahan apa pun.

Catatan: Jika ID image untuk tag "nginx:latest" berubah antara waktu Anda pertama kali membuat container Docker dan saat Anda menjalankan perintah ini, container akan dihancurkan dan dibuat ulang dengan image baru.

Mengelola container dengan Terraform

Karena sekarang Terraform dapat mengelola container Docker, gunakan Terraform untuk mengubah konfigurasi

  1. Di file docker.tf Anda, ubah port eksternal container dari 8080 menjadi 8081:
resource "docker_container" "web" { name = "hashicorp-learn" image = docker_image.nginx.image_id ports { external = 8081 internal = 80 ip = "0.0.0.0" protocol = "tcp" } }
  1. Terapkan perubahan:
terraform apply

Ketik yes pada prompt untuk mengonfirmasi.

Ini akan menyebabkan Terraform menghancurkan dan membuat ulang container dengan konfigurasi port yang baru.

  1. Pastikan bahwa container telah diganti dengan container baru dengan konfigurasi baru:
docker ps

Perhatikan bahwa ID container telah berubah. Karena perubahan konfigurasi port mengharuskannya dihancurkan dan dibuat ulang, ini adalah container yang benar-benar baru.

Menghancurkan infrastruktur

Anda sekarang telah mengimpor container Docker Anda dan image yang digunakan untuk membuatnya ke Terraform.

  1. Hancurkan container dan image:
terraform destroy

Ketik yes pada prompt untuk mengonfirmasi.

  1. Validasikan bahwa container telah dihancurkan:
docker ps --filter "name=hashicorp-learn" Catatan: Karena Anda telah menambahkan image ke konfigurasi Terraform dan container, image akan dihapus dari Docker dan container. Jika container lain sedang menggunakan image yang sama, langkah hancurkan akan gagal. Ingat bahwa mengimpor resource ke Terraform berarti bahwa Terraform akan mengelola keseluruhan siklus proses resource, termasuk penghancuran.

Keterbatasan dan pertimbangan lain

Ada beberapa hal penting yang harus dipertimbangkan saat mengimpor resource ke Terraform.

Impor Terraform hanya dapat mengetahui status saat ini infrastruktur seperti yang dilaporkan oleh penyedia Terraform. Impor Terraform tidak mengetahui:

  • Apakah infrastruktur bekerja dengan benar.
  • Tujuan infrastruktur.
  • Perubahan yang telah Anda buat pada infrastruktur yang tidak dikontrol oleh Terraform, misalnya, status sistem file container Docker.

Impor melibatkan langkah-langkah manual yang mungkin rentan terhadap error, khususnya jika orang yang mengimpor resource tidak mengetahui konteks bagaimana dan mengapa resource tersebut pada awalnya dibuat.

Impor akan memanipulasi file status Terraform; Anda mungkin ingin membuat cadangan sebelum mengimpor infrastruktur baru.

Impor Terraform tidak mendeteksi atau membuat hubungan antara infrastruktur.

Terraform tidak mendeteksi atribut default yang tidak perlu disetel di konfigurasi Anda.

Tidak semua penyedia dan resource mendukung impor Terraform.

Mengimpor infrastruktur ke Terraform tidak berarti bahwa infrastruktur tersebut dapat dihancurkan dan dibuat ulang oleh Terraform. Misalnya, infrastruktur yang diimpor dapat mengandalkan infrastruktur atau konfigurasi lain yang tidak dikelola.

Mengikuti praktik terbaik infrastruktur sebagai kode (IaC) seperti infrastruktur yang tidak dapat diubah dapat membantu mencegah banyak masalah ini, tapi infrastruktur yang dibuat secara manual kemungkinan besar tidak mengikuti praktik terbaik IaC.

Alat seperti Terraformer dapat mengotomatiskan beberapa langkah manual yang terkait dengan pengimporan infrastruktur. Namun demikian, alat-alat ini bukan bagian dari Terraform itu sendiri dan tidak dipromosikan atau didukung oleh HashiCorp.

Selamat!

Di lab ini, Anda telah mempelajari cara mengelola backend dan status dengan Terraform. Anda telah membuat backend lokal dan backend Cloud Storage untuk mengelola file status Anda, me-refresh status Anda, dan mengimpor konfigurasi ke Terraform. Anda kemudian telah memperbarui konfigurasi dan secara manual mengeditnya untuk mengelola container Docker secara penuh dengan Terraform.

Langkah berikutnya/Pelajari lebih lanjut

Pastikan untuk memeriksa referensi berikut untuk menerima lebih banyak praktik langsung dengan Terraform:

Sertifikasi dan pelatihan Google Cloud

...membantu Anda mengoptimalkan teknologi Google Cloud. Kelas kami mencakup keterampilan teknis dan praktik terbaik untuk membantu Anda memahami dengan cepat dan melanjutkan proses pembelajaran. Kami menawarkan pelatihan tingkat dasar hingga lanjutan dengan opsi on demand, live, dan virtual untuk menyesuaikan dengan jadwal Anda yang sibuk. Sertifikasi membantu Anda memvalidasi dan membuktikan keterampilan serta keahlian Anda dalam teknologi Google Cloud.

Manual Terakhir Diperbarui pada 26 Januari 2024

Lab Terakhir Diuji pada 11 Desember 2023

Hak cipta 2024 Google LLC Semua hak dilindungi undang-undang. Google dan logo Google adalah merek dagang dari Google LLC. Semua nama perusahaan dan produk lain mungkin adalah merek dagang masing-masing perusahaan yang bersangkutan.