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_state memungkinkan workspace lain membaca output — powerful tapi menciptakan coupling, gunakan dengan pertimbangan.

← Sebelumnya: Local   Berikutnya: Locking →

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