Local #

Local state adalah mode default Terraform — state disimpan dalam file terraform.tfstate di direktori yang sama dengan konfigurasimu. Tidak ada konfigurasi tambahan yang diperlukan. Untuk seorang developer yang bekerja sendiri di proyek kecil atau sedang belajar, ini sepenuhnya cukup. Tapi begitu ada anggota tim kedua atau begitu konfigurasi menyentuh resource production, local state mulai memperlihatkan keterbatasannya.

Struktur File terraform.tfstate #

State file adalah JSON yang menyimpan pemetaan lengkap antara resource di konfigurasi Terraform dan resource yang ada di cloud.

{
  "version": 4,
  "terraform_version": "1.6.3",
  "serial": 12,
  "lineage": "a3b4c5d6-e7f8-9012-abcd-ef1234567890",
  "outputs": {
    "instance_public_ip": {
      "value": "54.123.45.67",
      "type": "string"
    }
  },
  "resources": [
    {
      "mode": "managed",
      "type": "aws_instance",
      "name": "web",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 1,
          "attributes": {
            "ami": "ami-0abcdef1234567890",
            "id": "i-0abcdef1234567890",
            "instance_type": "t3.micro",
            "private_ip": "10.0.1.42",
            "public_ip": "54.123.45.67",
            "subnet_id": "subnet-0abcdef1234",
            "tags": {
              "Name": "web-server",
              "Environment": "production"
            }
          }
        }
      ]
    }
  ]
}

Beberapa field penting yang perlu dipahami:

  • serial — nomor urut yang bertambah setiap kali state dimodifikasi. Terraform menggunakan ini untuk mendeteksi konflik.
  • lineage — UUID unik yang dibuat saat state pertama kali dibuat. Digunakan untuk memverifikasi state file berasal dari workspace yang sama.
  • mode: "managed" — resource yang dikelola Terraform. Bisa juga "data" untuk data source.

File-file State yang Muncul #

Setelah terraform apply pertama kali:

direktori-proyek/
  ├── main.tf
  ├── variables.tf
  ├── outputs.tf
  ├── terraform.tfstate          ← state aktif
  ├── terraform.tfstate.backup   ← backup otomatis state sebelumnya
  └── .terraform/
      └── ...

terraform.tfstate.backup dibuat otomatis setiap kali state diupdate.
Ini memberikan satu level undo jika terjadi kesalahan.

Mengapa Local State Tidak Cukup untuk Tim #

Local state menyimpan segalanya di satu file di mesinmu. Ini menciptakan masalah struktural saat bekerja dalam tim.

MASALAH LOCAL STATE DALAM TIM:

1. TIDAK BISA DIBAGI
   State hanya ada di mesin developer A.
   Developer B menjalankan terraform plan → state kosong
   → Plan menampilkan "akan membuat semua resource dari awal"
   → Catastrophic jika dilanjutkan dengan apply

2. TIDAK ADA LOCKING
   Developer A sedang apply sementara developer B juga apply.
   Keduanya membaca state yang sama (versi lama), lalu keduanya
   menulis state baru — salah satu akan menimpa yang lain.
   → State corrupt atau resource duplikat

3. MENGANDUNG INFORMASI SENSITIF
   State bisa mengandung password, private key, API token
   dalam plaintext — bergantung pada resource yang dikelola.
   Jika state di-commit ke Git, semua secret bocor ke semua
   yang punya akses ke repository.

4. TIDAK ADA VERSIONING
   terraform.tfstate.backup hanya menyimpan satu versi sebelumnya.
   Jika terjadi kesalahan dua langkah ke belakang, tidak ada recovery.

State Sensitif — Jangan Di-commit ke Git #

# Contoh isi state yang mengandung data sensitif:

# aws_db_instance menyimpan password dalam state:
# "password": "super-secret-db-password-123"

# aws_iam_access_key menyimpan secret key:
# "secret": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

# tls_private_key menyimpan private key:
# "private_key_pem": "-----BEGIN RSA PRIVATE KEY-----\n..."
# Pastikan .gitignore sudah mengecualikan state files:
cat .gitignore

# Local .terraform directories
**/.terraform/*

# State files
*.tfstate
*.tfstate.*

Kapan Local State Masih Tepat #

Meskipun punya keterbatasan, local state masih tepat digunakan dalam beberapa situasi.

LOCAL STATE MASIH TEPAT UNTUK:

  ✓ Belajar dan eksperimen — proyek pribadi tanpa kolaborator
  ✓ Proyek disposable — environment yang sering dibuat dan dihapus
  ✓ CI/CD pipeline yang stateless — setiap run dimulai dari state baru
    (misalnya: pipeline yang hanya membuat ephemeral environment)
  ✓ Terraform module development — testing module secara lokal

SUDAH BUTUH REMOTE STATE JIKA:
  ✗ Lebih dari satu orang mengerjakan infrastruktur yang sama
  ✗ Resource menyentuh production atau data yang penting
  ✗ CI/CD pipeline perlu akses ke state yang sama
  ✗ Ada kekhawatiran tentang recovery jika state hilang

Perintah State untuk Local State #

Meskipun menggunakan local state, semua operasi state management bisa dilakukan melalui Terraform CLI — bukan dengan mengedit file JSON secara manual.

# Lihat semua resource
terraform state list

# Lihat detail resource tertentu
terraform state show aws_instance.web

# Hapus resource dari state (tanpa destroy resource di cloud)
terraform state rm aws_instance.web

# Pindahkan/rename resource di state
terraform state mv aws_instance.web aws_instance.web_server

# Pull state ke stdout (berguna untuk backup atau inspeksi)
terraform state pull > backup-$(date +%Y%m%d).tfstate

# Push state dari file (hati-hati — bisa overwrite state aktif)
terraform state push backup-20240101.tfstate

Ringkasan #

  • Local state adalah default — tidak butuh konfigurasi, cocok untuk belajar dan eksperimen pribadi.
  • terraform.tfstate adalah file JSON yang menyimpan pemetaan lengkap antara konfigurasi dan resource aktual di cloud, termasuk semua atribut yang digenerate provider.
  • serial dan lineage digunakan Terraform untuk mendeteksi konflik dan memverifikasi asal state.
  • State bisa mengandung secret (password, API key, private key) — jangan pernah di-commit ke Git.
  • Tiga masalah utama local state dalam tim: tidak bisa dibagi, tidak ada locking, dan tidak ada versioning yang memadai.
  • Pindah ke remote state begitu ada kolaborasi tim, resource production, atau kebutuhan CI/CD yang mengakses state yang sama.

← Sebelumnya: Operation   Berikutnya: Remote State →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact