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
LangkahApa yang DilakukanCatatan
1. Check saved planJika ada file plan diberikan, gunakan ituPaling aman — tidak ada re-plan
2. Generate plan (jika perlu)Buat execution plan dari config + stateSama seperti terraform plan
3. KonfirmasiUser ketik yesDilewati jika -auto-approve atau saved plan
4. EksekusiJalankan operasi sesuai dependency graphResource independen paralel
5. Update stateSetelah setiap resource selesaiIncremental, bukan di akhir
6. RingkasanTampilkan jumlah add/change/destroyTermasuk 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
ModePerintahKonfirmasiPlan Baru?Cocok Untuk
Interaktifterraform applyKetik yes✅ YaDevelopment, eksplorasi
Auto-approveterraform apply -auto-approveTidak✅ YaCI/CD yang sudah ada review
Saved planterraform apply tfplanTidak❌ TidakProduction — 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:#2e7d32
SKENARIO: 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 GagalYang TerjadiYang Harus Dilakukan
Resource A berhasil, B gagalA ada di state, B tidakPerbaiki penyebab gagal, apply ulang
Error permissionResource terakhir gagalCek IAM policy, apply ulang
Error API rate limitBeberapa resource gagalKurangi -parallelism, apply ulang
State corrupt (jarang)State tidak konsistenRestore dari backup state
Jangan pernah menjalankan terraform destroy sebagai respons kegagalan partial apply kecuali kamu benar-benar yakin ingin menghapus semua resource. Cukup perbaiki masalahnya dan jalankan terraform apply lagi — 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❌ HindariApply semua resource
Hanya mau apply sebagian❌ HindariPisahkan ke module/directory
-target berguna 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.
-parallelismCocok UntukRisiko
3-5Provider dengan rate limit ketatLebih lambat
10 (default)Kebanyakan kasusSeimbang
15-20Infrastruktur sangat besarAPI 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 OutputArtiAction
Creating...Resource sedang dibuatTunggu
Still creating... [Xs elapsed]Masih dalam prosesNormal untuk resource besar
Creation complete after Xs [id=...]BerhasilCatat ID jika perlu
Error: ...GagalBaca error, perbaiki, apply ulang
Apply complete! Resources: X added...SelesaiVerifikasi 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-approve untuk CI/CD), dan saved plan (apply tfplan untuk production — paling aman).
  • Gunakan saved plan untuk production — pastikan yang di-apply adalah persis yang sudah di-review.
  • -auto-approve hanya untuk CI/CD yang sudah ada review process — jangan digunakan langsung di terminal production.
  • -target adalah alat darurat, bukan workflow rutin — penggunaan berlebihan bisa menyebabkan state yang tidak konsisten.
  • -parallelism bisa 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.

← Sebelumnya: Plan   Berikutnya: Destroy →

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