Praktik terbaik untuk modul root

Dokumen ini memberikan panduan dan rekomendasi yang perlu dipertimbangkan saat menggunakan modul root.

Konfigurasi root atau modul root adalah direktori yang berfungsi tempat Anda menjalankan Terraform CLI. Pastikan konfigurasi root mematuhi standar berikut (dan panduan Terraform sebelumnya, jika berlaku). Rekomendasi eksplisit untuk modul root menggantikan panduan umum.

Panduan ini bukan merupakan pengantar untuk Terraform. Untuk pengantar penggunaan Terraform dengan Google Cloud, lihat Mulai menggunakan Terraform.

Meminimalkan jumlah resource di setiap modul root

Penting untuk menjaga konfigurasi root tunggal agar tidak bertambah terlalu besar, dengan terlalu banyak resource yang disimpan dalam direktori dan status yang sama. Semua resource dalam konfigurasi root tertentu di-refresh setiap kali Terraform dijalankan. Hal ini dapat menyebabkan eksekusi yang lambat jika resource yang disertakan dalam satu status terlalu banyak. Aturan umum: Jangan sertakan lebih dari 100 resource (dan idealnya hanya beberapa lusin) dalam satu status.

Menggunakan direktori terpisah untuk setiap aplikasi

Untuk mengelola aplikasi dan project secara independen, tempatkan resource untuk setiap aplikasi dan project di direktori Terraform-nya sendiri. Layanan dapat mewakili aplikasi tertentu atau layanan umum seperti jaringan bersama. Tempatkan semua kode Terraform untuk layanan tertentu dalam satu direktori (termasuk subdirektori).

Memisahkan aplikasi ke dalam subdirektori khusus lingkungan

Saat men-deploy layanan di Google Cloud, bagi konfigurasi Terraform untuk layanan tersebut menjadi dua direktori level teratas: direktori modules yang berisi konfigurasi aktual untuk layanan dan direktori environments yang berisi konfigurasi root untuk setiap lingkungan.

-- SERVICE-DIRECTORY/
   -- OWNERS
   -- modules/
      -- <service-name>/
         -- main.tf
         -- variables.tf
         -- outputs.tf
         -- provider.tf
         -- README
      -- ...other…
   -- environments/
      -- dev/
         -- backend.tf
         -- main.tf

      -- qa/
         -- backend.tf
         -- main.tf

      -- prod/
         -- backend.tf
         -- main.tf

Menggunakan direktori lingkungan

Untuk membagikan kode di seluruh lingkungan, referensikan modul. Biasanya dapat berupa modul layanan yang menyertakan konfigurasi Terraform bersama dasar untuk layanan tersebut. Dalam modul layanan, input umum hard code dan hanya memerlukan input spesifik lingkungan sebagai variabel.

Setiap direktori lingkungan harus berisi file berikut:

  • File backend.tf, yang mendeklarasikan lokasi status backend Terraform (biasanya, Cloud Storage)
  • File main.tf yang membuat instance modul layanan

Setiap direktori lingkungan (dev, qa, prod) sesuai dengan ruang kerja Terraform default dan men-deploy versi layanan ke lingkungan tersebut. Ruang kerja ini mengisolasi resource khusus lingkungan ke dalam konteksnya sendiri. Hanya gunakan ruang kerja default.

Memiliki beberapa ruang kerja CLI dalam suatu lingkungan tidak direkomendasikan karena alasan berikut:

  • Konfigurasi di setiap ruang kerja mungkin akan sulit diperiksa.
  • Memiliki satu backend bersama untuk beberapa ruang kerja tidak direkomendasikan karena backend bersama akan menjadi titik tunggal kegagalan jika digunakan untuk pemisahan lingkungan.
  • Meskipun penggunaan ulang kode dapat dilakukan, kode menjadi lebih sulit dibaca karena harus dialihkan berdasarkan variabel ruang kerja saat ini (misalnya, terraform.workspace == "foo" ? this : that).

Untuk informasi selengkapnya, lihat referensi berikut:

Mengekspos output melalui status jarak jauh

Pastikan Anda mengekspos output instance modul yang berguna dari modul root.

Misalnya, cuplikan kode berikut meneruskan output project ID dari instance modul factory project sebagai output dari modul root.

# Project root module
terraform {
  backend "gcs" {
    bucket  = "BUCKET"
  }
}

module "project" {
  source  = "terraform-google-modules/project-factory/google"
  ...
}

output "project_id" {
  value       = module.project.project_id
  description = "The ID of the created project"
}

Lingkungan dan aplikasi Terraform lainnya hanya dapat mereferensikan output level modul root.

Dengan menggunakan status jarak jauh, Anda dapat mereferensikan output modul root. Agar konfigurasi dapat digunakan oleh aplikasi dependen lainnya, pastikan Anda mengekspor informasi yang terkait dengan endpoint layanan, ke status jarak jauh.

# Networks root module
data "terraform_remote_state" "network_project" {
  backend = "gcs"

  config = {
    bucket = "BUCKET"
  }
}

module "vpc" {
  source  = "terraform-google-modules/network/google"
  version = "~> 9.0"

  project_id   = data.terraform_remote_state.network_project.outputs.project_id
  network_name = "vpc-1"
  ...
}

Terkadang, seperti saat memanggil modul layanan bersama dari direktori lingkungan, sebaiknya ekspor ulang seluruh modul turunan, seperti berikut:

output "service" {
  value       = module.service
  description = "The service module outputs"
}

Menyematkan ke versi penyedia minor

Di modul root, deklarasikan setiap penyedia dan sematkan ke versi minor. Hal ini memungkinkan upgrade otomatis ke rilis patch baru sekaligus tetap mempertahankan target yang solid. Agar konsisten, beri nama file versi dengan versions.tf.

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 4.0.0"
    }
  }
}

Menyimpan variabel dalam file tfvars

Untuk modul root, sediakan variabel menggunakan file variabel .tfvars. Agar konsisten, beri nama file variabel dengan terraform.tfvars.

Jangan tentukan variabel dengan menggunakan opsi command line alternatif var-files atau var='key=val'. Opsi command line bersifat singkat dan mudah dilupakan. Menggunakan file variabel default lebih dapat diprediksi.

Memeriksa file .terraform.lock.hcl

Untuk modul root, file kunci dependensi .terraform.lock.hcl harus diperiksa ke kontrol sumber. Hal ini memungkinkan pelacakan dan peninjauan perubahan dalam pilihan penyedia untuk konfigurasi tertentu.

Langkah selanjutnya