> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skanesgalab.my.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Manajemen Terraform State & Remote Backend

> Mendalami konsep terraform.tfstate, bahaya kehilangan state, cara mengamankan state dengan Remote Backend (AWS S3 + DynamoDB Locking), dan state inspection.

## Mengapa Terraform State Sangat Krusial?

Setiap kali kamu menjalankan perintah `terraform apply`, Terraform tidak hanya mengirimkan perintah ke cloud provider, tetapi juga menyimpan catatan pemetaan antara file kode `.tf` milikmu dengan **ID sumber daya nyata** di cloud ke dalam sebuah file bernama `terraform.tfstate`.

```mermaid theme={null}
flowchart LR
    CodeTF["Kode Konfigurasi (.tf)"] <--> State["terraform.tfstate (Basis Data Pemetaan)"]
    State <--> RealAWS["Infrastruktur Nyata di AWS Cloud\n- VPC ID: vpc-0a1b2c\n- Subnet ID: subnet-9988\n- EC2 ID: i-0123456789"]
```

### Apa yang Terjadi Jika State File Hilang atau Terhapus?

Jika file `terraform.tfstate` terhapus dari laptopmu:

* Terraform akan mengira bahwa **belum ada satu pun server yang pernah dibuat**.
* Saat kamu menjalankan `terraform apply` berikutnya, Terraform akan mencoba membuat ulang semua VPC dan server dari awal, yang berujung pada error bentrok nama atau tagihan ganda yang sangat membengkak!

***

## Masalah Menyimpan State File di Laptop Lokal

1. **Tidak Bisa Kolaborasi Tim:** Jika programmer A membuat server dari laptopnya, programmer B di laptop lain tidak memiliki file state tersebut.
2. **Bahaya Race Condition:** Jika dua engineer menjalankan `terraform apply` di waktu bersamaan, infrastruktur bisa rusak parah (*corrupted*).
3. **Bahaya Keamanan:** File `.tfstate` menyimpan seluruh nilai output dalam format teks biasa (JSON mentah), termasuk password database dan private key. **Dilarang keras melakukan commit file `.tfstate` ke repositori publik GitHub!**

***

## Solusi Standar Enterprise: Remote Backend (AWS S3 + DynamoDB)

Untuk menyelesaikan masalah di atas, Terraform menyediakan mekanisme **Remote Backend**:

* **AWS S3:** Menyimpan file `terraform.tfstate` di penyimpanan cloud yang aman, terenkripsi (SSE-AES256), dan memiliki fitur riwayat versi (*versioning*).
* **AWS DynamoDB:** Berfungsi sebagai **State Locking**. Ketika seorang engineer sedang menjalankan `apply`, DynamoDB akan mengunci status state sehingga orang lain tidak bisa mengeksekusi perintah secara bersamaan.

```mermaid theme={null}
flowchart TD
    DevA["Engineer A"] -->|1. Mengunci State (Acquire Lock)| DynamoDB["AWS DynamoDB (Lock Table)"]
    DevA -->|2. Baca / Tulis State| S3["AWS S3 Bucket (Enkripsi & Versi)"]
    DevA -->|3. Terapkan Resource| AWSCloud["Infrastruktur AWS"]
    
    DevB["Engineer B"] -.->|Ditolak: State Sedang Terkunci!| DynamoDB
```

***

## Konfigurasi Remote Backend di `main.tf`

```hcl theme={null}
terraform {
  required_version = ">= 1.5.0"

  # Konfigurasi Remote State Storage & Locking
  backend "s3" {
    bucket         = "perusahaan-terraform-state-prod"
    key            = "production/infrastructure.tfstate"
    region         = "ap-southeast-1"
    encrypt        = true
    dynamodb_table = "terraform-state-locks"
  }
}
```

### Langkah Migrasi dari Lokal ke Remote:

Setelah menambahkan blok `backend` di atas, jalankan perintah inisialisasi ulang:

```bash theme={null}
terraform init -migrate-state
```

Terraform akan secara otomatis menyalin file state lokalmu ke bucket S3 di cloud.

***

## Perintah Esensial Manajemen State (`terraform state`)

Jangan pernah mengedit isi file `.tfstate` menggunakan text editor biasa secara manual! Gunakan perintah resmi:

```bash theme={null}
# Melihat daftar seluruh resource yang tercatat di state
terraform state list

# Melihat detail konfigurasi internal dari satu resource spesifik
terraform state show aws_instance.web_servers[0]

# Memindahkan atau mengganti nama resource di state tanpa menghapus fisiknya di cloud
terraform state mv aws_instance.old_name aws_instance.new_name

# Menghapus resource dari pencatatan state (jika resource ingin dikelola manual di luar Terraform)
terraform state rm aws_s3_bucket.my_bucket
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.