Plan #
terraform plan adalah safety net utama di Terraform. Sebelum satu pun resource berubah di cloud, kamu punya kesempatan untuk melihat persis apa yang akan terjadi. Tapi output plan bukan sekadar daftar yang harus di-scroll — ada detail penting yang perlu kamu pahami untuk bisa membaca plan secara kritis, bukan hanya menerimanya begitu saja.
Cara Plan Bekerja #
Sebelum menghasilkan output, terraform plan melakukan serangkaian operasi internal.
terraform plan — Urutan Kerja:
1. Baca semua file .tf di direktori saat ini
│
▼
2. Refresh state
(query aktual ke provider untuk cek kondisi resource yang sudah ada)
│
▼
3. Bandingkan konfigurasi vs state yang di-refresh
│
▼
4. Hitung dependency graph
(tentukan urutan operasi yang benar)
│
▼
5. Tampilkan execution plan
(perubahan apa yang akan dilakukan dan dalam urutan apa)
Langkah refresh di nomor 2 berarti plan selalu mencerminkan kondisi aktual di cloud — bukan hanya apa yang tersimpan di state file lokal.
Membaca Output Plan #
Output plan menggunakan simbol untuk menunjukkan tipe operasi pada setiap resource.
$ terraform plan
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
~ update in-place
- destroy
-/+ destroy and then create replacement
Terraform will perform the following actions:
# aws_instance.web will be created
+ resource "aws_instance" "web" {
+ ami = "ami-0abcdef1234567890"
+ id = (known after apply)
+ instance_type = "t3.micro"
+ public_ip = (known after apply)
+ tags = {
+ "Name" = "web-server"
}
}
# aws_security_group.web will be updated in-place
~ resource "aws_security_group" "web" {
id = "sg-0abcdef1234567890"
name = "web-sg"
~ ingress = [
- {
- from_port = 22
- protocol = "tcp"
- to_port = 22
},
+ {
+ from_port = 443
+ protocol = "tcp"
+ to_port = 443
},
]
}
Plan: 1 to add, 1 to change, 0 to destroy.
Memahami Tipe Perubahan #
+ CREATE
Resource baru akan dibuat.
Tidak ada dampak pada resource yang sudah ada.
Relatif aman.
~ UPDATE IN-PLACE
Resource yang ada akan dimodifikasi tanpa dihapus.
Instance tetap berjalan, hanya atribut tertentu yang berubah.
Aman untuk sebagian besar kasus.
- DESTROY
Resource akan dihapus permanen.
Data di dalamnya hilang.
Butuh konfirmasi dan kehati-hatian ekstra.
-/+ DESTROY AND RECREATE (Replace)
Resource lama dihapus, resource baru dibuat.
Ini yang paling berbahaya untuk resource stateful.
Berarti downtime untuk server, kehilangan data untuk database
jika tidak ada mekanisme backup/migration.
<= READ
Data source akan di-read dari provider.
Tidak ada perubahan infrastruktur.
Waspada dengan Replace (-/+) #
Replace adalah operasi yang paling sering menjebak developer Terraform. Beberapa perubahan atribut memicu replace, bukan update in-place.
# Contoh perubahan yang memicu REPLACE (bukan update):
resource "aws_instance" "web" {
# ANTI-PATTERN: Mengubah AMI di instance yang berjalan
ami = "ami-NEW" # Mengganti AMI → forces replacement
# Instance lama dihapus, instance baru dibuat
# Semua data di disk instance lama hilang
}
# Perubahan yang memicu replace ditandai dengan "# forces replacement"
# di output plan:
#
# -/+ resource "aws_instance" "web" {
# ~ ami = "ami-OLD" -> "ami-NEW" # forces replacement
# - id = "i-0abcdef1234567890"
# + id = (known after apply)
# }
# BENAR: Gunakan lifecycle create_before_destroy untuk meminimalkan downtime
resource "aws_instance" "web" {
ami = var.ami_id
instance_type = "t3.micro"
lifecycle {
create_before_destroy = true
# Buat instance baru dulu sebelum instance lama dihapus
}
}
Saved Plan untuk Deployment Aman #
Ada celah antara waktu kamu menjalankan plan dan waktu kamu menjalankan apply. Dalam rentang waktu itu, kondisi cloud bisa berubah. Untuk deployment production, gunakan saved plan.
# Simpan plan ke file
terraform plan -out=tfplan
# Apply persis dari plan yang disimpan
# Terraform tidak akan generate plan baru — langsung eksekusi yang sudah disimpan
terraform apply tfplan
# Keuntungan:
# - Apa yang di-review adalah persis yang di-apply
# - Tidak ada kejutan dari perubahan kondisi antara plan dan apply
# - Cocok untuk workflow GitOps: plan di PR, apply setelah merge
# Untuk melihat isi saved plan dalam format yang bisa dibaca:
terraform show tfplan
File tfplan mengandung seluruh konfigurasi dan state dalam format biner. Ia bisa mengandung nilai sensitif. Jangan commit file ini ke Git, dan hapus setelah selesai digunakan.Flag Berguna untuk Plan #
# Plan dengan variable override
terraform plan -var="environment=production"
terraform plan -var-file="production.tfvars"
# Plan hanya untuk resource tertentu (target planning)
terraform plan -target=aws_instance.web
terraform plan -target=module.vpc
# Skip refresh state (lebih cepat, tapi mungkin tidak reflect kondisi aktual)
terraform plan -refresh=false
# Tampilkan rencana dalam format JSON (untuk parsing programatik)
terraform plan -out=tfplan && terraform show -json tfplan | jq .
# Plan dengan jumlah concurrent operation yang dibatasi
terraform plan -parallelism=5 # default: 10
Ringkasan #
- Plan selalu refresh state sebelum menghitung perubahan — mencerminkan kondisi aktual di cloud, bukan hanya state file lokal.
- Empat tipe perubahan:
+create,~update in-place,-destroy,-/+destroy dan recreate.-/+adalah yang paling berbahaya — resource dihapus dan dibuat ulang, berarti potensi downtime dan kehilangan data.- Cari tanda
# forces replacementdi output plan untuk mendeteksi resource yang akan di-replace.- Gunakan saved plan (
-out=tfplan) untuk production — pastikan apa yang di-review adalah persis yang di-apply.-targetberguna untuk plan resource spesifik, tapi hindari penggunaan rutin karena bisa menyembunyikan dependency.