Pada kalangan DevOps / SRE tidak asing lagi dengan tools yang satu ini Terraform merupakan tools Infrastructure as Code untuk mempercepat dalam mengelola cloud seperti AWS, GCP, atau Azure namun tidak hanya cloud kita juga dapat menggunakan terraform untuk memanage Virtualisasi seperti Proxmox ataupun Container Docker. Terraform adalah tool open source yang dibuat oleh Hashicorp. Dengan terraform kita dapat membuat, mengubah, menghapus dan menduplikasikan infrastructure.
Core Terraform Workflow
Write : menulis terraform configuration dan initialize
mendefinisikan infrastructure pada file konfigurasi
Plan : Preview
Sebelum dieksekusi ke infrastuk kita bisa melakukan preview terlebih dahulu apa yang akan di buat, ubah atau hapus sehingga bisa lebih aman saat di eksekusi ke infrastuktur.
Apply : Execution
Setelah tahap plan (preview) maka kita bisa eksekusi ke infrastucture yang sebenarnya.
Terraform Command
cukup banyak command yang dimiliki oleh terraform yang bisa digunakan, namun untuk awal kita hanya cukup mengetahui beberapa command yang biasa di pakai. Berikut ini beberapa command dasar :
terraform init => inisialisasi
terraform fmt=> merapihkan konfigurasi code file
terraform validate => check apakah konfigurasi code sudah sesuai
terraform plan => check apa saja yang akan di rubah
terraform apply => menerapkan perubahan
terraform destroy=> menghapus
Install Terraform
Download Terafform di situs ini developer.hashicorp.com/terraform/downloads. Pilih operating system menggunakan apa, di sini saya menggunakan windows.
Buka file zip nya copy terraform.exe ke drive C: dengan membuat folder terraform.
Update system global path pada windows di bagian Control Panel -> System -> System Settings-> Environment Variable
Oke Save, dan test buka CMD kembali.
Sukses terraform sudah terinstall di windows.
Setup gcloud CLI
Rekomendasi jika menggunakan PC/Laptop pribadi adalah dengan menggunakan gcloud. Kita akan menggunakan Application Default Credentials (ADC) dari google. install dahulu gcloud cli dari link ini https://cloud.google.com/sdk/docs/install
biasa nya instalasi memakan waktu sekitar 5 menitan.
# gcloud auth login
sukses authentikasi menggunakan account google cloud. selanjutnya login ADC agar terraform dapat berkomunikasi dengan Google Cloud.
# gcloud auth application-default login
Terraform Provider
Terraform provider digunakan sebagai penjembatan antara Terraform dengan remote system (Cloud / On-Premise). Didalam Terraform Block kita harus menentukan provider yang akan digunakan. Minimal kita definisikan source & version yang kita gunakan.
Dalam Visual studio code, create file dengan nama main.tf
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "5.24.0"
}
}
}
setelah itu pada bagian provider block kita dapat mendefinisikan konfigurasi dari provider namun ini optional di biarkan blank juga tidak apa, contoh
...
provider "google" {
# Configuration options
project = "development-m-dani"
region = "asia-southeast2" //jakarta
}
tips :
jika ingin merapihkan reformat konfigurasi file main.tf cukup ketikan perintah**terraform fmt.
jika ingin melakukan pengecekan konfigurasi dapat memvalidasi menggunakan perintah terraform validate.
jika pertama kali mendefinisikan Terraform Block atau ada perubahan gunakan perintah terraform init.
Resources Blocks
Resource blocks merupakan tempat kita mendefinisikan object dari infrastruktur. Contoh kita akan membuat VM atau istilah nya di GCP yaitu Google Compute Instance. Dokumentasi.
Tambahkan di main.tf
...
resource "google_service_account" "my_service_account" {
account_id = "mdrdani-sa"
display_name = "mdrdani Service Account"
}
resource "google_compute_firewall" "http" {
name = "allow-http"
network = "default"
allow {
protocol = "tcp"
ports = ["80"]
}
source_ranges = ["0.0.0.0/0"]
}
resource "google_compute_firewall" "https" {
name = "allow-https"
network = "default"
allow {
protocol = "tcp"
ports = ["443"]
}
source_ranges = ["0.0.0.0/0"]
}
resource "google_compute_instance" "VM-Satu" {
name = "vm-satu"
machine_type = "e2-micro"
zone = "asia-southeast2-a" //jakarta
tags = ["http-server", "https-server"]
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = "default"
access_config {
// Ephemeral public IP
}
}
# metadata_startup_script = "echo hi > /test.txt"
service_account {
# Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
# email = google_service_account.default.email
scopes = ["cloud-platform"]
}
}
jika sudah kita coba ketikan perintah terrafom plan
terlihat di bagian Plan ada 1 to add yang artinya kita akan membuat 1 VM. Jika sudah sesuai maka selanjutnya kita ketikan perintah terraform apply.
apply complete !! kita sudah sukses create VM Google CLoud lewat Terraform.
tips: jika kita auto melewati pertanyaan yes, maka bisa menggunakan perintah terraform apply -auto-approve
Data Sources
Untuk mendefinisikan informasi yang nanti nya dapat dipanggil dari Blocks lain kita gunakan Data Sources, biasa nya berdampingan dengan Resources Blocks. Contoh di sini kita definisikan image booting untuk VM. Dokumentasi
tambahkan di main.tf
....
data "google_compute_image" "my_image" {
family = "debian-11"
project = "debian-cloud"
}
resource "google_compute_instance" "VM-Satu" {
.....
boot_disk {
initialize_params {
image = data.google_compute_image.my_image.self_link
}
}
.....
}
...
di sini ada kata self_link yang artinya merupakan link referensi unik suatu resource.
Tips: untuk mendapatkan list public image Google Cloud kita bisa mengetikan perintah gcloud compute images list
Accessing Resource Attributes
kita terkadang akan membutuhkan memanggil sebuah attribute suatu resource dari tempat lain, untuk memanggil nya kita dapat menggunakan format <TYPE>.<NAME>.<ATTRIBUTE>.
contoh kita akan membuat Service Account GCP dan menggunakan nya di VM yang telah kita buat.
tambahkan pada bagian main.tf
....
resource "google_service_account" "service_account" {
account_id = "service-account-id"
display_name = "Service Account"
}
resource "google_compute_instance" "VM-Satu" {
....
service_account {
# Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
email = google_service_account.my_service_account.email
scopes = ["cloud-platform"]
}
....
}
...
jika terjadi error VM tidak dapat restart pada saat update Service Account kita dapat menambahkan allow_stopping_for_update = true
....
resource "google_compute_instance" "VM-Satu" {
name = "vm-dua"
machine_type = "e2-micro"
zone = "asia-southeast2-a" //jakarta
allow_stopping_for_update = true
....
}
...