Checkpoint
Working with Backends
/ 100
Mengelola Status Terraform
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
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).
- Waktu untuk menyelesaikan lab. Ingat, setelah dimulai, lab tidak dapat dijeda.
Cara memulai lab dan login ke Google Cloud Console
-
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 info berikut:
- Tombol Open Google Cloud console
- Waktu tersisa
- Kredensial sementara yang harus Anda gunakan untuk lab ini
- Informasi lain, jika diperlukan, untuk menyelesaikan lab ini
-
Klik Open Google Cloud console (atau klik kanan dan pilih Open Link in Incognito Window jika Anda menjalankan browser Chrome).
Lab akan menjalankan resource, lalu membuka tab lain yang menampilkan halaman Sign in.
Tips: Atur tab di jendela terpisah secara berdampingan.
Catatan: Jika Anda melihat dialog Choose an account, klik Use Another Account. -
Jika perlu, salin Username di bawah dan tempel ke dialog Sign in.
{{{user_0.username | "Username"}}} Anda juga dapat menemukan Username di panel Lab Details.
-
Klik Next.
-
Salin Password di bawah dan tempel ke dialog Welcome.
{{{user_0.password | "Password"}}} Anda juga dapat menemukan Password di panel Lab Details.
-
Klik Next.
Penting: Anda harus menggunakan kredensial yang diberikan lab. Jangan menggunakan kredensial akun Google Cloud Anda. Catatan: Menggunakan akun Google Cloud sendiri untuk lab ini dapat dikenai biaya tambahan. -
Klik halaman berikutnya:
- Setujui persyaratan dan ketentuan.
- Jangan tambahkan opsi pemulihan atau autentikasi 2 langkah (karena ini akun sementara).
- Jangan mendaftar uji coba gratis.
Setelah beberapa saat, Konsol Google Cloud akan terbuka di tab ini.
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.
- Klik 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:
gcloud
adalah alat command line untuk Google Cloud. Alat ini sudah terinstal di Cloud Shell dan mendukung pelengkapan command line.
- (Opsional) Anda dapat menampilkan daftar nama akun yang aktif dengan perintah ini:
-
Klik Authorize.
-
Output Anda sekarang akan terlihat seperti ini:
Output:
- (Opsional) Anda dapat menampilkan daftar project ID dengan perintah ini:
Output:
Contoh output:
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.
- Di jendela Cloud Shell baru, buat file konfigurasi
main.tf
:
- Untuk mengambil Project ID Anda, jalankan perintah berikut:
- 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.
- Salin kode resource bucket Cloud Storage ke file konfigurasi
main.tf
Anda, dengan mengganti definisi variabelproject
danname
dengan Project ID Anda:
Pelajari lebih lanjut tentang resource Cloud Storage dari Dokumentasi Terraform.
- Tambahkan backend lokal ke file
main.tf
Anda:
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.
- Di toolbar Cloud Shell, klik Open Terminal, lalu lakukan inisialisasi Terraform:
- Terapkan perubahan. Ketik yes pada prompt untuk mengonfirmasi:
Sekarang, Editor Cloud Shell seharusnya akan menampilkan file status bernama terraform.tfstate
di direktori terraform/state
.
- Periksa file status Anda:
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.
-
Kembali ke file
main.tf
Anda di editor. Anda sekarang akan mengganti backend lokal saat ini dengan backendgcs
. -
Untuk mengganti konfigurasi backend lokal yang sudah ada, salin konfigurasi berikut ke file Anda, dengan mengganti backend
local
:
bucket
. Jika Anda tidak mengubah konfigurasi, ini akan menjadi name
dari resource google_storage_bucket
. Bucket ini akan digunakan untuk menghosting file status.
- Lakukan inisialisasi backend Anda lagi, kali ini untuk memigrasikan status secara otomatis:
Ketik yes pada prompt untuk mengonfirmasi.
-
Di Konsol Cloud, pada Menu navigasi, klik Cloud Storage > Buckets.
-
Klik bucket Anda dan cari file
terraform/state/default.tfstate
. File status Anda sekarang berada di bucket Cloud Storage!
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.
-
Kembali ke bucket penyimpanan Anda di Konsol Cloud. Pilih kotak centang di sebelah nama.
-
Klik tab Labels.
-
Klik Add Label. Tetapkan Key 1 =
key
and Value 1 =value
. -
Klik Save.
-
Kembali ke Cloud Shell dan gunakan perintah berikut untuk memperbarui file status:
- Periksa pembaruan:
Pasangan nilai-kunci "key" = "value"
harus ditampilkan di atribut label konfigurasi.
Klik Check my progress untuk memverifikasi tujuan.
Mengosongkan ruang kerja Anda
Sebelum melanjutkan ke tugas selanjutnya, hancurkan infrastruktur yang disediakan.
- Pertama, kembalikan backend Anda ke
local
sehingga Anda dapat menghapus bucket penyimpanan. Salin dan ganti konfigurasigcs
dengan berikut ini:
- Lakukan inisialisasi backend
local
lagi:
Ketik yes pada prompt untuk mengonfirmasi.
- Pada file
main.tf
, tambahkan argumenforce_destroy = true
ke resourcegoogle_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:
- Terapkan perubahan:
Ketik yes
pada prompt untuk mengonfirmasi.
- Anda sekarang dapat menghancurkan infrastruktur Anda dengan sukses:
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.
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.
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.
terraform.tfstate
dan direktori .terraform
sebelum menggunakan impor Terraform pada proyek Terraform yang sebenarnya, dan simpan secara aman.
Membuat container Docker
- 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):
- Pastikan bahwa container sedang berjalan:
- Pada panel Cloud Shell, klik Web Preview, lalu klik Preview on port 8080.
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
- Clone repositori contoh:
- Ubah ke direktori tersebut:
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.
- Lakukan inisialisasi ruang kerja Terraform Anda:
terraform init -upgrade
-
Di Editor Cloud Shell, cari
learn-terraform-import/main.tf
. -
Temukan resource
provider: docker
dan jadikan sebagai komentar atau hapus argumenhost
:
-
Selanjutnya, cari
learn-terraform-import/docker.tf
. -
Di bawah kode yang telah dijadikan sebagai komentar, definisikan resource
docker_container
kosong di filedocker.tf
Anda, yang mewakili container Docker dengan ID resource Terraformdocker_container.web
:
- Temukan nama container yang ingin Anda impor: dalam hal ini, container yang Anda buat di langkah sebelumnya:
- Jalankan perintah
terraform import
berikut untuk memasang container Docker yang sudah ada pada resourcedocker_container.web
yang baru saja Anda buat. Impor Terraform memerlukan ID resource Terraform ini dan ID lengkap container Docker. Perintahdocker inspect -f {{.ID}} hashicorp-learn
akan menampilkan ID container SHA256 lengkap:
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
- Pastikan bahwa container telah diimpor ke status Terraform Anda:
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.
- Jalankan kode berikut:
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.
- Salin status Terraform Anda ke file
docker.tf
:
>
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.
-
Periksa file
docker.tf
untuk melihat bahwa isinya telah diganti dengan output perintah terraform show yang baru saja Anda jalankan. -
Jalankan kode berikut:
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.
- Anda sekarang dapat menghapus atribut opsional ini secara selektif. Hapus semua atribut ini, dengan hanya mempertahankan atribut yang diperlukan:
image
,name
, danports
. Setelah menghapus atribut opsional ini, konfigurasi Anda seharusnya sesuai dengan berikut ini:
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.
- Pastikan bahwa error telah diatasi:
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.
- 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.
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".
- Untuk mengambil nama tag image, jalankan perintah berikut, dengan mengganti
<IMAGE-ID>
dengan ID image daridocker.tf
:
- Tambahkan konfigurasi berikut ke file
docker.tf
untuk menampilkan image ini sebagai 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.
- Buat resource image di status:
Karena sekarang Terraform telah membuat resource untuk image, Anda dapat merujuknya dalam konfigurasi container Anda.
- Ubah nilai image untuk
docker_container.web
untuk merujuk resource image yang baru:
- Cari perubahan:
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.
Mengelola container dengan Terraform
Karena sekarang Terraform dapat mengelola container Docker, gunakan Terraform untuk mengubah konfigurasi
- Di file
docker.tf
Anda, ubah port eksternal container dari8080
menjadi8081
:
- Terapkan perubahan:
Ketik yes
pada prompt untuk mengonfirmasi.
Ini akan menyebabkan Terraform menghancurkan dan membuat ulang container dengan konfigurasi port yang baru.
- Pastikan bahwa container telah diganti dengan container baru dengan konfigurasi baru:
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.
- Hancurkan container dan image:
Ketik yes
pada prompt untuk mengonfirmasi.
- Validasikan bahwa container telah dihancurkan:
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:
- Hashicorp di Google Cloud Marketplace!
- Hashicorp Learn
- Komunitas Terraform
- Contoh Google 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.