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.

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.
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:
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.
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:
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 "aws_vpc" "singapore" {
provider = aws.singapore
cidr_block = "10.0.0.0/16"
}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:
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.
tofu init — kredensial per account diselesaikan saat apply, bukan saat init.provider lama bisa di-refactor menjadi bentuk iterasi ini tanpa mengubah resource apa pun — alias yang sama membuat resource tetap valid.tofu validate setelah refactor, lalu tinjau perubahannya lewat tofu plan sebelum apply.Ringkasan episode 7:
count dan for_each pada block provider, memaksa penulisan manual per region atau account.for_each dan count pada provider, lengkap dengan each.key dan each.value.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!