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.
Apa yang Terjadi Saat terraform init #
terraform init melakukan beberapa hal sekaligus, bukan hanya satu operasi sederhana.
terraform init — Urutan Eksekusi:
1. Baca konfigurasi (.tf files) di direktori saat ini
│
▼
2. Inisialisasi backend
(setup remote state jika dikonfigurasi)
│
▼
3. Download dan install provider plugins
(sesuai deklarasi di required_providers)
│
▼
4. Install modules
(jika ada referensi ke module eksternal)
│
▼
5. Buat/update .terraform.lock.hcl
(catat versi provider yang diinstall)
│
▼
6. Terraform has been successfully initialized!
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.
Kapan Harus Menjalankan terraform init Ulang #
Init tidak hanya dijalankan sekali di awal. Ada beberapa kondisi yang mengharuskan kamu menjalankannya lagi.
JALANKAN terraform init ULANG JIKA:
✓ Menambahkan provider baru ke required_providers
✓ Mengubah versi constraint provider
✓ Mengubah konfigurasi backend (misal: ganti dari local ke S3)
✓ Menambahkan referensi ke module eksternal baru
✓ Clone repository di mesin baru (direktori .terraform belum ada)
✓ Setelah menghapus direktori .terraform secara manual
TIDAK PERLU terraform init ULANG JIKA:
✗ Hanya mengubah konfigurasi resource (main.tf, variables.tf)
✗ Hanya mengubah nilai variable (.tfvars)
✗ Provider dan module tidak berubah
Flag-flag Penting #
# Update provider ke versi terbaru yang memenuhi constraint
# (berguna saat mau upgrade provider)
terraform init -upgrade
# Paksa reconfigure backend tanpa memindahkan state
# (berguna saat backend config berubah tapi state tidak perlu dimigrasikan)
terraform init -reconfigure
# Migrasi state ke backend baru secara interaktif
terraform init -migrate-state
# Init tanpa setup backend (hanya install provider)
# Berguna untuk testing atau CI yang tidak butuh remote state
terraform init -backend=false
# Tentukan direktori plugin yang sudah ada secara lokal
# (berguna di environment tanpa akses internet)
terraform init -plugin-dir=/path/to/plugins
Struktur Direktori .terraform Setelah Init #
Memahami isi .terraform/ membantu saat troubleshooting.
.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.
Init di Environment Tanpa Internet #
Di lingkungan corporate atau air-gapped environment, Terraform tidak bisa mengakses Terraform Registry. Ada beberapa solusi.
# Opsi 1: Provider mirror lokal
# Download provider di mesin yang punya akses internet:
terraform providers mirror /path/to/local-mirror
# Gunakan mirror di mesin tanpa internet:
terraform init -plugin-dir=/path/to/local-mirror
# Opsi 2: Konfigurasi filesystem mirror di ~/.terraformrc
provider_installation {
filesystem_mirror {
path = "/usr/share/terraform/providers"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
Masalah Umum dan Solusinya #
# Error: Failed to query available provider packages
# Penyebab: Tidak ada koneksi ke registry.terraform.io
# Solusi: Cek koneksi internet, atau gunakan provider mirror
# Error: Required plugins are not installed
# Penyebab: .terraform/ belum ada atau terhapus
# Solusi: Jalankan terraform init
# Error: Backend configuration changed
# Penyebab: Backend config di .tf berbeda dari yang tersimpan di .terraform/
# Solusi: terraform init -reconfigure (tanpa migrasi state)
# atau terraform init -migrate-state (dengan migrasi state)
# Error: Lock file not compatible
# Penyebab: .terraform.lock.hcl di-generate di platform berbeda
# Solusi: terraform providers lock -platform=linux_amd64 -platform=darwin_arm64
Ringkasan #
terraform initmelakukan 4 hal: inisialisasi backend, download provider, install module, dan update lock file.- 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.- Environment tanpa internet butuh provider mirror lokal — siapkan sebelum deploy ke lingkungan restricted.