Belajar OpenTofu - Fitur Eksklusif 2: Dynamic Provider Iteration (for_each pada Providers)
Episode 7 of 21

Belajar OpenTofu - Fitur Eksklusif 2: Dynamic Provider Iteration (for_each pada Providers)

Terraform melarang penggunaan for_each dan count pada konfigurasi provider, sehingga multi-region ditulis manual satu per satu. Episode ini membahas fitur eksklusif OpenTofu: dynamic provider iteration yang memuat banyak instansi provider sekaligus untuk arsitektur multi-region dan multi-account yang ringkas.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Di episode 6 sebelumnya kita membahas fitur eksklusif pertama OpenTofu: native client-side state encryption — bagaimana state file dienkripsi di sisi client sebelum dikirim ke remote backend, lengkap dengan key provider AWS KMS dan PBKDF2. Setelah memastikan aset paling berharga kita aman, kali ini kita beralih ke masalah praktis kedua yang bikin pusing engineer IaC: menangani banyak region dan banyak account cloud.

Bayangkan perusahaan kalian menaikkan aplikasi ke tiga region AWS sekaligus — Singapura untuk Asia Tenggara, Virginia untuk Amerika, dan Frankfurt untuk Eropa. Di Terraform klasik, kalian harus menulis block provider "aws" tiga kali secara manual, atau memutar lewat modul agar provider bisa di-loop. Keduanya ribet, berulang, dan rawan salah ketik.

Di episode ini kita membahas fitur eksklusif OpenTofu kedua: dynamic provider iteration — kemampuan memuat banyak instansi provider secara dinamis memakai for_each. Kalian akan melihat betapa ringkasnya mengelola multi-region dan multi-account dengan HCL setelah fitur ini ada.

Pembahasan Utama

Keterbatasan Terraform Tradisional

Di Terraform, meta-argument seperti count dan for_each bekerja pada resource, data source, dan modul — tapi dilarang pada block provider. Provider configuration adalah satu-satunya block yang tidak bisa di-loop.

Konsekuensinya, untuk tiga region kalian menulis:

Terraform: provider manual per region
provider "aws" {
  alias  = "singapore"
  region = "ap-southeast-1"
}
 
provider "aws" {
  alias  = "virginia"
  region = "us-east-1"
}
 
provider "aws" {
  alias  = "frankfurt"
  region = "eu-central-1"
}

Perhatikan kata kunci alias — setiap instansi provider butuh nama unik agar bisa direferensikan oleh resource lewat argumen provider. Sekarang bayangkan 10 region, atau 5 account dikali 5 region: block-nya meledak jadi puluhan salinan yang membosankan untuk ditulis dan dirawat. Solusi "resmi" Terraform adalah membungkus semuanya dalam modul yang dipanggil dengan for_each — elegan, tapi tetap menambah lapisan kompleksitas.

Fitur Eksklusif OpenTofu: Provider Iteration

OpenTofu menghapus batasan itu. Block provider kini bisa memakai for_each (dan count) persis seperti resource, dengan each.key dan each.value tersedia di dalamnya:

OpenTofu: dynamic provider iteration
provider "aws" {
  alias  = each.key
  region = each.value
} for_each = {
  singapore = "ap-southeast-1"
  virginia  = "us-east-1"
  frankfurt = "eu-central-1"
}

Satu block menggantikan tiga. Menambah region baru tinggal menambah satu baris di map for_each — tidak ada lagi copy-paste block provider.

Note

Dengan for_each, each.key adalah kunci map dan each.value adalah nilainya. Di contoh di atas, key menjadi alias provider dan value menjadi region — sehingga resource bisa memanggil aws.singapore, aws.virginia, dan seterusnya.

Resource tetap memilih provider mana yang dipakai melalui argumen provider:

resource memakai provider iterasi
resource "aws_vpc" "singapore" {
  provider   = aws.singapore
  cidr_block = "10.0.0.0/16"
}

Multi-Account: Perluasan dengan assume_role

Kekuatan sesungguhnya terlihat saat menyebar ke banyak account. Bayangkan ingin menjalankan resource yang sama di account dev dan prod, masing-masing dengan role yang diasumsikan berbeda:

Multi-account dengan assume_role
provider "aws" {
  alias  = each.key
  region = each.value.region
  assume_role {
    role_arn = "arn:aws:iam::${each.value.account_id}:role/DeployRole"
  }
} for_each = {
  dev  = { account_id = "111122223333", region = "ap-southeast-1" }
  prod = { account_id = "444455556666", region = "us-east-1" }
}

Dengan map dua baris, OpenTofu memuat dua provider dengan kredensial berbeda untuk dua account. Pola ini dipadukan dengan for_each pada resource dan modul membuat satu map berisi seluruh peta lingkungan kalian — dari situ semuanya turun. Inilah pola yang membuat "workspace besar" tetap rapi.

Warning

Pastikan setiap instansi provider punya alias yang unik — gunakan each.key agar otomatis. Tanpa alias, OpenTofu menolak memuat banyak provider sejenis. Di samping itu, jangan gunakan for_each untuk konfigurasi provider yang benar-benar identik; manfaatkan fitur ini untuk menangkap variasi antar region atau account.

Batasan & Catatan Migrasi

  • Provider iterasi menambah satu lapisan pada grafik dependensi; hindari siklus referensi antar provider yang di-loop.
  • Provider yang di-loop tetap diinisialisasi lewat tofu init — kredensial per account diselesaikan saat apply, bukan saat init.
  • Setelah migrasi dari Terraform, block provider lama bisa di-refactor menjadi bentuk iterasi ini tanpa mengubah resource apa pun — alias yang sama membuat resource tetap valid.
  • Cek kebenaran seluruh konfigurasi dengan tofu validate setelah refactor, lalu tinjau perubahannya lewat tofu plan sebelum apply.

Penutup

Ringkasan episode 7:

  • Terraform melarang count dan for_each pada block provider, memaksa penulisan manual per region atau account.
  • OpenTofu mendukung for_each dan count pada provider, lengkap dengan each.key dan each.value.
  • Multi-region jadi cukup satu block plus map region.
  • Multi-account dikombinasikan dengan assume_role menghasilkan provider yang terisolasi per akun.
  • alias unik tetap wajib agar resource bisa mereferensikan instansi provider.

Kemampuan memuat banyak provider secara dinamis ini membuka jalan untuk menulis infrastruktur yang jauh lebih DRY. Di episode 8 selanjutnya kita akan membahas Advanced Expressions, Built-in Functions & Loops — mendalami fungsi bawaan OpenTofu, meta-argument count, for_each, depends_on, aturan lifecycle, serta ekspresi for dan ternary untuk menulis HCL yang ekspresif. Sampai jumpa!