Apply #
terraform apply adalah perintah yang benar-benar mengubah infrastrukturmu. Semua yang sudah kamu rencanakan di plan dieksekusi di sini. Karena dampaknya nyata dan langsung, memahami cara apply bekerja — termasuk apa yang terjadi saat ada yang salah di tengah jalan — adalah perbedaan antara deployment yang terkontrol dan insiden yang tidak perlu.
Cara Apply Bekerja #
flowchart TD
A["terraform apply"] --> B{"Ada saved plan\ndiberikan?"}
B -->|"Ya: apply tfplan"| C["Langsung eksekusi\nsaved plan"]
B -->|"Tidak: apply biasa"| D["Generate plan baru"]
D --> E["Tampilkan plan\nMinta konfirmasi 'yes'"]
E --> F["Konfirmasi diterima"]
C --> G["Eksekusi sesuai\ndependency graph"]
F --> G
G --> H["Resource independen\ndieksekusi paralel\n(max 10 concurrent)"]
H --> I["State diupdate setelah\nsetiap resource selesai"]
I --> J["Tampilkan ringkasan\nApply complete!"]
I -.->|"Gagal di\ntengah jalan?"| K["Partial state:\nresource yang sudah\nberhasil tetap tercatat"]
style A fill:#e3f2fd,stroke:#1565c0
style J fill:#e8f5e9,stroke:#2e7d32
style K fill:#fff3e0,stroke:#e65100| Langkah | Apa yang Dilakukan | Catatan |
|---|---|---|
| 1. Check saved plan | Jika ada file plan diberikan, gunakan itu | Paling aman — tidak ada re-plan |
| 2. Generate plan (jika perlu) | Buat execution plan dari config + state | Sama seperti terraform plan |
| 3. Konfirmasi | User ketik yes | Dilewati jika -auto-approve atau saved plan |
| 4. Eksekusi | Jalankan operasi sesuai dependency graph | Resource independen paralel |
| 5. Update state | Setelah setiap resource selesai | Incremental, bukan di akhir |
| 6. Ringkasan | Tampilkan jumlah add/change/destroy | Termasuk output values |
Poin penting di langkah 5: state diupdate setelah setiap resource, bukan di akhir setelah semua selesai. Ini fundamental untuk memahami apa yang terjadi saat apply gagal di tengah jalan.
Apply Interaktif vs Otomatis #
flowchart TD
A["Tiga mode apply"] --> B["Interaktif\n(terminal)"]
A --> C["Auto-approve\n(CI/CD)"]
A --> D["Saved plan\n(paling aman)"]
B --> B1["terraform apply\nUser ketik 'yes'"]
C --> C1["terraform apply -auto-approve\nLangsung eksekusi"]
D --> D1["terraform apply tfplan\nEksekusi plan yang sudah disimpan"]
B1 --> E["⚠️ Plan baru bisa\nberbeda dari yang\ndi-review sebelumnya"]
C1 --> E
D1 --> F["✅ Persis seperti\nyang sudah di-review"]
style E fill:#fff3e0,stroke:#e65100
style F fill:#e8f5e9,stroke:#2e7d32| Mode | Perintah | Konfirmasi | Plan Baru? | Cocok Untuk |
|---|---|---|---|---|
| Interaktif | terraform apply | Ketik yes | ✅ Ya | Development, eksplorasi |
| Auto-approve | terraform apply -auto-approve | Tidak | ✅ Ya | CI/CD yang sudah ada review |
| Saved plan | terraform apply tfplan | Tidak | ❌ Tidak | Production — paling aman |
# Apply interaktif (default) — minta konfirmasi sebelum eksekusi
terraform apply
# Output:
# Plan: 3 to add, 1 to change, 0 to destroy.
#
# 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 ← ketik ini
# Apply otomatis — 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, tidak ada plan baru — langsung eksekusi saved plan
Apa yang Terjadi Saat Apply Gagal di Tengah Jalan #
Ini adalah skenario yang paling sering menimbulkan kebingungan. Karena state diupdate secara incremental, kegagalan di tengah apply menghasilkan partial state.
flowchart TD
A["Apply dimulai\ntarget: 5 resource"] --> B["✅ aws_vpc.main\ndibuat, state diupdate"]
B --> C["✅ aws_subnet.public\ndibuat, state diupdate"]
C --> D["❌ aws_instance.web\nGAGAL! AMI tidak ditemukan"]
D --> E["⛔ aws_security_group\ntidak sempat dieksekusi"]
E --> F["⛔ aws_rds.database\ntidak sempat dieksekusi"]
D --> G["State sekarang:\nberisi VPC + subnet\nyang sudah berhasil"]
G --> H["Solusi: Perbaiki\npenyebab kegagalan"]
H --> I["terraform apply lagi"]
I --> J["✅ Terraform melanjutkan\ndari resource yang\nbelum selesai\nVPC & subnet TIDAK\ndibuat ulang"]
style B fill:#e8f5e9,stroke:#2e7d32
style C fill:#e8f5e9,stroke:#2e7d32
style D fill:#ffebee,stroke:#c62828
style E fill:#ffebee,stroke:#c62828
style F fill:#ffebee,stroke:#c62828
style J fill:#e8f5e9,stroke:#2e7d32SKENARIO: Apply gagal setelah membuat 2 dari 5 resource
Before apply:
State: kosong
Apply dimulai:
✓ aws_vpc.main → dibuat, state diupdate
✓ aws_subnet.public → dibuat, state diupdate
✗ aws_instance.web → GAGAL (misal: AMI tidak ditemukan)
- aws_security_group → tidak sempat dieksekusi
- aws_rds.database → tidak sempat dieksekusi
After failed apply:
State: berisi aws_vpc.main dan aws_subnet.public
(resource yang sudah berhasil dibuat)
Apa yang harus dilakukan:
1. Perbaiki penyebab kegagalan (misal: ganti AMI ke yang valid)
2. Jalankan terraform plan untuk melihat kondisi saat ini
3. Jalankan terraform apply lagi
→ Terraform akan melanjutkan dari resource yang belum dibuat
→ VPC dan subnet tidak akan dibuat ulang (sudah ada di state)
Terraform tidak melakukan rollback otomatis. Ini disengaja — rollback otomatis bisa berbahaya jika resource yang sudah dibuat memiliki data di dalamnya.
| Saat Apply Gagal | Yang Terjadi | Yang Harus Dilakukan |
|---|---|---|
| Resource A berhasil, B gagal | A ada di state, B tidak | Perbaiki penyebab gagal, apply ulang |
| Error permission | Resource terakhir gagal | Cek IAM policy, apply ulang |
| Error API rate limit | Beberapa resource gagal | Kurangi -parallelism, apply ulang |
| State corrupt (jarang) | State tidak konsisten | Restore dari backup state |
Jangan pernah menjalankanterraform destroysebagai respons kegagalan partial apply kecuali kamu benar-benar yakin ingin menghapus semua resource. Cukup perbaiki masalahnya dan jalankanterraform applylagi — Terraform akan melanjutkan dari tempat terakhir.
Apply dengan Target #
-target memungkinkan apply hanya pada resource tertentu, mengabaikan resource lain.
flowchart TD
A["Butuh apply\nresource spesifik?"] --> B{"Alasannya?"}
B -->|"Emergency fix\ndi production"| C["terraform apply\n-target=resource\n✅ Boleh sesekali"]
B -->|"Debugging\nsatu resource"| D["terraform apply\n-target=resource\n✅ Boleh sesekali"]
B -->|"Workflow sehari-hari"| E["❌ JANGAN gunakan\n-target"]
B -->|"Tidak mau apply\nsemua resource"| F["Pisahkan ke\ndirectory/module\nberbeda"]
E --> E1["Gunakan normal:\nterraform apply\nSemua resource"]
style C fill:#e8f5e9,stroke:#2e7d32
style D fill:#e8f5e9,stroke:#2e7d32
style E fill:#ffebee,stroke:#c62828
style F fill:#e3f2fd,stroke:#1565c0# Apply hanya satu resource spesifik
terraform apply -target=aws_instance.web
# Apply seluruh module
terraform apply -target=module.vpc
# Apply beberapa resource sekaligus
terraform apply -target=aws_instance.web -target=aws_security_group.web
| Skenario | -target? | Alternatif |
|---|---|---|
| Emergency fix di production | ✅ Boleh | — |
| Debugging satu resource | ✅ Boleh | — |
| Apply rutin sehari-hari | ❌ Hindari | Apply semua resource |
| Hanya mau apply sebagian | ❌ Hindari | Pisahkan ke module/directory |
-targetberguna untuk keadaan darurat atau debugging, tapi hindari penggunaan rutin. Ia bisa membuat state tidak konsisten dengan konfigurasi karena dependency antar resource tidak sepenuhnya dievaluasi. Jika kamu sering butuh-target, itu tanda bahwa konfigurasimu mungkin perlu di-refactor.
Paralelisme Apply #
Secara default, Terraform menjalankan hingga 10 operasi secara paralel. Ini bisa disesuaikan sesuai kebutuhan.
flowchart LR
subgraph "Default (10 parallel)"
R1["Resource 1"] --> OK1["✅"]
R2["Resource 2"] --> OK2["✅"]
R3["Resource 3"] --> OK3["✅"]
DOT1["..."] --> DOT1O["✅"]
R10["Resource 10"] --> OK10["✅"]
end
subgraph "Dibatasi (3 parallel)"
R11["Resource 1"] --> OK11["✅"]
R12["Resource 2"] --> WAIT["⏳ waiting"]
R13["Resource 3"] --> WAIT
WAIT --> OK12["✅"]
WAIT --> OK13["✅"]
end# Kurangi paralelisme (berguna jika provider punya rate limit)
terraform apply -parallelism=5
# Tingkatkan paralelisme (hati-hati dengan rate limit provider)
terraform apply -parallelism=20
# Untuk infrastruktur besar dengan banyak resource,
# rate limit provider AWS/GCP bisa menjadi bottleneck.
# Mengurangi -parallelism bisa membantu menghindari throttling.
-parallelism | Cocok Untuk | Risiko |
|---|---|---|
3-5 | Provider dengan rate limit ketat | Lebih lambat |
10 (default) | Kebanyakan kasus | Seimbang |
15-20 | Infrastruktur sangat besar | API throttling |
Strategi Apply yang Aman untuk Production #
flowchart TD
A["1. terraform plan -out=tfplan\nGenerate dan simpan plan"] --> B["2. terraform show tfplan\nReview plan (bisa dibaca manusia)"]
B --> C["3. Submit untuk approval\nPR review, Slack notification, dll."]
C --> D["4. Approval diterima"]
D --> E["5. terraform apply tfplan\nApply dari saved plan"]
E --> F["6. rm tfplan\nHapus file plan yang berisi sensitif"]
F --> G["✅ Deployment selesai\nAudit trail tersimpan"]
style A fill:#e3f2fd,stroke:#1565c0
style E fill:#e8f5e9,stroke:#2e7d32
style G fill:#e8f5e9,stroke:#2e7d32# WORKFLOW YANG DIREKOMENDASIKAN UNTUK PRODUCTION:
# 1. Generate dan simpan plan
terraform plan -out=tfplan
# 2. Review plan (bisa dibaca manusia)
terraform show tfplan
# 3. Jika ada CI/CD — submit untuk approval
# (PR review, Slack notification, dll.)
# 4. Setelah disetujui, apply dari saved plan
terraform apply tfplan
# 5. Hapus saved plan setelah selesai
rm tfplan
# Kenapa pakai saved plan?
# - Tidak ada plan ulang saat apply — apa yang di-review persis yang dieksekusi
# - Tidak ada kejutan dari perubahan kondisi antara review dan apply
# - Audit trail yang jelas: plan file bisa disimpan sebagai bukti
Membaca Output Apply #
$ terraform apply tfplan
aws_vpc.main: Creating...
aws_vpc.main: Creation complete after 2s [id=vpc-0abcdef1234567890]
aws_subnet.public: Creating...
aws_subnet.public: Creation complete after 1s [id=subnet-0abcdef1234567890]
aws_instance.web: Creating...
aws_instance.web: Still creating... [10s elapsed]
aws_instance.web: Still creating... [20s elapsed]
aws_instance.web: Creation complete after 23s [id=i-0abcdef1234567890]
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Outputs:
instance_public_ip = "54.123.45.67"
Terraform menampilkan progress secara real-time. Resource yang butuh waktu lama (seperti EC2 instance atau RDS) akan menampilkan “Still creating…” setiap 10 detik.
| Bagian Output | Arti | Action |
|---|---|---|
Creating... | Resource sedang dibuat | Tunggu |
Still creating... [Xs elapsed] | Masih dalam proses | Normal untuk resource besar |
Creation complete after Xs [id=...] | Berhasil | Catat ID jika perlu |
Error: ... | Gagal | Baca error, perbaiki, apply ulang |
Apply complete! Resources: X added... | Selesai | Verifikasi hasil di cloud console |
Ringkasan #
- State diupdate incremental setiap resource selesai — bukan di akhir. Kegagalan di tengah apply menghasilkan partial state yang valid.
- Tidak ada rollback otomatis — setelah resource dibuat, Terraform tidak menghapusnya jika resource berikutnya gagal. Cukup perbaiki masalah dan apply ulang.
- Tiga mode apply: interaktif (ketik
yes), auto-approve (-auto-approveuntuk CI/CD), dan saved plan (apply tfplanuntuk production — paling aman).- Gunakan saved plan untuk production — pastikan yang di-apply adalah persis yang sudah di-review.
-auto-approvehanya untuk CI/CD yang sudah ada review process — jangan digunakan langsung di terminal production.-targetadalah alat darurat, bukan workflow rutin — penggunaan berlebihan bisa menyebabkan state yang tidak konsisten.-parallelismbisa disesuaikan — kurangi jika terkena rate limit API provider, tingkatkan jika infrastruktur sangat besar.- Jika apply gagal di tengah jalan, perbaiki penyebabnya lalu apply ulang — Terraform akan melanjutkan dari resource yang belum selesai.