Apa itu Multi Provider? #
Sebagian besar tutorial Terraform dimulai dengan satu provider — biasanya AWS atau GCP. Tapi infrastruktur nyata jarang sesederhana itu. Kamu mungkin perlu membuat resource di dua region AWS sekaligus untuk disaster recovery, mengelola DNS di Cloudflare sementara server ada di AWS, atau membuat cluster Kubernetes di GCP sambil menyimpan secret di HashiCorp Vault. Multi provider adalah kemampuan Terraform untuk mengelola semua ini dalam satu konfigurasi, dengan koordinasi yang tepat antar resource dari sumber yang berbeda.
Konfigurasi Provider Dasar #
Secara default, satu blok provider sudah cukup untuk satu deployment tunggal. Provider default tidak perlu alias.
# Provider tunggal — paling umum
provider "aws" {
region = "ap-southeast-1"
}
# Semua resource di file .tf menggunakan provider ini secara otomatis
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
Provider Alias: Dasar Multi-Provider #
Alias adalah mekanisme yang memberi nama tambahan pada konfigurasi provider. Dengan alias, kamu bisa punya beberapa instance dari provider yang sama — misalnya AWS di dua region berbeda — atau beberapa provider berbeda dalam satu konfigurasi.
# Provider AWS untuk primary region (tanpa alias = provider default)
provider "aws" {
region = "ap-southeast-1"
}
# Provider AWS untuk disaster recovery region (dengan alias)
provider "aws" {
alias = "us_east"
region = "us-east-1"
}
# Provider untuk DNS (provider yang berbeda sama sekali)
provider "cloudflare" {
api_token = var.cloudflare_api_token
}
# Resource menggunakan provider default (tidak perlu menyebut provider)
resource "aws_vpc" "primary" {
provider = aws # Opsional — ini default
cidr_block = "10.0.0.0/16"
}
# Resource menggunakan provider dengan alias
resource "aws_vpc" "dr" {
provider = aws.us_east # Format: <type>.<alias>
cidr_block = "10.1.0.0/16"
}
# Resource dari provider yang berbeda
resource "cloudflare_record" "app" {
zone_id = var.cloudflare_zone_id
name = "app"
value = aws_lb.main.dns_name
type = "CNAME"
}
Use Case Umum Multi Provider #
1. MULTI-REGION (AWS)
Alasan: Disaster recovery, latency reduction, data residency
Pola : Provider alias per region
2. MULTI-ACCOUNT (AWS)
Alasan: Environment isolation, billing separation
Pola : Provider alias per account dengan assume_role berbeda
3. MULTI-CLOUD
Alasan: Best-of-breed services, vendor lock-in mitigation
Pola : Provider berbeda (aws + google + azurerm)
4. CLOUD + SaaS
Alasan: DNS di Cloudflare, monitoring di Datadog, secrets di Vault
Pola : Provider cloud + provider SaaS/tool
5. KUBERNETES
Alasan: Deploy ke k8s sekaligus provision infrastrukturnya
Pola : Provider aws/gcp + provider kubernetes/helm
Multi-Region: Disaster Recovery #
Salah satu use case paling umum multi provider adalah replikasi resource ke region kedua untuk disaster recovery.
provider "aws" {
region = "ap-southeast-1" # Primary region — Singapore
}
provider "aws" {
alias = "dr"
region = "ap-northeast-1" # DR region — Tokyo
}
# Primary database di Singapore
resource "aws_db_instance" "primary" {
identifier = "production-db-primary"
engine = "postgres"
instance_class = "db.r5.large"
# ...
backup_retention_period = 7
}
# Read replica di Tokyo untuk DR
resource "aws_db_instance" "replica" {
provider = aws.dr # Resource ini dibuat di region Tokyo
identifier = "production-db-replica"
replicate_source_db = aws_db_instance.primary.arn
instance_class = "db.r5.large"
}
# S3 bucket di Tokyo untuk backup storage
resource "aws_s3_bucket" "dr_backup" {
provider = aws.dr
bucket = "production-dr-backup-ap-northeast-1"
}
Multi-Account: Isolasi Environment #
Dengan multi-account, setiap environment berada di AWS account yang terpisah. Provider alias menentukan ke account mana resource dibuat.
# Provider untuk production account
provider "aws" {
alias = "production"
region = "ap-southeast-1"
assume_role {
role_arn = "arn:aws:iam::333333333:role/TerraformDeployRole"
}
}
# Provider untuk shared services account (DNS, artifact registry, dll.)
provider "aws" {
alias = "shared"
region = "ap-southeast-1"
assume_role {
role_arn = "arn:aws:iam::444444444:role/TerraformReadRole"
}
}
# Resource di production account
resource "aws_instance" "app" {
provider = aws.production
ami = data.aws_ami.ubuntu.id
instance_type = "t3.medium"
}
# Baca hosted zone dari shared account
data "aws_route53_zone" "main" {
provider = aws.shared
name = "myapp.com"
}
# Buat DNS record di shared account yang menunjuk ke resource production
resource "aws_route53_record" "app" {
provider = aws.shared
zone_id = data.aws_route53_zone.main.zone_id
name = "app.myapp.com"
type = "A"
alias {
name = aws_lb.main.dns_name
zone_id = aws_lb.main.zone_id
evaluate_target_health = true
}
}
Multi-Cloud: AWS + Cloudflare #
provider "aws" {
region = "ap-southeast-1"
}
provider "cloudflare" {
api_token = var.cloudflare_api_token
}
# Infrastruktur di AWS
resource "aws_lb" "main" {
name = "production-lb"
internal = false
load_balancer_type = "application"
subnets = module.vpc.public_subnet_ids
}
# DNS di Cloudflare yang menunjuk ke load balancer AWS
resource "cloudflare_record" "app" {
zone_id = var.cloudflare_zone_id
name = "app"
value = aws_lb.main.dns_name # Referensi ke resource AWS
type = "CNAME"
proxied = true # Aktifkan Cloudflare proxy (WAF, DDoS protection)
ttl = 1 # Auto TTL ketika proxied
}
Provider di dalam Module #
Ketika module membutuhkan provider tertentu (bukan default), ada dua cara untuk mengopernya: implisit (module mewarisi provider default) atau eksplisit (root module mengoper provider alias ke module).
# Cara eksplisit: root module mengoper provider alias ke child module
# modules/replication/main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.0"
configuration_aliases = [aws.primary, aws.replica]
# Module ini butuh DUA konfigurasi aws: primary dan replica
}
}
}
# Root module mengoper provider alias ke module
module "replication" {
source = "./modules/replication"
providers = {
aws.primary = aws # Provider default jadi aws.primary di module
aws.replica = aws.us_east # Provider alias jadi aws.replica di module
}
}
Ringkasan #
- Provider alias adalah mekanisme dasar multi-provider — memberi nama tambahan pada konfigurasi provider agar bisa digunakan oleh resource secara eksplisit.
- Format penggunaan alias:
provider = <type>.<alias>di dalam blok resource.- Provider tanpa alias adalah default — resource yang tidak menyebut
providersecara eksplisit akan menggunakan provider default.- Empat use case utama: multi-region (DR), multi-account (isolasi), multi-cloud, dan kombinasi cloud + SaaS (Cloudflare, Datadog, Vault).
- Resource dari provider berbeda bisa saling mereferensikan —
cloudflare_record.app.value = aws_lb.main.dns_nameadalah pola yang normal dan valid.- Module yang butuh provider alias tertentu perlu mendefinisikan
configuration_aliasesdirequired_providersdan menerima provider via blokproviderssaat dipanggil.
← Sebelumnya: Directory Based Berikutnya: Cross Provider Reference →