Apa itu Environment? #

Hampir semua tim yang mengelola infrastruktur serius memiliki lebih dari satu environment. Ada dev tempat developer bereksperimen, staging yang mencerminkan production untuk pengujian akhir, dan production yang melayani pengguna nyata. Tantangannya bukan membuat masing-masing — tapi memastikan ketiganya dikelola dari konfigurasi yang sama, konsisten, dan tidak terjadi situasi di mana staging berbeda secara diam-diam dari production sehingga bug lolos tanpa terdeteksi.

flowchart TD
    A["🌍 Environment"] --> B["Development"]
    A --> C["Staging"]
    A --> D["Production"]

    B --> E["Iterasi cepat\nRisiko rendah"]
    C --> F["Validasi\nSebelum prod"]
    D --> G["Stabilitas\nAvailability tinggi"]

    style A fill:#3b82f6,stroke:#1e40af,color:#fff
    style B fill:#10b981,stroke:#059669,color:#fff
    style C fill:#f59e0b,stroke:#d97706,color:#fff
    style D fill:#ef4444,stroke:#dc2626,color:#fff

Mengapa Environment Dibutuhkan #

Perbedaan environment bukan sekadar konvensi penamaan. Setiap environment punya tujuan yang berbeda, dan perbedaan tujuan itu memerlukan perbedaan konfigurasi yang terstruktur.

DEV (Development)
  Tujuan  : Eksperimen, iterasi cepat, debugging
  Sifat   : Boleh tidak stabil, data bisa dihapus kapan saja
  Ukuran  : Kecil, minimal — hemat biaya
  Akses   : Developer bebas akses penuh
  Contoh  : 1 instance t3.micro, DB single-AZ tanpa backup

STAGING
  Tujuan  : Validasi sebelum release ke production
  Sifat   : Harus semirip mungkin dengan production
  Ukuran  : Sedang — cukup untuk testing yang representatif
  Akses   : Terbatas — tim QA, developer senior
  Contoh  : 2 instance t3.small, DB dengan backup enabled

PRODUCTION
  Tujuan  : Melayani pengguna nyata
  Sifat   : Harus stabil, highly available, aman
  Ukuran  : Full scale sesuai kebutuhan traffic
  Akses   : Sangat terbatas — hanya operator terotorisasi
  Contoh  : 3+ instance t3.medium, DB multi-AZ dengan backup 30 hari

Apa yang Berbeda Antar Environment #

Environment yang berbeda bukan berarti konfigurasi yang berbeda total — justru strukturnya harus sama, hanya nilainya yang berbeda.

# Yang SAMA di semua environment (struktur konfigurasi):
#   - Resource apa yang dibuat (VPC, subnet, EC2, RDS)
#   - Bagaimana resource saling terhubung
#   - Security rules dan networking topology
#   - Cara deployment dilakukan

# Yang BERBEDA antar environment (nilai konfigurasi):
#   - Ukuran instance (t3.micro vs t3.medium vs t3.large)
#   - Jumlah instance (1 vs 2 vs 5)
#   - Multi-AZ (false vs false vs true)
#   - Backup retention (0 vs 7 vs 30 hari)
#   - Deletion protection (false vs false vs true)
#   - Nama dan tag resource
#   - CIDR block VPC (10.0.0.0/16 vs 10.1.0.0/16 vs 10.2.0.0/16)

# Ini tercermin dalam variable:
variable "instance_type" {
  # dev: "t3.micro", staging: "t3.small", production: "t3.medium"
}

variable "multi_az" {
  # dev: false, staging: false, production: true
}

variable "backup_retention_days" {
  # dev: 0, staging: 7, production: 30
}

Prinsip Environment yang Konsisten #

Ada satu prinsip yang paling sering dilanggar dalam pengelolaan multi-environment: production drift — kondisi di mana staging dan production berbeda secara diam-diam karena dikelola dengan cara yang berbeda.

ANTI-PATTERN: Environment yang tidak simetris

  Dev       → Dikelola dengan Terraform ✓
  Staging   → Dikelola dengan Terraform ✓
  Production → "Sudah jalan, jangan diubah" → dikelola manual ✗

  Akibat:
  - Production punya resource "misterius" yang tidak ada di staging
  - Bug yang lolos di staging bisa muncul di production
  - Tidak ada cara untuk reproduce production environment di tempat lain
  - Saat disaster recovery, tidak ada yang tahu persis kondisi production

BENAR: Semua environment dikelola dari konfigurasi yang sama

  Dev, Staging, Production → semua dari konfigurasi Terraform yang sama
  Perbedaan hanya pada nilai variable, bukan pada struktur konfigurasi

Tantangan Pengelolaan Multi-Environment #

TANTANGAN 1: ISOLASI STATE
  Setiap environment harus punya state sendiri.
  State dev tidak boleh campur dengan state production.
  → Solusi: remote backend dengan key terpisah per environment

TANTANGAN 2: ISOLASI KONFIGURASI
  Perubahan di konfigurasi dev tidak boleh otomatis masuk production.
  → Solusi: workflow yang eksplisit (PR, review, promotion)

TANTANGAN 3: CREDENTIAL TERPISAH
  Dev dan production tidak boleh menggunakan AWS account yang sama.
  → Solusi: AWS account terpisah per environment (multi-account strategy)

TANTANGAN 4: KONSISTENSI KONFIGURASI
  Struktur konfigurasi harus sama antar environment.
  → Solusi: modul yang sama, tfvars yang berbeda

TANTANGAN 5: PROMOTION WORKFLOW
  Bagaimana konfigurasi "naik" dari dev ke staging ke production?
  → Solusi: GitOps dengan branch atau tag per environment

Dua Pendekatan Utama #

Terraform menyediakan dua pendekatan utama untuk mengelola multi-environment — masing-masing dengan trade-off yang berbeda.

PENDEKATAN 1: WORKSPACE
  Satu direktori konfigurasi, state terpisah per workspace.
  terraform workspace new dev
  terraform workspace new production

  Kelebihan : Satu set kode, mudah dibuat konsisten
  Kekurangan: Semua environment berbagi provider dan backend config,
              sulit jika butuh AWS account terpisah per environment

PENDEKATAN 2: DIRECTORY BASED
  Direktori terpisah per environment, masing-masing punya
  konfigurasi dan state sendiri.

  environments/dev/        → state dev
  environments/staging/    → state staging
  environments/production/ → state production

  Kelebihan : Isolasi penuh, fleksibel untuk perbedaan besar
  Kekurangan: Risiko divergensi konfigurasi antar environment
              jika tidak dikelola dengan disiplin

Kedua pendekatan ini akan dibahas lebih detail di artikel berikutnya.

flowchart LR
    A["Terraform\nWorkspace"] -->|"Per environment"| B["Different\nState File"]
    B --> C["Same Code\nDifferent Values"]

    style A fill:#3b82f6,stroke:#1e40af,color:#fff
    style B fill:#f59e0b,stroke:#d97706,color:#fff
    style C fill:#10b981,stroke:#059669,color:#fff


Dampak Environment terhadap Arsitektur #

Pemilihan environment strategy mempengaruhi seluruh arsitektur — dari cara deploy hingga cara monitoring.

flowchart TD
    subgraph DEV["Development"]
        D1["Single instance
t3.micro"]
        D2["No HA"]
        D3["Self-signed cert"]
    end

    subgraph STG["Staging"]
        S1["2 instances
t3.small"]
        S2["Simulated HA"]
        S3["Test certificate"]
    end

    subgraph PRD["Production"]
        P1["Auto-scaling
m5.large"]
        P2["Multi-AZ HA"]
        P3["Real certificate"]
    end

    DEV -->|"Promote"| STG
    STG -->|"Promote"| PRD

    style DEV fill:#fff3e0,stroke:#e65100
    style STG fill:#e3f2fd,stroke:#1565c0
    style PRD fill:#e8f5e9,stroke:#2e7d32
# Perbedaan konfigurasi antar environment
# DEV:
#   - instance_type: t3.micro (minimal cost)
#   - multi_az: false (tidak perlu HA)
#   - backup_retention: 1 hari (hemat storage)
#   - deletion_protection: false (mudah di-cleanup)

# PRODUCTION:
#   - instance_type: m5.large (performa)
#   - multi_az: true (high availability)
#   - backup_retention: 30 hari (compliance)
#   - deletion_protection: true (safety)

Environment Promotion Workflow #

# Workflow umum: develop → staging → production

# 1. Developer push code ke feature branch
git push origin feature/add-cache

# 2. CI pipeline otomatis deploy ke dev environment
terraform workspace select dev
terraform apply -auto-approve

# 3. QA testing di dev, lalu merge ke main
git checkout main && git merge feature/add-cache

# 4. CD pipeline deploy ke staging
terraform workspace select staging
terraform plan -out=staging.tfplan
# Manual review plan
terraform apply staging.tfplan

# 5. Smoke test dan UAT di staging
# 6. Manual approval untuk production deploy
# 7. Deploy ke production dengan approval gate
terraform workspace select production
terraform plan -out=prod.tfplan
# Manual approval di CI/CD tool
terraform apply prod.tfplan

---

## Environment Isolation Patterns

Isolasi environment yang baik mencegah kesalahan cross-environment yang bisa berakibat fatal.

```hcl
# Pattern 1: Completely separate state files
# Setiap environment = directory + state terpisah
# infrastructure/dev/main.tf    → state: dev.tfstate
# infrastructure/staging/main.tf → state: staging.tfstate
# infrastructure/prod/main.tf   → state: prod.tfstate

# Pattern 2: Workspace-based isolation
terraform workspace select dev
terraform apply
# State disimpan di workspace "dev", terpisah dari workspace lain

# Pattern 3: Account-level isolation (paling aman)
# Dev: AWS Account 111111111111
# Staging: AWS Account 222222222222
# Prod: AWS Account 333333333333
provider "aws" {
  region = "ap-southeast-1"
  assume_role {
    role_arn = local.account_roles[terraform.workspace]
  }
}

locals {
  account_roles = {
    dev        = "arn:aws:iam::111111111111:role/TerraformRole"
    staging    = "arn:aws:iam::222222222222:role/TerraformRole"
    production = "arn:aws:iam::333333333333:role/TerraformRole"
  }
}
ISOLATION LEVEL COMPARISON:

Level 1: Directory + State Terpisah
├── Blast radius: Terbatas (bisa salah workspace)
├── Cost: Rendah
└── Kompleksitas: Rendah

Level 2: Workspace
├── Blast radius: Sedang (shared backend config)
├── Cost: Rendah
└── Kompleksitas: Rendah

Level 3: Separate AWS Accounts
├── Blast radius: Paling kecil (isolasi penuh)
├── Cost: Sedang (multi-account management)
└── Kompleksitas: Tinggi

REKOMENDASI: Level 3 untuk production,
Level 1-2 untuk development

Environment Configuration Matrix #

CONFIG MATRIX PER ENVIRONMENT:

                    dev         staging      production
────────────────────────────────────────────────────────
instance_type       t3.micro    t3.small     m5.large
instance_count      1           2            3 (auto-scale)
multi_az            false       true         true
backup_retention    1 day       7 days       30 days
deletion_protection false       false        true
monitoring          basic       detailed     detailed
ssl_certificate     self-signed ACM          ACM (renewed)
logging             stdout      CloudWatch   CloudWatch+SIEM
alerting            none        Slack        PagerDuty
cost/month          ~$50        ~$200        ~$2000+
# Implementation: configuration map per environment
locals {
  env_config = {
    dev = {
      instance_type        = "t3.micro"
      instance_count       = 1
      multi_az             = false
      backup_retention     = 1
      deletion_protection  = false
      monitoring_level     = "basic"
    }
    staging = {
      instance_type        = "t3.small"
      instance_count       = 2
      multi_az             = true
      backup_retention     = 7
      deletion_protection  = false
      monitoring_level     = "detailed"
    }
    production = {
      instance_type        = "m5.large"
      instance_count       = 3
      multi_az             = true
      backup_retention     = 30
      deletion_protection  = true
      monitoring_level     = "detailed"
    }
  }
  cfg = local.env_config[var.environment]
}

Ringkasan #

  • Environment bukan sekadar nama — dev, staging, dan production punya tujuan berbeda yang memerlukan konfigurasi berbeda secara terstruktur.
  • Struktur sama, nilai berbeda — prinsip dasar environment yang baik. Konfigurasi Terraform yang sama dipakai di semua environment, hanya nilai variable yang berbeda.
  • Production drift adalah musuh utama — ketika staging tidak mencerminkan production, bug lolos tanpa terdeteksi dan disaster recovery menjadi tidak bisa diandalkan.
  • Lima tantangan: isolasi state, isolasi konfigurasi, credential terpisah, konsistensi konfigurasi, dan promotion workflow.
  • Dua pendekatan utama: workspace (satu konfigurasi, state terpisah) dan directory based (direktori terpisah per environment).
  • Idealnya gunakan AWS account terpisah per environment untuk isolasi biaya, keamanan, dan blast radius yang lebih baik.

← Sebelumnya: Registry   Berikutnya: Jenis Environment →

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