Terraform Fundamental - Sesi 1 (GCP)

Photo by Sigmund on Unsplash

Terraform Fundamental - Sesi 1 (GCP)

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>.

Dokumentasi1

Dokumentasi2

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
....
}

...