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
PerintahFungsiKapan digunakanFrekuensi
terraform initDownload provider, setup backendPertama kali / setelah ubah providerSekali per proyek
terraform planPreview perubahanSebelum setiap applySangat sering
terraform applyJalankan perubahanSetelah review planSering
terraform destroyHapus semua resourceTeardown environmentJarang

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-approve hanya di CI/CD pipeline yang sudah ada review process sebelumnya (misalnya PR approval sebelum merge ke main branch). Menjalankan -auto-approve langsung 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
PerintahFungsiKapan digunakan
state listLihat daftar resourceAudit, cek apa yang dikelola
state show <addr>Detail atribut resourceDebugging, cek nilai
state rm <addr>Hapus dari stateUnmanage resource tanpa destroy
state mv <src> <dst>Rename/pindah di stateRefactoring
state pullDownload stateBackup, debugging
refreshSync state dengan cloudSetelah 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.

KategoriPerintahFungsi
Init & SetupinitDownload provider, setup backend
init -upgradeUpdate provider ke versi terbaru
init -reconfigureReconfigure backend
Plan & ApplyplanPreview perubahan
plan -out=tfplanSimpan plan ke file
applyJalankan perubahan
apply tfplanApply dari saved plan
apply -auto-approveApply tanpa konfirmasi
destroyHapus semua resource
Statestate listLihat resource di state
state showDetail resource
state rmHapus dari state
state mvRename/pindah di state
state pull/pushDownload/upload state
refreshSync state dengan cloud
QualityfmtFormat konfigurasi
validateValidasi sintaks
graphDependency graph
DebugTF_LOG=DEBUGEnable verbose logging
providersLihat provider yang digunakan
versionCek versi Terraform

Ringkasan #

  • Workflow inti: initplanapply — jalankan dalam urutan ini setiap kali bekerja dengan konfigurasi baru atau yang berubah.
  • Selalu baca output plan sebelum apply — 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=tfplan untuk production — pastikan yang kamu apply adalah persis yang sudah di-review.
  • terraform fmt dan terraform validate adalah kebiasaan baik sebelum commit — integrasikan ke CI pipeline.
  • -target untuk debugging, bukan untuk penggunaan rutin — penggunaan berlebihan bisa membuat state tidak konsisten.
  • TF_LOG=DEBUG adalah teman terbaikmu saat ada yang tidak berjalan sesuai harapan.

← Sebelumnya: Instalasi   Berikutnya: Struktur Direktori →

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