Terraform Fundamental - Sesi 2 (GCP)

kita lanjutkan ....

Input Variables

untuk mendefinisikan value dari konfigurasi secara terpisah kita memerlukan Input Variables. Default dari Variables berupa string, namun ada jenis lainnya seperti list, map, dan boolean.

create file dengan nama variables.tf

variable "compute_zone" {
  type    = string
  default = "asia-southeast2-a"
}

pada file main.tf di rubah pada bagian Zone

resource "google_compute_instance" "VM-Satu" {
  name                      = "vm-satu"
  machine_type              = "e2-micro"
  zone                      = var.compute_zone
  allow_stopping_for_update = true

......
}

Selain variables berupa string,kita akan coba juga menggunakan variable berupa list ini mirip dengan array. Value pada list variable memiliki index dan index di mulai dari angka 0.

Contoh di sini jika kita ingin mengumpulkan beberapa zone yang ada di GCP.

pada file variables.tf kita bisa rubah seperti ini.

variable "compute_zone" {
  type = list(any)
  default = [
    "asia-southeast2-a",
    "asia-southeast2-b",
  "asia-southeast2-c"]
}

dan digunakan di main.tf akan seperti ini,

resource "google_compute_instance" "VM-Satu" {
  name                      = "vm-satu"
  machine_type              = "e2-micro"
  zone                      = var.compute_zone[0]
  allow_stopping_for_update = true

.....
}

Selain variables berupa list,kita akan coba juga menggunakan variable berupa map yang merupakan collection dari key dan string. untuk memanggil valuenya, kita dapat menggunakan key yang ada.

masih menggunakan contoh zone pada bagian variables.tf di rubah menjadi seperti ini

variable "compute_zone" {
  type = map(any)
  default = {
    "zone-1" = "asia-southeast2-a"
    "zone-2" = "asia-southeast2-b"
    "zone-3" = "asia-southeast2-c"
  }
}

pada bagian main.tf kita menggunakan nya seperti ini

resource "google_compute_instance" "VM-Satu" {
  name                      = "vm-satu"
  machine_type              = "e2-micro"
  zone                      = var.compute_zone["zone-1"]
  allow_stopping_for_update = true

.....
}

Selain variables berupa map,kita akan coba juga menggunakan variable berupa boolean yang kita definisikan true/false value.

contoh di sini pada file variables.tf

variable "allow_stop_vm" {
  type    = bool
  default = false
}

dan cara menggunakan nya di main.tf seperti ini

resource "google_compute_instance" "VM-Satu" {
  name                      = "vm-satu"
  machine_type              = "e2-micro"
  zone                      = var.compute_zone["zone-1"]
  allow_stopping_for_update = var.allow_stop_vm

.....
}

Tips: untuk melakukan override value variable pada saat terraform plan & apply , kita dapat passing options -var

ex: terraform plan -var allow_stop_vm=false

Jika ingin memasukan ssh-key langsung ke instance saat instance tersebut di create pertama kali kita bisa masukan ssh-key ke file variables.tf

contoh di sini pada file variables.tf

variable "ssh_keys" {
  type    = string
  default = "muhamaddani3004:ssh-rsa fdsfsf....."
}

dan cara menggunakan nya di main.tf seperti ini

resource "google_compute_instance" "VM-Satu" {
  name                      = "vm-satu"
  machine_type              = "e2-micro"
  zone                      = var.compute_zone["zone-1"]
  allow_stopping_for_update = var.allow_stop_vm

  metadata = {
    ssh-keys = var.ssh_keys
  }
.....
}

jika nanti kita akan lakukan ssh kita lgsung sudah bisa masuk ke instance.

Output Value

kita dapat menampilkan suatu argument dari sebuah Resource dari command line, kurang lebih contoh seperti menampilkan VM kita dapat IP Publik berapa agar kita tidak perlu lagi check console.

kita tempatkan output value di file outputs.tf

output "public_ip_vm_satu" {
  value       = google_compute_instance.VM-Satu.network_interface[0].access_config[0].nat_ip
  description = "IP Public VM Satu"
}

output "public_ip_vm_dua" {
  value       = google_compute_instance.VM-Dua.network_interface[0].access_config[0].nat_ip
  description = "IP Public VM Dua"
}

dan hasil output nya di dapat.

atau bisa dengan command

$ terraform output public_ip_vm_dua
$ terraform output public_ip_vm_satu

Backend

Sebelumnya kita sudah bahas apa itu State File. file tersebut secara default di letakan di folder konfigurasi Terraform dengan nama terraform.tfstate.

Dalam best practice file tersebut tidak di push ke VCS seperti git. Namun repot kalau jika file state tersebut hilang ya salah satunya broken deployment.

Pada umumnya kita letakan file tersebut di Object Storage seperti Google Cloud Storage atau S3 AWS.

Best practicenya kita tulis konfigurasi backend di file backend.tf

terraform {
  backend "gcs" {
    bucket = "mdrdani-tfstate"
  }
}

sebelumnya kita create terlbih dahulu Object Storage nya, masuk console Google Cloud.

karena konfigurasi Backend ini letaknya di **Terraform Blocks,**maka kita harus menjalankan ulang perintah terraform init.

Terraform State Command

State Command digunakan untuk melakukan manajemen state yang suda ada,yang umumnya di gunakan untuk melihat list, detail atau menghapus state resource.

$ terraform state list

$ terraform state show {state_name}

$ terraform state rm {state_name}

Terraform Destroy Command

jika resource tidak terpakai lagi seharusnya kan kita hapus agar tidak menambah beban cost yang dikeluarkan. Untuk menghapus resource dapat menggunakan destroy command.

//menghapus spesifik resource
$ terraform destroy -target <type>.<name>

//menghapus semua resource
$ terraform destroy

Tips: sebelumnya kita dapat menghapus secara spesifik resource mana yang ingin di hapus, ini juga berlaku untuk terraform plan & apply

//plan spesifik resource
$ terraform plan -target <type>.<name>

// apply spesifik resource
$ terraform apply -target <type>.<name>

Resource Lifecycle

Digunakan untuk mengontrol behavior dari sebuah resource saat dibuat,di update atau dihapus. Contoh kita bisa mencegah suatu resource terhapus secara tidak sengaja.

resource "google_compute_instance" "VM-Dua" {
  name                      = "vm-dua"
  machine_type              = "e2-micro"
  zone                      = var.compute_zone["zone-1"]
  allow_stopping_for_update = var.allow_stop_vm

 lifecycle {
    prevent_destroy = true
  }
  ....
}

Oke thanks yang sudah membaca materi nya.