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
LangkahApa yang DilakukanOutputBisa Gagal Karena
1. Baca konfigurasiParse semua .tf fileSyntax error di HCL
2. Inisialisasi backendConnect ke S3/GCS/Terraform CloudBackend readyCredential salah, bucket tidak ada
3. Download providerTarik binary dari Registry.terraform/providers/Tidak ada internet, version constraint tidak terpenuhi
4. Install moduleDownload module eksternal.terraform/modules/Module source tidak ditemukan
5. Update lock fileHash 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
PerubahanPerlu Init Ulang?Alasan
Menambah provider baru✅ YaProvider binary belum didownload
Mengubah versi constraint provider✅ YaMungkin perlu versi berbeda
Mengubah konfigurasi backend✅ YaBackend perlu direkonfigurasi
Menambah module eksternal baru✅ YaModule belum didownload
Clone di mesin baru✅ Ya.terraform/ belum ada
Mengubah resource di main.tf❌ TidakCukup plan atau apply
Mengubah nilai variable❌ TidakCukup plan atau apply
Mengubah output definition❌ TidakCukup 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
FlagFungsiRisikoFrekuensi
-upgradeUpdate providerRendah — bisa di-revertSesekali
-reconfigureReconfigure backendSedang — pastikan state amanJarang
-migrate-stateMigrasi stateTinggi — backup dulu!Sangat jarang
-backend=falseSkip backendRendah — tidak ada stateCI/CD
-plugin-dirLocal provider mirrorRendahAir-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 #

ErrorPenyebabSolusi
Failed to query available provider packagesTidak ada koneksi ke registryCek internet, atau gunakan -plugin-dir
Required plugins are not installed.terraform/ belum ada / terhapusJalankan terraform init
Backend configuration changedBackend config berbeda dari tersimpaninit -reconfigure atau init -migrate-state
Lock file not compatibleLock file di-generate di platform berbedaterraform providers lock -platform=linux_amd64 -platform=darwin_arm64
Failed to read backend configCredential backend salahCek credential dan permission
Module not foundModule source salah / tidak accessibleCek 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 init melakukan 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.
  • -upgrade untuk update provider, -reconfigure untuk ganti backend tanpa migrasi state, -migrate-state untuk 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 mirror sebelum deploy ke lingkungan restricted.
  • Multi-platform lock file — jika tim menggunakan OS berbeda, jalankan terraform providers lock dengan multiple -platform flag.

← Sebelumnya: Struktur Direktori   Berikutnya: Plan →

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