CLI #
Terraform dioperasikan sepenuhnya melalui command line. Tidak ada GUI resmi, tidak ada dashboard lokal — semua interaksi dengan Terraform terjadi melalui perintah CLI. Ini bukan kekurangan — ini adalah kekuatan. CLI memungkinkan setiap operasi Terraform bisa di-automate, di-script, dan dijalankan di pipeline CI/CD. 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.
Workflow Inti #
Empat perintah ini membentuk siklus kerja utama Terraform. Hampir semua yang kamu lakukan di Terraform berputar di sekitar keempat perintah ini.
flowchart LR
INIT["terraform init\nDownload provider\nSetup backend"] --> PLAN["terraform plan\nPreview perubahan\nReview changes"]
PLAN --> APPLY["terraform apply\nJalankan perubahan\nCreate/Update/Delete"]
APPLY --> DESTROY["terraform destroy\nHapus semua resource\n(teardown)"]
PLAN -.->|"Ada yang salah?"| PLAN
APPLY -.->|"Perubahan baru"| PLAN
style INIT fill:#e3f2fd,stroke:#1565c0
style PLAN fill:#fff3e0,stroke:#e65100
style APPLY fill:#e8f5e9,stroke:#2e7d32
style DESTROY fill:#ffebee,stroke:#c62828| Perintah | Fungsi | Kapan digunakan | Frekuensi |
|---|---|---|---|
terraform init | Download provider, setup backend | Pertama kali / setelah ubah provider | Sekali per proyek |
terraform plan | Preview perubahan | Sebelum setiap apply | Sangat sering |
terraform apply | Jalankan perubahan | Setelah review plan | Sering |
terraform destroy | Hapus semua resource | Teardown environment | Jarang |
terraform init
#
terraform init adalah perintah pertama yang harus kamu jalankan di direktori Terraform baru, dan setiap kali ada perubahan pada provider atau backend configuration. Ia melakukan tiga hal: mengunduh provider plugins, menginisialisasi backend untuk state, dan mengunduh module yang dibutuhkan.
# 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...
# - Finding cloudflare/cloudflare versions matching "~> 4.0"...
# - Installing cloudflare/cloudflare v4.22.0...
# Terraform has been successfully initialized!
Flag Penting #
# Update provider ke versi terbaru yang memenuhi constraint
terraform init -upgrade
# Gunakan ini saat kamu ingin mendapatkan versi provider terbaru
# Inisialisasi tanpa setup backend (untuk testing atau migration)
terraform init -backend=false
# Paksa reconfigure backend (saat ganti backend atau pindah state)
terraform init -reconfigure
# Migrate state dari backend lama ke backend baru
terraform init -migrate-state
# Hanya download module, jangan setup backend atau provider
terraform init -get-plugins=false
Setelah init, Terraform membuat direktori .terraform/ yang berisi provider binary yang didownload. Direktori ini tidak boleh di-commit ke Git — ia berisi binary besar yang bisa berbeda di setiap OS. Namun, file .terraform.lock.hcl harus di-commit — ia menjamin semua orang menggunakan versi provider yang sama.
# Setelah init, direktori akan berisi:
# .
# ├── .terraform/
# │ ├── providers/ # Provider binary (JANGAN di-commit)
# │ │ └── registry.terraform.io/
# │ └── modules/ # Module yang didownload
# ├── .terraform.lock.hcl # Lock file (HARUS di-commit)
# ├── main.tf
# └── variables.tf
terraform plan
#
terraform plan adalah perintah yang paling sering kamu gunakan. Ia membaca konfigurasi, membandingkannya dengan state, dan menampilkan apa yang akan berubah tanpa menjalankan apapun. Ini adalah jaring pengaman utama Terraform.
# Plan dasar
terraform plan
# Simpan plan ke file (untuk apply yang deterministik)
terraform plan -out=tfplan
terraform apply tfplan # Apply persis plan yang disimpan
# Override variable saat plan
terraform plan -var="environment=production"
terraform plan -var-file="prod.tfvars"
# Plan hanya resource tertentu (berguna untuk debugging)
terraform plan -target=aws_instance.web
# Skip refresh state (lebih cepat, tapi kurang akurat)
terraform plan -refresh=false
Membaca Output Plan #
Setiap simbol di output plan punya arti spesifik. Kemampuan membaca output plan dengan cepat adalah keterampilan krusial.
flowchart TD
A["Simbol Plan"] --> B["+ create\nResource baru akan dibuat"]
A --> C["- destroy\nResource akan dihapus"]
A --> D["~ update in-place\nResource dimodifikasi tanpa replace"]
A --> E["-/+ replace\nResource dihapus lalu dibuat ulang"]
A --> F["<= read\nData source akan dibaca"]
E --> G["⚠️ HATI-HATI\nBisa menyebabkan downtime\nuntuk resource stateful"]
style B fill:#e8f5e9,stroke:#2e7d32
style C fill:#ffebee,stroke:#c62828
style D fill:#fff3e0,stroke:#e65100
style E fill:#fff3e0,stroke:#e65100
style F fill:#e3f2fd,stroke:#1565c0
style G fill:#ffebee,stroke:#c62828# Contoh output plan dengan berbagai simbol:
# + create (resource baru akan dibuat)
+ 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 tanpa replace)
~ 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. Selalu perhatikan output plan dengan seksama sebelum mengetik yes.
terraform apply
#
terraform apply menjalankan perubahan yang sudah direncanakan. Secara default, ia akan menjalankan plan ulang dan meminta konfirmasi sebelum melakukan perubahan.
# Apply dengan konfirmasi interaktif (default)
terraform apply
# Terraform will perform the following actions:
# ... (plan output) ...
# Do you want to perform these actions?
# Terraform will perform the actions described above.
# Only 'yes' will be accepted to approve.
# Enter a value: yes
# 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 # Persis plan yang disimpan, tidak minta konfirmasi
Flag Penting #
# Override variable saat apply
terraform apply -var="instance_type=t3.small"
terraform apply -var-file="prod.tfvars"
# Apply hanya resource tertentu (untuk targeted fix)
terraform apply -target=aws_instance.web
# Batasi jumlah operasi concurrent (default: 10)
terraform apply -parallelism=5
# Berguna jika API provider punya rate limit
# Refresh state sebelum apply
terraform apply -refresh=true # Default
terraform apply -refresh=false # Skip refresh (lebih cepat)
Gunakan-auto-approvehanya di CI/CD pipeline yang sudah ada review process sebelumnya (misalnya PR approval sebelum merge ke main branch). Menjalankan-auto-approvelangsung di terminal production adalah risiko yang tidak perlu — satu typo di konfigurasi bisa menghapus resource critical.
-target — Use with Caution
#
-target memungkinkan kamu apply hanya resource tertentu. Ini berguna untuk debugging atau targeted fix, tapi bukan untuk penggunaan rutin.
# Berguna untuk targeted fix
terraform apply -target=aws_instance.web
# ANTI-PATTERN: Menggunakan -target secara rutin
# - Membuat state tidak sinkron dengan konfigurasi
# - Resource yang tidak di-target bisa jadi tidak konsisten
# - Sebaiknya gunakan -target hanya untuk debugging
Perintah Inspeksi State #
Perintah-perintah ini membantu kamu memahami kondisi state saat ini dan apa yang sedang dikelola oleh Terraform.
# Lihat semua resource di state
terraform state list
# aws_instance.web
# aws_security_group.web
# aws_subnet.public[0]
# aws_subnet.public[1]
# aws_vpc.main
# Lihat detail satu resource
terraform state show aws_instance.web
# resource "aws_instance" "web" {
# ami = "ami-0abcdef1234567890"
# instance_type = "t3.micro"
# public_ip = "54.123.45.67"
# ...
# }
# Refresh state dari kondisi aktual di cloud
terraform refresh
# Membaca ulang semua resource dari API provider
# Berguna jika ada perubahan manual di luar Terraform
# Tampilkan output values
terraform output
terraform output -raw instance_public_ip # Output spesifik, tanpa quotes
terraform output -json # Format JSON
| Perintah | Fungsi | Kapan digunakan |
|---|---|---|
state list | Lihat daftar resource | Audit, cek apa yang dikelola |
state show <addr> | Detail atribut resource | Debugging, cek nilai |
state rm <addr> | Hapus dari state | Unmanage resource tanpa destroy |
state mv <src> <dst> | Rename/pindah di state | Refactoring |
state pull | Download state | Backup, debugging |
refresh | Sync state dengan cloud | Setelah perubahan manual |
Perintah untuk Formatting dan Validasi #
Perintah-perintah ini menjaga kualitas konfigurasi dan sangat penting untuk diintegrasikan ke dalam workflow sehari-hari.
# 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 (exit code 1 jika ada yang perlu di-format)
terraform fmt -diff # Tampilkan diff perubahan format
# Validasi sintaks konfigurasi
terraform validate
# Success! The configuration is valid.
# Validasi tidak connect ke provider — hanya cek sintaks HCL
# REKOMENDASI: Jalankan sebelum setiap commit
terraform fmt -check && terraform validate
# Di CI/CD pipeline:
terraform fmt -check -recursive # Fail jika format tidak konsisten
terraform validate # Fail jika ada syntax error
Perintah untuk Debugging #
Ketika ada yang tidak berjalan sesuai harapan, perintah-perintah ini sangat membantu.
# Enable logging detail
TF_LOG=TRACE terraform apply # Paling verbose
TF_LOG=DEBUG terraform apply # Detail tinggi
TF_LOG=INFO terraform apply # Informasi umum
TF_LOG=WARN terraform apply # Hanya peringatan
TF_LOG=ERROR terraform apply # Hanya error
# Simpan log ke file (berguna untuk log yang sangat panjang)
TF_LOG=DEBUG TF_LOG_PATH=terraform.log terraform apply
# Log tersimpan di terraform.log, terminal tetap bersih
# Lihat dependency graph (output format DOT untuk Graphviz)
terraform graph
terraform graph | dot -Tpng > graph.png # Visualisasi sebagai gambar
terraform graph -type=plan # Graph dari plan, bukan config
Tabel Referensi Lengkap #
Berikut ringkasan semua perintah yang dibahas, dikategorikan berdasarkan fungsi.
| Kategori | Perintah | Fungsi |
|---|---|---|
| Init & Setup | init | Download provider, setup backend |
init -upgrade | Update provider ke versi terbaru | |
init -reconfigure | Reconfigure backend | |
| Plan & Apply | plan | Preview perubahan |
plan -out=tfplan | Simpan plan ke file | |
apply | Jalankan perubahan | |
apply tfplan | Apply dari saved plan | |
apply -auto-approve | Apply tanpa konfirmasi | |
destroy | Hapus semua resource | |
| State | state list | Lihat resource di state |
state show | Detail resource | |
state rm | Hapus dari state | |
state mv | Rename/pindah di state | |
state pull/push | Download/upload state | |
refresh | Sync state dengan cloud | |
| Quality | fmt | Format konfigurasi |
validate | Validasi sintaks | |
graph | Dependency graph | |
| Debug | TF_LOG=DEBUG | Enable verbose logging |
providers | Lihat provider yang digunakan | |
version | Cek versi Terraform |
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+(create),-(destroy),~(update), dan-/+(replace).-/+berarti replace — resource dihapus dan dibuat ulang, bisa menyebabkan downtime untuk resource stateful seperti database.- Simpan plan dengan
-out=tfplanuntuk production — pastikan yang kamu apply adalah persis yang sudah di-review.terraform fmtdanterraform validateadalah kebiasaan baik sebelum commit — integrasikan ke CI pipeline.-targetuntuk debugging, bukan untuk penggunaan rutin — penggunaan berlebihan bisa membuat state tidak konsisten.TF_LOG=DEBUGadalah teman terbaikmu saat ada yang tidak berjalan sesuai harapan.