Mengapa Terraform Membutuhkan State File (Dan Mengapa Anda Tidak Boleh Menyimpannya di Laptop)

Anda baru saja menjalankan terraform apply dan berhasil membuat server serta database. Semuanya berfungsi. Anda menutup laptop dengan puas. Besok, Anda perlu menambahkan load balancer. Anda membuka konfigurasi, menambahkan resource, dan menjalankan terraform plan.

Terraform malah menampilkan rencana yang ingin membuat ulang semuanya dari awal.

Apa yang terjadi? Terraform tidak memiliki ingatan tentang apa yang dibangun kemarin. Ia tidak tahu bahwa server itu sudah ada. Ia tidak tahu bahwa database sedang berjalan. Ia tidak memiliki catatan infrastruktur yang baru saja dibuat.

Inilah momen ketika sebagian besar tim menyadari bahwa mereka membutuhkan state file.

Apa Sebenarnya Fungsi State File

State file adalah memori kerja Terraform. Ia mencatat setiap resource yang telah dibuat Terraform, termasuk ID unik, konfigurasi terakhir yang diketahui, dan bagaimana resource saling terhubung. Saat Anda menjalankan terraform plan, Terraform tidak kembali ke penyedia cloud Anda untuk bertanya "apa yang sudah ada?" Itu akan lambat, tidak konsisten, dan tidak dapat diandalkan di berbagai penyedia. Sebaliknya, ia membaca state file dan membandingkannya dengan konfigurasi Anda saat ini.

Anggap saja seperti struk belanja. Setiap kali membeli sesuatu, Anda mendapat struk yang mencatat apa yang dibeli, kapan, dan berapa harganya. Tanpa struk itu, Anda harus memeriksa seluruh rumah untuk mengetahui apa yang Anda miliki. Terraform juga demikian. Tanpa state file, ia harus memindai seluruh akun cloud Anda untuk mencari tahu apa yang dikelolanya. Dan itupun, ia tidak bisa memastikan resource mana yang dibuatnya versus yang dibuat orang lain secara manual.

Berikut perbandingan visual kedua alur kerja:

flowchart TD subgraph WithStateFile[Dengan State File] A1[Baca state file] --> B1[Bandingkan state vs konfigurasi] B1 --> C1[Hasilkan rencana akurat] C1 --> D1[Terapkan perubahan dengan aman] end subgraph WithoutStateFile[Tanpa State File] A2[Pindai seluruh akun cloud] --> B2[Tebak resource milik Terraform] B2 --> C2[Rencana tidak pasti: risiko duplikasi] C2 --> D2[Apply bisa membuat ulang semuanya] end WithStateFile --> |Andal| Outcome1[Infrastruktur dapat diprediksi] WithoutStateFile --> |Berisiko| Outcome2[Duplikasi, konflik, tagihan membengkak]

State file berisi informasi detail tentang setiap resource. Untuk server cloud, itu mencakup ID server, alamat IP, tipe mesin, zona ketersediaan, dan konfigurasi jaringan. Untuk database, itu mencakup endpoint, port, ukuran penyimpanan, dan pengaturan backup. Informasi ini menjadi sumber kebenaran untuk operasi Terraform selanjutnya.

Masalah Penyimpanan di Laptop

Banyak pengembang memulai dengan menyimpan state file secara lokal. Itu yang paling mudah dilakukan. Terraform membuat file bernama terraform.tfstate di direktori kerja Anda, dan Anda melanjutkan pekerjaan.

Ini berfungsi sampai:

  • Laptop Anda rusak atau dicuri.
  • Anda tidak sengaja menghapus file tersebut.
  • Anda berganti komputer dan lupa menyalin file.
  • Rekan satu tim menjalankan Terraform dari mesin mereka dan membuat state file yang berbeda.

Ketika state file hilang, Terraform kehilangan semua pengetahuan tentang infrastruktur Anda. Ia menganggap tidak ada apa pun. Jika Anda menjalankan terraform apply lagi, ia akan mencoba membuat semuanya dari awal. Anda berakhir dengan resource duplikat, konfigurasi yang bertentangan, dan tagihan cloud yang tiba-tiba berlipat ganda.

Lebih buruk lagi, jika seseorang mengubah resource secara manual di konsol cloud tanpa memperbarui state file, Terraform menjadi tidak sinkron. Ia mengira server memiliki RAM 4GB, padahal server sebenarnya memiliki 8GB. terraform plan berikutnya menghasilkan rencana yang tidak sesuai dengan kenyataan.

Remote State: Satu-satunya Pendekatan yang Masuk Akal

Perbaikannya sederhana: simpan state file di lokasi bersama yang dapat diakses oleh semua anggota tim. Ini disebut remote state.

Remote state berarti state file disimpan di layanan penyimpanan seperti Amazon S3, Azure Storage, atau Google Cloud Storage. Setiap anggota tim dan setiap pipeline CI/CD membaca dan menulis ke state file yang sama. Ini memastikan semua orang bekerja dari sumber kebenaran yang sama.

Menyiapkan remote state biasanya merupakan konfigurasi satu kali di blok backend Terraform Anda:

terraform {
  backend "s3" {
    bucket = "my-team-terraform-state"
    key    = "production/terraform.tfstate"
    region = "us-east-1"
  }
}

Setelah dikonfigurasi, Terraform secara otomatis mengambil state file dari penyimpanan jarak jauh sebelum setiap plan dan mendorong pembaruan setelah setiap apply. Tidak ada yang perlu menyalin file secara manual atau khawatir tentang konflik versi.

State Locking: Mencegah Bentrokan

Dengan remote state, banyak orang dapat menjalankan Terraform secara bersamaan. Ini memperkenalkan masalah baru: dua orang yang menjalankan terraform apply secara bersamaan dapat merusak state file atau menciptakan infrastruktur yang tidak konsisten.

State locking mencegah hal ini. Ketika satu proses memulai terraform apply, ia mengunci state file. Proses lain harus menunggu hingga kunci dilepaskan. Sebagian besar backend remote state mendukung penguncian. S3 menggunakan DynamoDB untuk penguncian. Azure Storage memiliki dukungan lease bawaan. Google Cloud Storage menggunakan nomor generasi objek.

Tanpa penguncian, Anda berisiko mengalami skenario seperti:

  • Dua pipeline menerapkan perubahan berbeda pada waktu yang sama.
  • Seorang pengembang menjalankan apply manual saat pipeline CI/CD sedang dalam proses deployment.
  • Pembaruan parsial di mana hanya setengah perubahan yang tercatat.

State locking bukan opsional untuk lingkungan tim. Ini adalah keharusan.

Data Sensitif dalam State File

State file berisi semua yang diketahui Terraform tentang infrastruktur Anda. Itu termasuk informasi sensitif seperti kata sandi database, kunci API, dan string koneksi. Terraform menyimpan nilai-nilai ini dalam teks biasa di dalam state file.

Ini berarti state file Anda adalah risiko keamanan. Siapa pun dengan akses ke state file dapat membaca rahasia Anda. Backend remote state biasanya mendukung enkripsi saat istirahat dan dalam perjalanan. S3 mendukung enkripsi sisi server dengan KMS. Azure Storage mendukung enkripsi saat istirahat secara default. Selalu aktifkan enkripsi untuk penyimpanan state Anda.

Beberapa tim juga memisahkan state file berdasarkan lingkungan. Development, staging, dan produksi masing-masing memiliki state file sendiri yang disimpan di lokasi terpisah. Ini mencegah perubahan di satu lingkungan mempengaruhi lingkungan lain. Ini juga membatasi radius ledakan jika state file disusupi.

Bagaimana State File Bekerja di CI/CD

Dalam pipeline CI/CD, pipeline membutuhkan akses ke state file untuk menjalankan Terraform. Pipeline melakukan otentikasi ke backend remote state menggunakan kredensial atau peran IAM. Ia mengambil state file, menjalankan terraform plan, dan jika disetujui, menjalankan terraform apply dan mendorong state yang diperbarui kembali.

Inilah mengapa remote state sangat penting untuk otomatisasi. Pipeline CI/CD yang berjalan di container sementara tidak dapat mengandalkan state file yang disimpan di laptop pengembang. Ia membutuhkan lokasi yang konsisten dan dapat diakses yang ada secara independen dari mesin individu mana pun.

Daftar Periksa Praktis untuk Manajemen State File

  • Simpan state file di penyimpanan jarak jauh, bukan di mesin lokal.
  • Aktifkan enkripsi saat istirahat dan dalam perjalanan untuk backend penyimpanan.
  • Konfigurasikan state locking untuk mencegah modifikasi bersamaan.
  • Gunakan state file terpisah untuk setiap lingkungan.
  • Batasi akses ke state file menggunakan kebijakan IAM atau kontrol akses.
  • Jangan pernah melakukan commit state file ke version control.
  • Cadangkan state file secara teratur, terutama sebelum perubahan besar.

Apa Artinya Ini untuk Tim Anda

State file bukanlah detail implementasi yang bisa Anda abaikan. Mereka adalah tulang punggung kemampuan Terraform untuk mengelola infrastruktur secara andal. Tanpa state file yang dikelola dengan benar, alur kerja Terraform Anda akan menghasilkan hasil yang tidak dapat diprediksi, resource duplikat, dan kegagalan yang sulit di-debug.

Begitu Anda memiliki lebih dari satu orang yang menjalankan Terraform, atau begitu Anda menambahkan pipeline CI/CD, pindahkan state file Anda ke penyimpanan jarak jauh. Hanya butuh sepuluh menit untuk mengonfigurasi dan menyelamatkan Anda dari berjam-jam pekerjaan pemulihan saat terjadi kesalahan.

Infrastruktur Anda terlalu penting untuk dipercayakan pada file di laptop Anda.