arrow_back

Berinteraksi dengan Modul Terraform

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

Berinteraksi dengan Modul 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 dengan partner kami, Hashicorp. Informasi Anda mungkin akan dibagikan kepada Hashicorp, yaitu sponsor lab ini, jika Anda memilih untuk menerima info terbaru terkait produk, pengumuman, dan penawaran di Profil Akun Anda.

GSP751

Lab Mandiri Google Cloud

Ringkasan

Saat Anda mengelola infrastruktur dengan Terraform, konfigurasi yang semakin kompleks akan terbentuk. Tidak ada batasan intrinsik terhadap kompleksitas satu file atau direktori konfigurasi Terraform, sehingga Anda dapat terus menulis dan mengupdate file konfigurasi Anda dalam satu direktori. Namun, jika Anda melakukannya, Anda mungkin akan mengalami satu atau beberapa masalah berikut:

  • Memahami dan menavigasi file konfigurasi akan menjadi semakin sulit.
  • Mengupdate konfigurasi akan menjadi lebih berisiko, karena update pada satu blok dapat menyebabkan konsekuensi yang tidak diinginkan pada blok lain dari konfigurasi Anda.
  • Duplikasi blok konfigurasi serupa dapat meningkat, misalnya, saat Anda mengonfigurasi lingkungan pengembangan/staging/produksi terpisah, yang akan menyebabkan peningkatan beban saat mengupdate bagian konfigurasi tersebut.
  • Jika Anda ingin berbagi bagian konfigurasi antar-project dan tim, memotong dan menempelkan blok konfigurasi antar-project bisa rawan kesalahan dan sulit dipelihara.

Di lab ini, Anda akan mempelajari bagaimana modul dapat mengatasi masalah ini, mempelajari struktur modul Terraform, dan praktik terbaik saat menggunakan dan membuat modul.

Apa kegunaan modul?

Berikut adalah beberapa cara modul membantu memecahkan masalah yang tercantum di atas:

  • Mengatur konfigurasi: Modul mempermudah navigasi, memahami, dan mengupdate konfigurasi Anda dengan menyatukan bagian-bagian terkait konfigurasi Anda. Bahkan infrastruktur yang kerumitannya sedang pun memerlukan ratusan atau ribuan baris konfigurasi untuk diterapkan. Dengan menggunakan modul, Anda dapat mengatur konfigurasi menjadi komponen-komponen logis.

  • Mengenkapsulasi konfigurasi: Manfaat lain dalam menggunakan modul adalah mengenkapsulasi konfigurasi menjadi komponen-komponen logis yang berbeda. Enkapsulasi dapat membantu mencegah konsekuensi yang tidak diinginkan, seperti perubahan pada satu bagian konfigurasi yang secara tidak sengaja menyebabkan perubahan pada infrastruktur lain, dan mengurangi kemungkinan kesalahan sederhana seperti penggunaan nama yang sama untuk dua resource berbeda.

  • Menggunakan kembali konfigurasi: Menulis semua konfigurasi Anda tanpa menggunakan kode yang ada dapat memakan waktu dan rawan kesalahan. Menggunakan modul dapat menghemat waktu dan mengurangi kesalahan yang merugikan dengan menggunakan kembali konfigurasi yang ditulis oleh Anda sendiri, anggota tim Anda yang lain, atau praktisi Terraform lain yang telah menerbitkan modul untuk Anda gunakan. Anda juga dapat berbagi modul yang telah Anda tulis dengan tim Anda atau masyarakat umum, sehingga mereka dapat memperoleh manfaat dari kerja keras Anda.

  • Memberikan konsistensi dan memastikan praktik terbaik: Modul juga membantu memberikan konsistensi dalam konfigurasi Anda. Konsistensi membuat konfigurasi kompleks jadi lebih mudah dipahami, dan juga membantu memastikan bahwa praktik terbaik diterapkan di seluruh konfigurasi Anda. Misalnya, penyedia cloud menawarkan banyak opsi untuk mengonfigurasi layanan penyimpanan objek, seperti Amazon S3 (Simple Storage Service) atau bucket Cloud Storage Google. Banyak insiden keamanan tingkat tinggi yang melibatkan penyimpanan objek yang salah diamankan, dan karena banyaknya opsi konfigurasi kompleks yang terlibat, kesalahan konfigurasi layanan ini bisa terjadi secara tidak sengaja.

Menggunakan modul dapat membantu mengurangi kesalahan ini. Misalnya, Anda dapat membuat modul untuk menjelaskan bagaimana semua bucket situs publik organisasi Anda akan dikonfigurasi, dan modul lain untuk bucket pribadi yang digunakan untuk aplikasi pencatatan log. Selain itu, jika konfigurasi untuk suatu jenis resource perlu diupdate, penggunaan modul memungkinkan Anda membuat update tersebut di satu tempat dan menerapkannya ke semua kasus saat Anda menggunakan modul ini.

Tujuan

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

  • Menggunakan modul dari Registry
  • Membangun modul

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.

Apa itu modul Terraform?

Modul Terraform adalah sekumpulan file konfigurasi Terraform dalam satu direktori. Bahkan konfigurasi sederhana yang terdiri atas satu direktori dengan satu atau beberapa file .tf adalah sebuah modul. Jika Anda menjalankan perintah Terraform langsung dari direktori seperti itu, hal ini akan dianggap sebagai modul root. Jadi dalam hal ini, tiap konfigurasi Terraform adalah bagian dari sebuah modul. Anda mungkin memiliki sekumpulan file konfigurasi Terraform sederhana seperti ini:

├── LICENSE ├── README.md ├── main.tf ├── variables.tf ├── outputs.tf

Dalam hal ini, saat Anda menjalankan perintah Terraform dari dalam direktori minimal-module, konten direktori tersebut akan dianggap sebagai modul root.

Memanggil modul

Perintah Terraform hanya akan langsung menggunakan file konfigurasi dalam satu direktori, yang biasanya merupakan direktori kerja saat ini. Namun, konfigurasi Anda dapat menggunakan blok modul untuk memanggil modul di direktori lain. Ketika menemukan blok modul, Terraform akan memuat dan memproses file konfigurasi modul tersebut.

Modul yang dipanggil oleh konfigurasi lain terkadang disebut sebagai "modul turunan" dari konfigurasi tersebut.

Modul lokal dan jarak jauh

Modul dapat dimuat dari sistem file lokal atau sumber jarak jauh. Terraform mendukung berbagai sumber jarak jauh, termasuk Terraform Registry, sebagian besar sistem kontrol versi, URL HTTP, dan registry modul pribadi Terraform Cloud atau Terraform Enterprise.

Praktik terbaik modul

Dalam banyak hal, modul Terraform mirip dengan konsep library, paket, atau modul yang ditemukan di sebagian besar bahasa pemrograman, dan memberikan banyak manfaat yang sama. Sama seperti hampir semua program komputer rumit, konfigurasi Terraform di dunia nyata hampir selalu menggunakan modul untuk memberikan manfaat yang disebutkan di atas.

Tiap praktisi Terraform disarankan menggunakan modul dengan mengikuti praktik terbaik berikut:

  • Mulailah menulis konfigurasi Anda dengan rencana modul. Bahkan untuk konfigurasi Terraform yang sedikit rumit dan dikelola oleh satu orang, manfaat penggunaan modul akan lebih besar daripada waktu yang diperlukan untuk menggunakannya dengan benar.

  • Gunakan modul lokal untuk mengatur dan mengenkapsulasi kode Anda. Meskipun Anda tidak menggunakan atau memublikasikan modul jarak jauh, mengatur konfigurasi dalam bentuk modul sejak awal akan secara signifikan mengurangi beban pemeliharaan dan update konfigurasi seiring dengan semakin kompleksnya infrastruktur Anda.

  • Gunakan Terraform Registry publik untuk menemukan modul yang berguna. Dengan cara ini, Anda dapat dengan cepat dan percaya diri mengimplementasikan konfigurasi Anda dengan mengandalkan pekerjaan orang lain.

  • Publikasikan dan bagikan modul dengan tim Anda. Sebagian besar infrastruktur dikelola oleh tim yang terdiri atas sejumlah orang, dan modul adalah alat penting yang dapat digunakan tim untuk membuat dan memelihara infrastruktur. Seperti disebutkan sebelumnya, Anda dapat memublikasikan modul baik secara publik atau pribadi. Anda akan melihat cara melakukannya di lab berikutnya dalam serial ini.

Tugas 1. Menggunakan modul dari Registry

Di bagian ini, Anda akan menggunakan modul dari Terraform Registry untuk menyediakan lingkungan contoh di Google Cloud. Konsep yang Anda gunakan di sini akan berlaku untuk segala modul dari semua sumber.

  • Buka halaman Terraform Registry untuk modul Terraform Network di tab atau jendela browser baru. Halamannya akan terlihat seperti ini:

Halaman Terraform Registry

Halaman ini berisi informasi tentang modul dan link ke repositori sumber. Sisi kanan halaman mencakup antarmuka dropdown untuk memilih versi modul dan petunjuk penggunaan modul guna menyediakan infrastruktur.

Saat memanggil modul, diperlukan argumen source. Dalam contoh ini, Terraform akan mencari modul di Terraform Registry yang cocok dengan string yang diberikan. Anda juga dapat menggunakan URL atau jalur file lokal untuk sumber modul Anda. Baca dokumentasi Terraform untuk mengetahui daftar sumber modul yang mungkin digunakan.

Argumen lain yang ditampilkan di sini adalah version. Untuk sumber yang didukung, version akan memungkinkan Anda menentukan versi modul apa yang akan dimuat. Di lab ini, Anda akan menentukan nomor versi yang pasti untuk modul yang Anda gunakan. Anda dapat membaca cara lainnya untuk menentukan versi dalam dokumentasi modul.

Argumen lain pada blok modul diperlakukan sebagai variabel input ke modul.

Membuat konfigurasi Terraform

  1. Untuk memulai, jalankan perintah berikut di Cloud Shell untuk meng-clone contoh project sederhana dari repositori GitHub modul Terraform Google lalu beralihlah ke cabang v6.0.1:
git clone https://github.com/terraform-google-modules/terraform-google-network cd terraform-google-network git checkout tags/v6.0.1 -b v6.0.1

Hal ini memastikan Anda menggunakan nomor versi yang benar.

  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 a new window untuk membiarkan Editor terbuka di tab terpisah.

  2. Pada editor, buka terraform-google-network/examples/simple_project, dan buka file main.tf. Konfigurasi main.tf Anda akan terlihat seperti ini:

module "test-vpc-module" { source = "terraform-google-modules/network/google" version = "~> 6.0" project_id = var.project_id # Replace this with your project ID network_name = "my-custom-mode-network" mtu = 1460 subnets = [ { subnet_name = "subnet-01" subnet_ip = "10.10.10.0/24" subnet_region = "us-west1" }, { subnet_name = "subnet-02" subnet_ip = "10.10.20.0/24" subnet_region = "us-west1" subnet_private_access = "true" subnet_flow_logs = "true" }, { subnet_name = "subnet-03" subnet_ip = "10.10.30.0/24" subnet_region = "us-west1" subnet_flow_logs = "true" subnet_flow_logs_interval = "INTERVAL_10_MIN" subnet_flow_logs_sampling = 0.7 subnet_flow_logs_metadata = "INCLUDE_ALL_METADATA" subnet_flow_logs_filter = "false" } ] }

Konfigurasi ini mencakup satu blok penting:

  • module "test-vpc-module" menetapkan Virtual Private Cloud (VPC), yang akan menyediakan layanan jaringan untuk seluruh infrastruktur Anda.

Menetapkan nilai untuk variabel input modul

Beberapa variabel input wajib ada, yang berarti modul tidak akan memberikan nilai default. Nilai eksplisit harus diberikan agar Terraform dapat berjalan dengan benar.

  • Dalam blok "test-vpc-module" modul, tinjau variabel input yang Anda setel. Masing-masing variabel input ini didokumentasikan di Terraform Registry. Input yang diperlukan untuk modul ini adalah:

    • network_name: Nama jaringan yang sedang dibuat
    • project_id: ID dari project tempat VPC ini akan dibuat
    • subnets: Daftar subnet yang sedang dibuat

Untuk menggunakan sebagian besar modul, Anda perlu meneruskan variabel input ke konfigurasi modul. Konfigurasi yang memanggil modul bertanggung jawab untuk mengatur nilai inputnya, yang akan diteruskan sebagai argumen ke blok modul. Selain source dan version, sebagian besar argumen pada blok modul akan menetapkan nilai variabel.

Di halaman Terraform Registry untuk modul jaringan Google Cloud, tab Inputs menjelaskan semua variabel input yang didukung modul.

Menetapkan variabel input root

Menggunakan variabel input dengan modul sangat mirip dengan cara menggunakan variabel dalam konfigurasi Terraform apa pun. Pola yang umum adalah mengidentifikasi variabel input modul yang mungkin ingin Anda ubah di masa mendatang, lalu membuat variabel yang sama di file variables.tf konfigurasi Anda dengan nilai default yang logis. Variabel-variabel tersebut kemudian dapat diteruskan ke blok modul sebagai argumen.

  1. Untuk mengambil project ID Anda, jalankan perintah berikut di Cloud Shell:
gcloud config list --format 'value(core.project)'
  1. Di Editor, masih di direktori yang sama, buka variables.tf.

  2. Isi variabel project_id dengan output dari perintah sebelumnya. Anda harus mengikuti format di bawah ini dan menetapkan nilai default untuk variabel:

variable "project_id" { description = "The project ID to host the network in" default = "FILL IN YOUR PROJECT ID HERE" }
  1. Pada variables.tf, tambahkan variabel network_name. Anda dapat menggunakan nama example-vpc atau nama lain yang Anda inginkan. Anda harus mengikuti format di bawah ini dan menetapkan nilai default untuk variabel:
variable "network_name" { description = "The name of the VPC network being created" default = "example-vpc" }
  1. Kembali ke file main.tf, update parameter network_name untuk menggunakan variabel yang baru saja Anda tetapkan dengan mengatur nilainya ke var.network_name.
module "test-vpc-module" { ... project_id = var.project_id network_name = var.network_name ...
  1. Pada file main.tf, update region subnet pada baris 35, 40, dan 47 dari us-west1 ke . Hal ini akan memastikan bahwa subnet dibuat di region yang diizinkan di project Anda. Modul Anda harus menyerupai yang berikut ini:
subnets = [ { subnet_name = "subnet-01" subnet_ip = "10.10.10.0/24" subnet_region = "{{{project_0.default_region | REGION}}}" }, { subnet_name = "subnet-02" subnet_ip = "10.10.20.0/24" subnet_region = "{{{project_0.default_region | REGION}}}" subnet_private_access = "true" subnet_flow_logs = "true" }, { subnet_name = "subnet-03" subnet_ip = "10.10.30.0/24" subnet_region = "{{{project_0.default_region | REGION}}}" ... .. }

Menetapkan nilai output root

Modul juga memiliki nilai output, yang ditetapkan dalam modul dengan kata kunci output. Anda dapat mengaksesnya dengan merujuk ke module.<MODULE NAME>.<OUTPUT NAME>. Seperti halnya variabel input, output modul tercantum di bawah tab outputs pada Terraform Registry.

Output modul biasanya diteruskan ke bagian lain konfigurasi Anda atau ditetapkan sebagai output di modul root Anda. Anda akan melihat kedua kegunaannya di lab ini.

  • Buka file outputs.tf dalam direktori konfigurasi Anda. Verifikasi bahwa file tersebut berisi yang berikut ini:
output "network_name" { value = module.test-vpc-module.network_name description = "The name of the VPC being created" } output "network_self_link" { value = module.test-vpc-module.network_self_link description = "The URI of the VPC being created" } output "project_id" { value = module.test-vpc-module.project_id description = "VPC project id" } output "subnets_names" { value = module.test-vpc-module.subnets_names description = "The names of the subnets being created" } output "subnets_ips" { value = module.test-vpc-module.subnets_ips description = "The IP and cidrs of the subnets being created" } output "subnets_regions" { value = module.test-vpc-module.subnets_regions description = "The region where subnets will be created" } output "subnets_private_access" { value = module.test-vpc-module.subnets_private_access description = "Whether the subnets will have access to Google API's without a public IP" } output "subnets_flow_logs" { value = module.test-vpc-module.subnets_flow_logs description = "Whether the subnets will have VPC flow logs enabled" } output "subnets_secondary_ranges" { value = module.test-vpc-module.subnets_secondary_ranges description = "The secondary ranges associated with these subnets" } output "route_names" { value = module.test-vpc-module.route_names description = "The routes associated with this VPC" }

Menyediakan infrastruktur

  1. Pada Cloud Shell, buka direktori simple_project Anda:
cd ~/terraform-google-network/examples/simple_project
  1. Lakukan inisialisasi pada konfigurasi Terraform Anda:
terraform init
  1. Buat VPC:
terraform apply
  1. Untuk menerapkan perubahan dan melanjutkan, tanggapi prompt dengan yes.

Bagus. Anda baru saja menggunakan modul pertama Anda. Output konfigurasi Anda akan terlihat seperti ini:

Outputs: network_name = "example-vpc" network_self_link = "https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-01-a68489b0625b/global/networks/example-vpc" project_id = "" route_names = [] subnets_flow_logs = [ false, true, true, ] subnets_ips = [ "10.10.10.0/24", "10.10.20.0/24", "10.10.30.0/24", ] subnets_names = [ "subnet-01", "subnet-02", "subnet-03", ] .... ....

Memahami cara kerja modul

Saat menggunakan modul baru untuk pertama kalinya, Anda harus menjalankan terraform init atau terraform get untuk menginstal modul. Saat salah satu dari perintah ini dijalankan, Terraform akan menginstal modul baru di direktori .terraform/modules dalam direktori kerja konfigurasi Anda. Untuk modul lokal, Terraform akan membuat symlink ke direktori modul. Oleh sebab itu, tiap perubahan pada modul lokal akan langsung berlaku, tanpa Anda harus menjalankan terraform get lagi.

Mengosongkan infrastruktur Anda

Sekarang Anda telah mengetahui cara menggunakan modul dari Terraform Registry, cara mengonfigurasi modul tersebut dengan variabel input, dan cara mendapatkan nilai output dari modul tersebut.

  1. Hancurkan infrastruktur yang Anda buat:
terraform destroy
  1. Tanggapi prompt tersebut dengan yes. Terraform akan menghancurkan infrastruktur yang Anda buat.

  2. Setelah menghancurkan resource Anda, hapus folder terraform-google-network.

cd ~ rm -rd terraform-google-network -f

Klik Check my progress untuk memverifikasi tujuan. Menyediakan infrastruktur.

Tugas 2. Membangun modul

Pada tugas terakhir, Anda menggunakan modul dari Terraform Registry untuk membuat jaringan VPC di Google Cloud. Meskipun menggunakan modul Terraform yang ada dengan benar merupakan keterampilan yang penting, tiap praktisi Terraform juga akan mendapatkan manfaat dari mempelajari cara membuat modul. Kami menyarankan Anda untuk membuat tiap konfigurasi Terraform dengan asumsi bahwa konfigurasi tersebut dapat digunakan sebagai modul, karena hal ini akan membantu Anda mendesain konfigurasi agar fleksibel, dapat digunakan kembali, dan dapat disusun.

Seperti yang mungkin sudah Anda ketahui, Terraform memperlakukan tiap konfigurasi sebagai sebuah modul. Saat Anda menjalankan perintah terraform, atau menggunakan Terraform Cloud atau Terraform Enterprise untuk menjalankan Terraform dari jarak jauh, direktori target yang berisi konfigurasi Terraform akan diperlakukan sebagai modul root.

Dalam tugas ini, Anda akan membuat modul untuk mengelola bucket Cloud Storage yang digunakan untuk menghosting situs statis.

Struktur modul

Terraform memperlakukan direktori lokal apa pun yang direferensikan dalam argumen source dari blok module sebagai modul. Struktur file tipikal untuk modul baru adalah:

├── LICENSE ├── README.md ├── main.tf ├── variables.tf ├── outputs.tf Catatan: Tak satu pun dari file ini yang diperlukan atau memiliki arti khusus bagi Terraform saat menggunakan modul Anda. Anda dapat membuat modul dengan satu file .tf atau menggunakan struktur file lain yang Anda inginkan.

Masing-masing file ini memiliki tujuan:

  • LICENSE berisi lisensi untuk mendistribusikan modul Anda. Saat Anda membagikan modul Anda, file LICENSE akan membuat orang yang menggunakannya mengetahui persyaratan penyediaan modul tersebut. Terraform sendiri tidak menggunakan file ini.
  • README.md berisi dokumentasi dalam format markdown yang menjelaskan cara menggunakan modul Anda. Terraform tidak menggunakan file ini, tetapi layanan seperti Terraform Registry dan GitHub akan menampilkan konten file ini kepada pengunjung halaman Terraform Registry atau GitHub modul Anda.
  • main.tf berisi set konfigurasi utama untuk modul Anda. Anda juga dapat membuat file konfigurasi lain dan mengaturnya dengan cara yang sesuai untuk project Anda.
  • variables.tf berisi definisi variabel untuk modul Anda. Ketika modul Anda digunakan oleh orang lain, variabel akan dikonfigurasi sebagai argumen di blok modul. Karena semua nilai Terraform harus ditetapkan, semua variabel yang tidak memiliki nilai default akan menjadi argumen wajib. Variabel dengan nilai default juga dapat diberikan sebagai argumen modul, sehingga akan menggantikan nilai default.
  • outputs.tf berisi definisi output untuk modul Anda. Output modul tersedia untuk konfigurasi menggunakan modul, sehingga sering kali digunakan untuk meneruskan informasi tentang bagian infrastruktur Anda yang ditetapkan oleh modul ke bagian lain konfigurasi Anda.

Waspadai file-file ini dan pastikan Anda tidak mendistribusikannya sebagai bagian dari modul Anda:

  • File terraform.tfstate dan terraform.tfstate.backup berisi status Terraform Anda dan merupakan cara Terraform melacak hubungan antara konfigurasi Anda dan infrastruktur yang disediakan olehnya.
  • Direktori .terraform berisi modul dan plugin yang digunakan untuk menyediakan infrastruktur Anda. File-file ini khusus untuk masing-masing instance Terraform saat menyediakan infrastruktur, bukan konfigurasi infrastruktur yang ditentukan dalam file-file .tf.
  • File *.tfvars tidak perlu didistribusikan bersama modul Anda kecuali Anda juga menggunakannya sebagai konfigurasi Terraform mandiri karena variabel input modul disetel melalui argumen ke blok modul dalam konfigurasi Anda.
Catatan: Jika Anda melacak perubahan pada modul Anda di sistem kontrol versi seperti Git, Anda sebaiknya mengonfigurasi sistem kontrol versi Anda untuk mengabaikan file-file ini. Sebagai contoh, lihat file .gitignore ini dari GitHub.

Membuat modul

Buka direktori home dan buat modul root dengan membuat file konfigurasi main.tf yang baru. Kemudian buat direktori bernama modules yang berisi folder lain bernama gcs-static-website-bucket. Anda akan bekerja dengan tiga file konfigurasi Terraform di dalam direktori gcs-static-website-bucket: website.tf, variables.tf, dan outputs.tf.

  1. Buat direktori untuk modul baru Anda:
cd ~ touch main.tf mkdir -p modules/gcs-static-website-bucket
  1. Buka direktori modul dan jalankan perintah berikut untuk membuat tiga file kosong:
cd modules/gcs-static-website-bucket touch website.tf variables.tf outputs.tf
  1. Pada direktori gcs-static-website-bucket, jalankan perintah berikut untuk membuat file bernama README.md dengan konten berikut:
tee -a README.md <<EOF # GCS static website bucket This module provisions Cloud Storage buckets configured for static website hosting. EOF Catatan: Memilih lisensi yang tepat untuk modul Anda tidak termasuk dalam cakupan lab ini. Lab ini akan menggunakan lisensi open source Apache 2.0.
  1. Buat file lain bernama LICENSE dengan konten berikut:
tee -a LICENSE <<EOF Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. EOF Catatan: Tak satu pun dari file ini yang diperlukan atau digunakan oleh Terraform. Memiliki file-file ini adalah praktik terbaik untuk modul yang mungkin dibagikan kepada orang lain.

Struktur direktori modul Anda saat ini akan terlihat seperti ini:

main.tf modules/ └── gcs-static-website-bucket ├── LICENSE ├── README.md ├── website.tf ├── outputs.tf └── variables.tf
  1. Tambahkan resource bucket Cloud Storage ini ke file website.tf di dalam direktori modules/gcs-static-website-bucket:
resource "google_storage_bucket" "bucket" { name = var.name project = var.project_id location = var.location storage_class = var.storage_class labels = var.labels force_destroy = var.force_destroy uniform_bucket_level_access = true versioning { enabled = var.versioning } dynamic "retention_policy" { for_each = var.retention_policy == null ? [] : [var.retention_policy] content { is_locked = var.retention_policy.is_locked retention_period = var.retention_policy.retention_period } } dynamic "encryption" { for_each = var.encryption == null ? [] : [var.encryption] content { default_kms_key_name = var.encryption.default_kms_key_name } } dynamic "lifecycle_rule" { for_each = var.lifecycle_rules content { action { type = lifecycle_rule.value.action.type storage_class = lookup(lifecycle_rule.value.action, "storage_class", null) } condition { age = lookup(lifecycle_rule.value.condition, "age", null) created_before = lookup(lifecycle_rule.value.condition, "created_before", null) with_state = lookup(lifecycle_rule.value.condition, "with_state", null) matches_storage_class = lookup(lifecycle_rule.value.condition, "matches_storage_class", null) num_newer_versions = lookup(lifecycle_rule.value.condition, "num_newer_versions", null) } } } }

Dokumentasi penyedia adalah GitHub.

  1. Buka file variables.tf di modul Anda dan tambahkan kode berikut:
variable "name" { description = "The name of the bucket." type = string } variable "project_id" { description = "The ID of the project to create the bucket in." type = string } variable "location" { description = "The location of the bucket." type = string } variable "storage_class" { description = "The Storage Class of the new bucket." type = string default = null } variable "labels" { description = "A set of key/value label pairs to assign to the bucket." type = map(string) default = null } variable "bucket_policy_only" { description = "Enables Bucket Policy Only access to a bucket." type = bool default = true } variable "versioning" { description = "While set to true, versioning is fully enabled for this bucket." type = bool default = true } variable "force_destroy" { description = "When deleting a bucket, this boolean option will delete all contained objects. If false, Terraform will fail to delete buckets which contain objects." type = bool default = true } variable "iam_members" { description = "The list of IAM members to grant permissions on the bucket." type = list(object({ role = string member = string })) default = [] } variable "retention_policy" { description = "Configuration of the bucket's data retention policy for how long objects in the bucket should be retained." type = object({ is_locked = bool retention_period = number }) default = null } variable "encryption" { description = "A Cloud KMS key that will be used to encrypt objects inserted into this bucket" type = object({ default_kms_key_name = string }) default = null } variable "lifecycle_rules" { description = "The bucket's Lifecycle Rules configuration." type = list(object({ # Object with keys: # - type - The type of the action of this Lifecycle Rule. Supported values: Delete and SetStorageClass. # - storage_class - (Required if action type is SetStorageClass) The target Storage Class of objects affected by this Lifecycle Rule. action = any # Object with keys: # - age - (Optional) Minimum age of an object in days to satisfy this condition. # - created_before - (Optional) Creation date of an object in RFC 3339 (e.g. 2017-06-13) to satisfy this condition. # - with_state - (Optional) Match to live and/or archived objects. Supported values include: "LIVE", "ARCHIVED", "ANY". # - matches_storage_class - (Optional) Storage Class of objects to satisfy this condition. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, DURABLE_REDUCED_AVAILABILITY. # - num_newer_versions - (Optional) Relevant only for versioned objects. The number of newer versions of an object to satisfy this condition. condition = any })) default = [] }
  1. Tambahkan output ke modul Anda di file outputs.tf di dalam modul Anda:
output "bucket" { description = "The created storage bucket" value = google_storage_bucket.bucket }

Seperti halnya variabel, output dalam modul menjalankan fungsi yang sama seperti di modul root, tetapi diakses dengan cara yang berbeda. Output modul dapat diakses sebagai atribut hanya baca pada objek modul, yang tersedia dalam konfigurasi yang memanggil modul.

  1. Kembalilah ke main.tf di direktori root lalu tambahkan referensi ke modul baru:
module "gcs-static-website-bucket" { source = "./modules/gcs-static-website-bucket" name = var.name project_id = var.project_id location = "{{{project_0.default_region | REGION}}}" lifecycle_rules = [{ action = { type = "Delete" } condition = { age = 365 with_state = "ANY" } }] }
  1. Di direktori root, buat file outputs.tf untuk modul root Anda:
cd ~ touch outputs.tf
  1. Tambahkan kode berikut dalam file outputs.tf:
output "bucket-name" { description = "Bucket names." value = "module.gcs-static-website-bucket.bucket" }
  1. Di direktori root, buat file variables.tf:
touch variables.tf
  1. Tambahkan kode berikut ke file variables.tf. Setel variabel project_id dan name ke nilai default untuk Project ID Anda: .
variable "project_id" { description = "The ID of the project in which to provision resources." type = string default = "FILL IN YOUR PROJECT ID HERE" } variable "name" { description = "Name of the buckets to create." type = string default = "FILL IN A (UNIQUE) BUCKET NAME HERE" } Catatan: Nama bucket penyimpanan Anda harus unik secara global. Menggunakan nama dan tanggal biasanya merupakan cara yang baik untuk membuat nama bucket yang unik. Anda juga dapat menggunakan Project ID.

Menginstal modul lokal

Tiap kali Anda menambahkan modul baru ke konfigurasi, Terraform harus menginstal modul tersebut sebelum dapat digunakan. Perintah terraform get dan terraform init akan menginstal dan mengupdate modul. Perintah terraform init juga akan melakukan inisialisasi pada backend dan menginstal plugin.

  1. Instal modul:
terraform init
  1. Lakukan penyediaan bucket:
terraform apply
  1. Jawab yes pada prompt. Bucket Anda dan resource lainnya akan disediakan.

Mengupload file ke bucket

Anda sekarang telah mengonfigurasi dan menggunakan modul Anda sendiri untuk membuat situs statis. Anda mungkin ingin mengunjungi situs statis ini. Saat ini bucket Anda tidak ada isinya, jadi tidak ada yang dapat dilihat di situs. Untuk melihat konten apa pun, Anda perlu mengupload objek ke bucket Anda. Anda dapat mengupload konten direktori www di repositori GitHub.

  1. Download contoh konten ke direktori home Anda:
cd ~ curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/master/modules/aws-s3-static-website-bucket/www/index.html > index.html curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/blob/master/modules/aws-s3-static-website-bucket/www/error.html > error.html
  1. Salin file ke bucket dan ganti YOUR-BUCKET-NAME dengan nama bucket penyimpanan Anda:
gsutil cp *.html gs://YOUR-BUCKET-NAME
  1. Di tab yang baru di browser Anda, buka situs https://storage.cloud.google.com/YOUR-BUCKET-NAME/index.html, dengan mengganti YOUR-BUCKET-NAME dengan nama bucket penyimpanan Anda.

Anda akan melihat halaman web HTML dasar yang berbunyi Nothing to see here.

Klik Check my progress untuk memverifikasi tujuan. Membangun modul.

Mengosongkan situs dan infrastruktur

Terakhir, Anda akan mengosongkan project dengan menghancurkan infrastruktur yang baru saja Anda buat.

  1. Hancurkan resource Terraform Anda:
terraform destroy

Setelah Anda menjawab prompt dengan yes, Terraform akan menghancurkan semua resource yang Anda buat dengan mengikuti lab ini.

Selamat!

Di lab ini, Anda telah mempelajari dasar-dasar modul Terraform dan cara menggunakan modul yang sudah ada dari Registry. Kemudian Anda membangun modul Anda sendiri untuk membuat situs statis yang dihosting di bucket Cloud Storage. Dengan melakukannya, Anda menetapkan input, output, dan variabel untuk file konfigurasi serta mempelajari praktik terbaik untuk membuat modul.

Langkah berikutnya/Pelajari Lebih Lanjut

Link-link ini menyediakan lebih banyak praktik interaktif 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.