Remote #
Remote state memindahkan file terraform.tfstate dari mesin lokalmu ke penyimpanan terpusat yang bisa diakses oleh semua anggota tim dan CI/CD pipeline. Ini bukan sekadar “state di tempat lain” — remote backend biasanya datang dengan fitur tambahan yang krusial: enkripsi at rest, versioning otomatis, dan state locking. Artikel ini membahas cara mengkonfigurasi backend yang paling umum digunakan dan kapan memilih yang mana.
Konsep Backend #
Backend adalah komponen Terraform yang bertanggung jawab menyimpan state dan menjalankan operasi tertentu. Secara default, backend adalah local. Mengkonfigurasi remote backend mengubah di mana state disimpan.
LOCAL BACKEND (default):
State → terraform.tfstate (di mesinmu)
Locking → tidak ada
Versioning → terraform.tfstate.backup (1 versi saja)
REMOTE BACKEND (S3, GCS, Terraform Cloud, dll.):
State → bucket/container di cloud
Locking → DynamoDB / GCS locks / built-in
Versioning → S3 versioning / built-in history
Enkripsi → at rest + in transit
Audit → access log tersedia
Backend S3 (AWS) #
S3 adalah pilihan paling umum untuk tim yang bekerja di AWS. Kombinasi S3 untuk storage dan DynamoDB untuk locking adalah pola standar industri.
# backend.tf
terraform {
backend "s3" {
bucket = "my-terraform-state-prod"
key = "production/terraform.tfstate"
region = "ap-southeast-1"
# Enkripsi at rest
encrypt = true
# State locking menggunakan DynamoDB
dynamodb_table = "terraform-state-lock"
# Opsional: gunakan IAM role untuk akses
# role_arn = "arn:aws:iam::123456789:role/TerraformStateRole"
}
}
# Buat resource S3 bucket dan DynamoDB table untuk state backend
# (biasanya dikerjakan terpisah sebelum konfigurasi utama)
resource "aws_s3_bucket" "terraform_state" {
bucket = "my-terraform-state-prod"
# Mencegah penghapusan bucket yang berisi state
lifecycle {
prevent_destroy = true
}
}
resource "aws_s3_bucket_versioning" "terraform_state" {
bucket = aws_s3_bucket.terraform_state.id
versioning_configuration {
status = "Enabled" # Wajib — memungkinkan recovery state lama
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "terraform_state" {
bucket = aws_s3_bucket.terraform_state.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
resource "aws_dynamodb_table" "terraform_lock" {
name = "terraform-state-lock"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Backend GCS (Google Cloud) #
Untuk tim yang bekerja di Google Cloud, GCS backend sudah mendukung locking secara native tanpa perlu resource tambahan.
terraform {
backend "gcs" {
bucket = "my-terraform-state"
prefix = "production"
# GCS backend sudah built-in locking — tidak perlu resource tambahan
}
}
Terraform Cloud / HCP Terraform #
Terraform Cloud (sekarang bernama HCP Terraform) adalah opsi managed yang menyertakan state storage, locking, versioning, run history, dan UI untuk review plan — semua dalam satu paket.
terraform {
cloud {
organization = "my-org"
workspaces {
name = "production"
}
}
}
# Login ke Terraform Cloud
terraform login
# Akan membuka browser untuk autentikasi
# Setelah login, init akan setup workspace di Terraform Cloud
terraform init
Struktur Key yang Baik untuk S3 #
Saat menggunakan S3 backend untuk beberapa environment atau proyek, struktur key yang konsisten memudahkan navigasi.
STRUKTUR KEY YANG DIREKOMENDASIKAN:
s3://my-terraform-state/
├── production/
│ ├── networking/terraform.tfstate
│ ├── compute/terraform.tfstate
│ └── database/terraform.tfstate
├── staging/
│ ├── networking/terraform.tfstate
│ └── compute/terraform.tfstate
└── dev/
└── terraform.tfstate
Konfigurasi per environment:
key = "production/networking/terraform.tfstate"
key = "production/compute/terraform.tfstate"
key = "staging/networking/terraform.tfstate"
Remote State Output: Membaca State dari Workspace Lain #
Salah satu fitur powerful remote state adalah kemampuan membaca output dari workspace Terraform lain. Ini memungkinkan infrastruktur di-modularisasi ke beberapa workspace yang terpisah tapi bisa saling berbagi data.
# Workspace "networking" membuat VPC dan meng-output VPC ID
# outputs.tf di workspace networking:
output "vpc_id" {
value = aws_vpc.main.id
}
output "private_subnet_ids" {
value = aws_subnet.private[*].id
}
# Workspace "compute" membaca output dari workspace "networking"
data "terraform_remote_state" "networking" {
backend = "s3"
config = {
bucket = "my-terraform-state"
key = "production/networking/terraform.tfstate"
region = "ap-southeast-1"
}
}
# Gunakan output dari workspace networking
resource "aws_instance" "web" {
ami = var.ami_id
subnet_id = data.terraform_remote_state.networking.outputs.private_subnet_ids[0]
}
terraform_remote_state membuat coupling langsung antara dua workspace — perubahan output di workspace networking bisa berdampak ke workspace compute. Pertimbangkan menggunakan variable input dan mengoper nilainya secara eksplisit jika coupling yang erat ini tidak diinginkan.Ringkasan #
- Remote backend memindahkan state ke penyimpanan terpusat dengan fitur tambahan: enkripsi, versioning otomatis, dan locking.
- S3 + DynamoDB adalah kombinasi standar industri untuk AWS — S3 untuk storage, DynamoDB untuk locking.
- GCS backend sudah built-in locking — tidak butuh resource tambahan seperti DynamoDB.
- Terraform Cloud adalah opsi managed lengkap — state storage, locking, run history, dan UI dalam satu paket.
- Struktur key yang konsisten di S3 (
<env>/<component>/terraform.tfstate) memudahkan navigasi untuk proyek multi-environment.terraform_remote_statememungkinkan workspace lain membaca output — powerful tapi menciptakan coupling, gunakan dengan pertimbangan.