Blog Personal Inganta

Berbagi pengetahuan untuk memperkaya pemahaman

17 Apr 2020

Struktur Direktori dan Kode Proyek Terraform

Setelah memilih Terraform sebagai pilihan untuk implementasi Infrastructure as Code, langkah penting selanjutnya adalah menentukan struktur direktori dan kode Terraform itu sendiri. Struktur direktori dan kode yang standar berguna untuk memudahkan kita memahami maksud dari penulis kode. Ketika kita bekerja di dalam tim, kode yang kita tulis akan diteliti oleh anggota tim yang lain. Struktur yang baku yang telah disetujui di dalam tim memudahkan anggota tim dalam meninjau ulang kode yang ditulis oleh anggota tim lainnya.

Struktur file dan direktori

Struktur file dan direktori yang umum diadopsi ketika memulai proyek Terraform adalah sebagai berikut:

.
├── main.tf
├── outputs.tf
└── variables.tf

Struktur ini mudah dipahami karena hanya terdiri dari 3 berkas dengan fungsi sebagai berikut:

  • Berkas main.tf berisi sumber daya (resource) Terraform yang kita gunakan dalam proyek ini.
  • Berkas outputs.tf berisi informasi tertentu yang berasal dari sumber daya Terraform. Contohnya ketika mengadakan sebuah VM, kita membutuhkan alamat IP untuk mengakses VM tersebut. Informasi IP VM ini perlu dituliskan sebagai keluaran (output) di dalam file outputs.tf sehingga IP akan ditampilkan ketika kode Terraform selesai dieksekusi.
  • Berkas variables.tf berisi variabel (variable) yang mengandung informasi masukan yang dibutuhkan oleh kode Terraform ketika dieksekusi. Varibel banyak digunakan oleh modul.

Terraform akan membaca berkas-berkas lainnya (yang memiliki ekstensi yang kenali oleh terraform seperti .tf) yang ada pada direktori dimana perintah terraform dijalankan. Hal ini membantu kita untuk memecah isi berkas main.tf menjadi beberapa berkas sehingga lebih mudah dipahami.

Pengelompokan sumber daya ke dalam modul

Mengelola sumber daya Terraform dalam jumlah banyak memiliki tantangan tersendiri. Salah satunya adalah kemampuan kognitif manusia itu sendiri dalam memahami banyak hal secara detil sekaligus. Terraform menawarkan fitur pengelompokan sumber daya yang berhubungan ke dalam satu kelompok yang dikenal dengan istilah modul sumber daya (resource module). Modul sumber daya membantu menerjemahkan kode infrastruktur ke dalam lapisan-lapisan untuk penyederhanaan infrastruktur secara garis besar. Terraform menyediakan mekanisme untuk berbagi modul antar proyek. Modul yang kita miliki bisa dipublikasikan ke repositori sehingga memudahkan proyek lain ketika ingin menggunakan modul tersebut.

Struktur direktori sebuah module terraform sama dengan struktur direktori dan berkas yang dijelaskan pada bagian Struktur file dan direktori. Berikut contoh kode Terraform yang menggunakan modul terraform-aws-s3-bucket yang tersedia secara umum. Modul ini berfungsi untuk mengelola bucket pada layanan AWS S3. Terraform akan mengunduh modul terraform-aws-s3-bucket ketika dijalankan.

.
├── main.tf
├── outputs.tf
provider "aws" {}

# main.tf
module "s3_bucket" {
  source = "terraform-aws-modules/s3-bucket/aws"

  bucket = "my-s3-bucket"
  acl    = "private"

  versioning = {
    enabled = true
  }

}
# outputs.tf

output "s3_bucket_arn" {
    value = module.s3_bucket.this_s3_bucket_arn
}

Pengelolaan infrastruktur untuk berbagai lingkungan penggelaran

Sebuah proyek pengembangan perangkat lunak dapat memiliki lebih dari satu lingkungan penggelaran seperti lingkungan produksi (production environment), lingkungan staging, atau lingkungan pengembangan (development env). Pengujian bertahap yang melibatkan banyak lingkungan penggelaran berguna untuk meningkatkan kepercayaan bahwa perangkat lunak yang dibangun akan berjalan dengan baik. Setiap lingkungan dikelola secara independen. Hal ini penting untuk memastikan bahwa kesalahan yang terjadi pada satu lingkungan tidak akan berdampak ke lingkungan lain. Tantangan dari pemisahan seperti ini adalah menjaga kemiripan lingkungan (environment parity) yang satu dan lainnya. Ketika lingkungan tidak seragam maka pengujian bertahap yang dilakukan tidak akan meningkatkan kepercayaan terhadap pengujian perangkat lunak yang dilakukan pada lingkungan sebelumnya. Hal ini malahan hanya akan menambah beban yang tidak perlu baik dari sisi waktu yang diperlukan untuk memelihara berbagai lingkungan dan biaya yang dikeluarkan. Pengelolaan lingkungan penggelaran dengan kode mempermudah kita untuk menjaga keseragaman lingkungan penggelaran.

Berikut ini struktur berkas dan direktori Terraform yang bisa digunakan untuk mengelola infrastruktur banyak lingkungan penggelaran.

.
├── common
│   ├── main.tf
│   ├── outputs.tf
│   └── variables.tf
├── development
│   ├── main.tf
│   ├── outputs.tf
│   └── variables.tf
├── modules
│   ├── module-1
│   ├── module-2
│   └── module-3
├── production
│   ├── main.tf
│   ├── outputs.tf
│   └── variables.tf
└── staging
    ├── main.tf
    ├── outputs.tf
    └── variables.tf

Direktori common berisi sumber daya yang digunakan secara bersama oleh seluruh lingkungan. Salah satu contoh kasusnya adalah ketika kita menggunakan satu jaringan privat (VPC) di penyedian layanan cloud AWS untuk seluruh lingkungan penggelaran yang kita memiliki. Hal ini dilakukan untuk menghemat biaya infrastruktur. Kode Terraform VPC tersebut kita tuliskan di bawah direktori common.

Direktori modules berisi modul yang telah kita definisikan dan digunakan di berbagai lingkungan penggelaran. Direktori ini berperan sebagai mekanisme untuk mengurangi jumlah kode duplikat yang diperlukan. Selain itu, modul juga berguna untuk menjaga keseragaman infrastruktur berbagai lingkungan penggelaran.

Setiap lingkungan penggelaran dipetakan menjadi satu direktori tersendiri sesuai dengan nama lingkungannya. Menambah atau mengurangi lingkungan bisa dilakukan dengan menambah atau menghapus direktori. Setiap lingkungan (common, development, staging, dan production) masing-masing memiliki penyimpanan keadaan jarak jauh (remote state) tersendiri. Hal ini penting untuk mengisolasi keadaan satu lingkungan dengan lingkungan lainnya. Pemisahan ini juga memungkinkan untuk melakukan perubahan beberapa lingkungan secara bersamaan ketika diperlukan.

Alur perubahan infrastruktur dimulai dengan melakukan perubahan pada lingkungan developement. Ketika perubahan infrastruktur dinyatakan lulus uji pada lingkungan tersebut, selanjutnya perubahan digelar pada lingkungan staging. Pengujian bertahap yang sebelumnya tidak bisa dilakukan pada lingkungan development dilakukan di fase ini. Tahap ini penting untuk memastikan bahwa perubahan infrastruktur layak untuk digelar di lingkungan final yaitu lingkungan produksi. Detil mengelola perubahan infrastruktur menggunakan Terraform dijelaskan pada artikel Perubahan Infrastruktur Menggunakan Alur Kerja Pull Request dan Terraform Cloud