Artikel

Terraform dalam tim: pembagian state, radius dampak, dan plan yang direview

Cara membagi state Terraform, menjalankan plan di CI, dan hanya menerapkan yang sudah direview, agar perubahan infrastruktur menjadi rutinitas, bukan risiko.

Contoh-contohnya bersifat umum dan ilustratif. Tidak diambil dari lingkungan klien mana pun: sesuaikan ambang batas dan pengaturan dengan sistem Anda sendiri.

File state adalah batas yang sebenarnya

Setiap terraform apply bisa mengubah apa saja di dalam state yang ditanganinya. Karena itu satuan risikonya adalah state, bukan modul. Dengan satu state untuk seluruh lingkungan, salah ketik di record DNS dan perubahan pada basis data produksi melewati plan yang sama — dan plan itu butuh beberapa menit untuk dihitung.

Bagi berdasarkan siklus hidup dan radius dampak

Kelompokkan sumber daya yang berubah bersama dan gagal bersama. Pembagian yang umum memisahkan, di setiap lingkungan:

  • Fondasi: akun, jaringan, zona DNS — jarang berubah.
  • Data: basis data, bucket, antrean — diubah dengan hati-hati dan dilindungi dari penghapusan.
  • Komputasi dan layanan: cluster, fungsi, load balancer — sering berubah.

Setiap lapisan membaca output lapisan di bawahnya dan tidak pernah mengelola sumber dayanya. Lingkungan berbagi modul yang sama, tetapi dengan state dan kredensial terpisah, sehingga apply di staging tidak bisa menyentuh produksi.

Remote state, locking, dan versi

  • Simpan state di backend jarak jauh dengan locking dan versioning aktif — jangan pernah di Git, dan jangan pernah di laptop.
  • Commit lock file dependensi (.terraform.lock.hcl) dan kunci versi modul, agar plan hari ini dan plan bulan depan menjalankan kode yang sama.
  • Lindungi sumber daya stateful dengan prevent_destroy dan perlindungan penghapusan bawaan provider.

Plan di setiap pull request, apply yang sudah direview

Jalankan terraform plan di CI untuk setiap perubahan dan tampilkan hasilnya di pull request. Setelah disetujui, terapkan plan yang tersimpan alih-alih membuat plan ulang, agar produksi menerima persis apa yang dibaca reviewer; jika state berubah di antaranya, Terraform menolak plan yang sudah usang. Pipeline sebaiknya melakukan autentikasi dengan kredensial berumur pendek melalui federasi OIDC, bukan dengan kunci berumur panjang yang disimpan sebagai secret.

terraform init -input=false
terraform plan -input=false -lock-timeout=5m -out=tfplan
terraform show -no-color tfplan > plan.txt   # attach to the pull request

# after approval, applying the same saved plan:
terraform apply -input=false tfplan

Deteksi drift secara berkala

Perubahan lewat konsol tetap terjadi, biasanya saat insiden. Job terjadwal yang menjalankan terraform plan -detailed-exitcode akan menemukannya: kode keluar 0 berarti tidak ada perubahan, 2 berarti infrastruktur nyata berbeda dari kode, dan 1 berarti error. Jadikan 2 sebagai tiket, lalu masukkan perubahan itu ke kode atau kembalikan.

Kebijakan sebelum apply

Aturan seperti “tidak ada bucket publik” atau “setiap sumber daya punya tag pemilik” lebih baik diperiksa mesin daripada reviewer di akhir hari yang panjang. Alat policy-as-code seperti Open Policy Agent melalui Conftest dapat mengevaluasi bentuk JSON dari plan (terraform show -json) di CI dan memblokir merge.

Kontak

Butuh pendapat kedua tentang setup Anda?

Kirim deskripsi singkat sistem Anda. Engineer senior membalas secara tertulis dalam satu hari kerja.

Diskusikan infrastruktur Anda