Dokumen ini memberikan panduan dan rekomendasi yang perlu dipertimbangkan saat menggunakan modul {i>root<i}.
Konfigurasi {i>root<i} atau modul {i>root<i} adalah direktori yang berfungsi tempat Anda mulai 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. Sebagai pengantar tentang 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 Terraform backend lokasi status (biasanya, Cloud Storage) - File
main.tf
yang membuat instance modul layanan
Setiap direktori lingkungan (dev
, qa
, prod
) sesuai dengan default
Ruang kerja Terraform
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 disarankan 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 melewati 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. Untuk mengizinkan penggunaan oleh aplikasi dependen lainnya untuk konfigurasi, pastikan Anda mengekspor informasi yang terkait dengan endpoint layanan tersebut, ke kondisi 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 menggunakan 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, kunci dependensi .terraform.lock.hcl
harus dimasukkan ke dalam kontrol sumber. Hal ini memungkinkan pelacakan dan
peninjauan perubahan dalam pilihan penyedia untuk konfigurasi tertentu.
Langkah selanjutnya
- Pelajari praktik terbaik gaya dan struktur umum untuk Terraform di Google Cloud.
- Pelajari praktik terbaik saat menggunakan modul yang dapat digunakan kembali.