Init #
terraform init adalah langkah pertama yang selalu harus kamu jalankan sebelum bisa melakukan apapun dengan Terraform. Banyak developer menganggapnya sebagai perintah “sekali jalan” yang langsung dilupakan setelahnya — padahal memahami apa yang terjadi di balik layar init sangat membantu saat troubleshooting masalah provider, backend, atau dependency yang tidak terduga. Bagian ini membongkar setiap langkah inisialisasi, kapan kamu perlu menjalankannya ulang, flag apa saja yang penting diketahui, dan bagaimana menangani masalah yang sering muncul.
Apa yang Terjadi Saat terraform init
#
terraform init bukan sekadar “download provider” — ia melakukan beberapa operasi secara berurutan, masing-masing dengan potensi kegagalan yang berbeda.
flowchart TD
A["terraform init"] --> B["1. Baca konfigurasi\n.terraform.tf, variables.tf, dll."]
B --> C["2. Inisialisasi backend\nSetup remote state connection"]
C --> D["3. Download provider plugins\nSesuai required_providers"]
D --> E["4. Install modules\nReferensi module eksternal"]
E --> F["5. Update .terraform.lock.hcl\nCatat versi provider"]
F --> G["✅ Terraform has been\nsuccessfully initialized!"]
C -.->|"Gagal?"| C1["Cek backend config\ndan credentials"]
D -.->|"Gagal?"| D1["Cek koneksi internet\natau provider constraint"]
E -.->|"Gagal?"| E1["Cek module source\ndan version"]
style A fill:#e3f2fd,stroke:#1565c0
style G fill:#e8f5e9,stroke:#2e7d32
style C1 fill:#ffebee,stroke:#c62828
style D1 fill:#ffebee,stroke:#c62828
style E1 fill:#ffebee,stroke:#c62828| Langkah | Apa yang Dilakukan | Output | Bisa Gagal Karena |
|---|---|---|---|
| 1. Baca konfigurasi | Parse semua .tf file | — | Syntax error di HCL |
| 2. Inisialisasi backend | Connect ke S3/GCS/Terraform Cloud | Backend ready | Credential salah, bucket tidak ada |
| 3. Download provider | Tarik binary dari Registry | .terraform/providers/ | Tidak ada internet, version constraint tidak terpenuhi |
| 4. Install module | Download module eksternal | .terraform/modules/ | Module source tidak ditemukan |
| 5. Update lock file | Hash provider binary | .terraform.lock.hcl | — |
Setiap langkah ini bisa gagal secara independen — memahami urutannya membantu kamu tahu harus mencari masalah di mana.
Output Init yang Perlu Dipahami #
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 5.0"...
- Finding cloudflare/cloudflare versions matching "~> 4.0"...
- Installing hashicorp/aws v5.31.0...
- Installed hashicorp/aws v5.31.0 (signed by HashiCorp)
- Installing cloudflare/cloudflare v4.20.0...
- Installed cloudflare/cloudflare v4.20.0 (signed by a HashiCorp partner, key ID ...)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
Perhatikan baris “signed by HashiCorp” — ini adalah verifikasi bahwa provider yang didownload adalah provider resmi, bukan yang dipalsukan. Jika kamu melihat provider yang unsigned atau signed by yang mencurigakan, investigasi sebelum melanjutkan.
Kapan Harus Menjalankan terraform init Ulang
#
Init tidak hanya dijalankan sekali di awal. Ada beberapa kondisi yang mengharuskan kamu menjalankannya lagi.
flowchart TD
A["Perubahan di proyek"] --> B{"Apa yang berubah?"}
B -->|"Provider baru / versi constraint"| C["Jalankan init ulang ✓"]
B -->|"Backend config"| D["Jalankan init ulang ✓"]
B -->|"Module eksternal baru"| E["Jalankan init ulang ✓"]
B -->|"Clone di mesin baru"| F["Jalankan init ulang ✓"]
B -->|"Resource config (main.tf)"| G["Tidak perlu init ✗"]
B -->|"Variable values (.tfvars)"| H["Tidak perlu init ✗"]
B -->|"Output definitions"| I["Tidak perlu init ✗"]
style C fill:#e3f2fd,stroke:#1565c0
style D fill:#e3f2fd,stroke:#1565c0
style E fill:#e3f2fd,stroke:#1565c0
style F fill:#e3f2fd,stroke:#1565c0
style G fill:#e8f5e9,stroke:#2e7d32
style H fill:#e8f5e9,stroke:#2e7d32
style I fill:#e8f5e9,stroke:#2e7d32| Perubahan | Perlu Init Ulang? | Alasan |
|---|---|---|
| Menambah provider baru | ✅ Ya | Provider binary belum didownload |
| Mengubah versi constraint provider | ✅ Ya | Mungkin perlu versi berbeda |
| Mengubah konfigurasi backend | ✅ Ya | Backend perlu direkonfigurasi |
| Menambah module eksternal baru | ✅ Ya | Module belum didownload |
| Clone di mesin baru | ✅ Ya | .terraform/ belum ada |
| Mengubah resource di main.tf | ❌ Tidak | Cukup plan atau apply |
| Mengubah nilai variable | ❌ Tidak | Cukup plan atau apply |
| Mengubah output definition | ❌ Tidak | Cukup plan atau apply |
Flag-flag Penting #
Setiap flag init punya use-case spesifik. Menggunakan flag yang salah bisa menyebabkan state hilang atau konfigurasi backend tidak sinkron.
flowchart TD
A["Butuh init dengan flag?"] --> B{"Tujuannya?"}
B -->|"Update provider ke versi\nterbaru constraint"| C["terraform init -upgrade"]
B -->|"Ganti backend tanpa\nmigrasi state"| D["terraform init -reconfigure"]
B -->|"Pindah state ke\nbackend baru"| E["terraform init -migrate-state"]
B -->|"Hanya install provider,\ntidak setup backend"| F["terraform init -backend=false"]
B -->|"Environment tanpa\ninternet"| G["terraform init -plugin-dir=PATH"]
style C fill:#e3f2fd,stroke:#1565c0
style D fill:#fff3e0,stroke:#e65100
style E fill:#ffebee,stroke:#c62828
style F fill:#e8f5e9,stroke:#2e7d32
style G fill:#f3e5f5,stroke:#7b1fa2-upgrade
#
# Update provider ke versi terbaru yang memenuhi constraint
terraform init -upgrade
# Tanpa -upgrade: Terraform menggunakan versi yang tercatat di .terraform.lock.hcl
# Dengan -upgrade: Terraform mengabaikan lock file dan cari versi terbaru
# Kapan digunakan:
# - Setelah mengubah version constraint (misal ~> 5.0 → ~> 5.1)
# - Saat ingin mendapatkan patch terbaru
# - Saat troubleshooting provider bug yang mungkin sudah di-fix
-reconfigure
#
# Paksa reconfigure backend tanpa memindahkan state
terraform init -reconfigure
# Kapan digunakan:
# - Backend config di .tf berubah tapi state tidak perlu dimigrasikan
# - Error "Backend configuration changed" yang tidak bisa diselesaikan dengan init biasa
# - Pindah dari satu bucket S3 ke bucket S3 lain (state sudah di-copy manual)
-migrate-state
#
# Migrasi state ke backend baru secara interaktif
terraform init -migrate-state
# Kapan digunakan:
# - Pindah dari local state ke remote backend
# - Pindah dari S3 ke Terraform Cloud
# - Pindah dari satu remote backend ke backend lain
# ⚠️ HATI-HATI: Pastikan backup state ada sebelum migrasi
# Jika migrasi gagal di tengah jalan, state bisa hilang
-backend=false
#
# Init tanpa setup backend
terraform init -backend=false
# Kapan digunakan:
# - CI/CD pipeline yang hanya perlu plan (tidak perlu state)
# - Testing konfigurasi tanpa koneksi ke remote backend
# - Terraform validate di PR check
-plugin-dir
#
# Gunakan provider binary dari direktori lokal
terraform init -plugin-dir=/path/to/local-mirror
# Kapan digunakan:
# - Environment tanpa akses internet (air-gapped)
# - CI/CD yang cache provider binary di shared storage
# - Keamanan: tidak boleh download dari internet
| Flag | Fungsi | Risiko | Frekuensi |
|---|---|---|---|
-upgrade | Update provider | Rendah — bisa di-revert | Sesekali |
-reconfigure | Reconfigure backend | Sedang — pastikan state aman | Jarang |
-migrate-state | Migrasi state | Tinggi — backup dulu! | Sangat jarang |
-backend=false | Skip backend | Rendah — tidak ada state | CI/CD |
-plugin-dir | Local provider mirror | Rendah | Air-gapped env |
Struktur Direktori .terraform Setelah Init
#
Memahami isi .terraform/ membantu saat troubleshooting — kamu tahu file apa yang seharusnya ada dan apa yang terjadi jika salah satu hilang.
.terraform/
├── providers/
│ └── registry.terraform.io/
│ ├── hashicorp/
│ │ └── aws/
│ │ └── 5.31.0/
│ │ └── linux_amd64/
│ │ └── terraform-provider-aws_v5.31.0_x5
│ └── cloudflare/
│ └── cloudflare/
│ └── 4.20.0/
│ └── linux_amd64/
│ └── terraform-provider-cloudflare_v4.20.0
└── terraform.tfstate
(metadata backend, bukan state infrastruktur)
Direktori ini tidak perlu di-commit ke Git. Cukup .terraform.lock.hcl yang di-commit, dan setiap anggota tim akan mendapat binary provider yang identik saat mereka menjalankan terraform init.
# Apa yang di-commit vs tidak:
# .terraform/ ← JANGAN di-commit (binary, bisa regenerate)
# .terraform.lock.hcl ← HARUS di-commit (lock provider versions)
Init di Environment Tanpa Internet #
Di lingkungan corporate atau air-gapped environment, Terraform tidak bisa mengakses Terraform Registry. Kamu perlu menyiapkan provider mirror sebelumnya.
flowchart LR
subgraph "Mesin dengan Internet"
A["terraform providers mirror\n/path/to/mirror"] --> B["Provider binary\ndidownload ke lokal"]
end
subgraph "Transfer"
B --> C["Copy mirror\nto air-gapped machine"]
end
subgraph "Mesin tanpa Internet"
C --> D["terraform init\n-plugin-dir=/path/to/mirror"]
D --> E["Init berhasil\ntanpa internet!"]
end
style A fill:#e3f2fd,stroke:#1565c0
style E fill:#e8f5e9,stroke:#2e7d32# Di mesin yang punya akses internet:
# Download semua provider yang dibutuhkan
terraform providers mirror /path/to/local-mirror
# Copy hasilnya ke mesin tanpa internet (USB, internal network, dll.)
# Lalu jalankan:
terraform init -plugin-dir=/path/to/local-mirror
Alternatif: konfigurasi filesystem mirror di ~/.terraformrc agar selalu digunakan.
# ~/.terraformrc — konfigurasi provider installation
provider_installation {
filesystem_mirror {
path = "/usr/share/terraform/providers"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
Masalah Umum dan Solusinya #
| Error | Penyebab | Solusi |
|---|---|---|
Failed to query available provider packages | Tidak ada koneksi ke registry | Cek internet, atau gunakan -plugin-dir |
Required plugins are not installed | .terraform/ belum ada / terhapus | Jalankan terraform init |
Backend configuration changed | Backend config berbeda dari tersimpan | init -reconfigure atau init -migrate-state |
Lock file not compatible | Lock file di-generate di platform berbeda | terraform providers lock -platform=linux_amd64 -platform=darwin_arm64 |
Failed to read backend config | Credential backend salah | Cek credential dan permission |
Module not found | Module source salah / tidak accessible | Cek source path dan version |
# Lock file untuk multi-platform (jika tim pakai OS berbeda):
terraform providers lock \
-platform=linux_amd64 \
-platform=darwin_arm64 \
-platform=windows_amd64
# Jalankan ini dari mesin yang punya akses ke semua provider
# Agar lock file mencakup hash untuk semua platform
Ringkasan #
terraform initmelakukan 4 hal: inisialisasi backend, download provider, install module, dan update lock file — setiap langkah bisa gagal secara independen.- Jalankan ulang setiap kali ada perubahan pada provider, backend, atau module eksternal — bukan hanya di awal proyek.
- Commit
.terraform.lock.hcl, jangan commit direktori.terraform/— ini memastikan semua anggota tim menggunakan versi provider yang identik.-upgradeuntuk update provider,-reconfigureuntuk ganti backend tanpa migrasi state,-migrate-stateuntuk ganti backend dengan migrasi — pilih flag yang tepat untuk situasimu.- Backup state sebelum
-migrate-state— migrasi yang gagal di tengah jalan bisa menyebabkan state hilang.- Environment tanpa internet butuh provider mirror lokal — siapkan
terraform providers mirrorsebelum deploy ke lingkungan restricted.- Multi-platform lock file — jika tim menggunakan OS berbeda, jalankan
terraform providers lockdengan multiple-platformflag.