CLI #
Terraform dioperasikan sepenuhnya melalui command line. Memahami perintah-perintah CLI Terraform — bukan hanya cara menjalankannya, tapi juga cara membaca outputnya dan kapan menggunakan flag tertentu — adalah keterampilan dasar yang akan kamu gunakan setiap hari. Artikel ini membahas perintah-perintah yang paling sering digunakan dalam praktik nyata.
Perintah Inti Workflow #
Empat perintah ini membentuk workflow inti Terraform yang akan kamu jalankan hampir setiap hari.
# 1. terraform init
# Inisialisasi direktori Terraform — download provider, setup backend
terraform init
# 2. terraform plan
# Lihat rencana perubahan tanpa menjalankannya
terraform plan
# 3. terraform apply
# Jalankan perubahan (minta konfirmasi dulu)
terraform apply
# 4. terraform destroy
# Hapus semua resource yang dikelola (minta konfirmasi dulu)
terraform destroy
terraform init #
terraform init harus dijalankan pertama kali di direktori baru, dan setiap kali ada perubahan pada provider atau backend configuration.
# Inisialisasi dasar
terraform init
# Output yang diharapkan:
# Initializing the backend...
# Initializing provider plugins...
# - Finding hashicorp/aws versions matching "~> 5.0"...
# - Installing hashicorp/aws v5.31.0...
# Terraform has been successfully initialized!
# Flag yang berguna:
terraform init -upgrade # Update provider ke versi terbaru yang memenuhi constraint
terraform init -backend=false # Inisialisasi tanpa setup backend (untuk testing)
terraform init -reconfigure # Paksa reconfigure backend (berguna saat ganti backend)
Setelah init, Terraform membuat direktori .terraform/ yang berisi provider yang didownload. Direktori ini tidak perlu di-commit ke Git — cukup .terraform.lock.hcl-nya saja.
terraform plan #
terraform plan adalah perintah yang paling sering kamu gunakan untuk memverifikasi perubahan sebelum dijalankan.
# Plan dasar
terraform plan
# Simpan plan ke file (untuk apply yang deterministik)
terraform plan -out=tfplan
terraform apply tfplan # Apply persis plan yang disimpan
# Flag yang berguna:
terraform plan -var="environment=production" # Override variable
terraform plan -var-file="prod.tfvars" # Gunakan file variable
terraform plan -target=aws_instance.web # Plan hanya satu resource
terraform plan -refresh=false # Skip refresh state (lebih cepat)
Membaca Output Plan #
# Output plan — memahami simbol perubahan:
# + create (resource baru)
+ resource "aws_instance" "web" {
+ ami = "ami-0abcdef1234567890"
+ instance_type = "t3.micro"
+ id = (known after apply)
}
# - destroy (resource akan dihapus)
- resource "aws_instance" "old" {
- id = "i-0abcdef1234567890"
}
# ~ update in-place (resource dimodifikasi)
~ resource "aws_instance" "web" {
~ instance_type = "t3.micro" -> "t3.small"
id = "i-0abcdef1234567890"
}
# -/+ destroy and recreate (perubahan yang butuh replace)
-/+ resource "aws_instance" "web" {
~ ami = "ami-old" -> "ami-new" # forces replacement
- id = "i-0abcdef1234567890"
+ id = (known after apply)
}
Perhatikan simbol -/+ — ini berarti resource akan dihapus dulu, baru dibuat ulang. Jika resource itu server production, ini berarti downtime.
terraform apply #
terraform apply menjalankan perubahan yang sudah direncanakan.
# Apply dengan konfirmasi interaktif
terraform apply
# Apply tanpa konfirmasi (untuk CI/CD)
terraform apply -auto-approve
# Apply dari saved plan (paling aman untuk production)
terraform plan -out=tfplan
terraform apply tfplan # Tidak ada konfirmasi, langsung apply plan yang disimpan
# Flag yang berguna:
terraform apply -var="environment=production"
terraform apply -target=aws_instance.web # Apply hanya satu resource
terraform apply -parallelism=5 # Batasi concurrent operations (default: 10)
Gunakan-auto-approvehanya di CI/CD pipeline yang sudah ada review process sebelumnya (misalnya: PR approval sebelum merge ke main branch). Menjalankan-auto-approvesecara langsung di terminal production adalah risiko yang tidak perlu.
Perintah Inspeksi State #
Perintah-perintah ini membantu kamu memahami kondisi state saat ini.
# Lihat semua resource di state
terraform state list
# Output:
# aws_instance.web
# aws_security_group.web
# aws_subnet.public
# aws_vpc.main
# Lihat detail satu resource
terraform state show aws_instance.web
# Refresh state dari kondisi aktual di cloud
# (berguna jika ada perubahan yang dilakukan di luar Terraform)
terraform refresh
# Tampilkan output values
terraform output
terraform output instance_public_ip # Output spesifik
Perintah untuk Troubleshooting #
# Validasi sintaks konfigurasi tanpa connect ke provider
terraform validate
# Format file konfigurasi secara konsisten
terraform fmt # Format semua file .tf di direktori saat ini
terraform fmt -recursive # Termasuk subdirektori
terraform fmt -check # Cek tanpa mengubah (untuk CI)
# Enable logging detail untuk debugging
TF_LOG=DEBUG terraform apply # Level: TRACE, DEBUG, INFO, WARN, ERROR
TF_LOG_PATH=terraform.log terraform apply # Simpan log ke file
# Lihat dependency graph (output dalam format DOT untuk Graphviz)
terraform graph | dot -Tpng > graph.png
Ringkasan #
- Workflow inti:
init→plan→apply— jalankan dalam urutan ini setiap kali bekerja dengan konfigurasi baru atau yang berubah.- Selalu baca output
plansebelumapply— pahami simbol+,-,~, dan-/+sebelum menekan enter.-/+berarti replace — resource dihapus dan dibuat ulang, bisa menyebabkan downtime untuk resource stateful.- Simpan plan dengan
-out=tfplanuntuk production — pastikan yang kamu apply adalah persis yang sudah di-review.terraform fmtdanterraform validateadalah kebiasaan baik sebelum commit konfigurasi.TF_LOG=DEBUGadalah teman terbaikmu saat ada yang tidak berjalan sesuai harapan.