Immutable Infrastructure #

Di infrastruktur tradisional, server adalah sesuatu yang dirawat — di-patch, di-update, dikonfigurasi ulang, dan dipertahankan sepanjang hidupnya. Di immutable infrastructure, server adalah sesuatu yang diganti — ketika perubahan diperlukan, kamu tidak mengubah yang sudah ada, tapi membuat yang baru dan membuang yang lama. Pergeseran cara berpikir ini terdengar sederhana, tapi memiliki implikasi yang sangat dalam untuk konsistensi, keamanan, dan kemudahan operasional.

Mutable vs Immutable #

Perbedaan mendasar antara keduanya adalah apa yang terjadi ketika perubahan diperlukan.

Mutable Infrastructure (model tradisional):

  Server prod dibuat → dikonfigurasi → berjalan → di-patch → diupdate
       │                                              │
       └──────────────── dirawat terus ───────────────┘

  Jika ada bug di konfigurasi atau perlu update:
  → SSH ke server → jalankan perintah → ubah konfigurasi
  → Server terus berjalan, tapi state-nya berubah

  Masalah yang muncul:
  ✗ "Configuration drift" — server prod berbeda dengan staging
    karena patch yang berbeda, update yang berbeda waktu
  ✗ "Snowflake server" — server dengan konfigurasi unik yang
    tidak bisa direproduksi dengan mudah
  ✗ Tidak ada audit trail yang jelas tentang apa yang berubah dan kapan

Immutable Infrastructure:

  Server prod dibuat (versi 1.0) → berjalan
  Ketika ada perubahan:
  → Buat server baru (versi 1.1) dari image yang baru
  → Route trafik ke server baru
  → Terminate server lama

  Server tidak pernah dimodifikasi setelah dibuat
  "Replace, don't patch"

Masalah yang Dipecahkan #

Immutable infrastructure lahir dari masalah nyata yang membuat operasional infrastruktur menjadi tidak dapat diprediksi.

Configuration Drift #

Skenario Configuration Drift:

  Januari: Server A, B, C di-deploy dari image yang sama (v1.0)
  Februari: Security patch diapply ke A dan B, C terlewat
  Maret: Library update manual di B untuk debug sebuah issue
  April: Config nginx diubah di A karena ada incident

  Kondisi di bulan April:
  Server A: v1.0 base + Feb patch + April nginx change
  Server B: v1.0 base + Feb patch + March library update
  Server C: v1.0 base (tanpa patch apapun!)

  Problem:
  → Ketiga server seharusnya identik tapi tidak
  → Bug yang muncul di satu server sulit direproduksi di yang lain
  → Security posture berbeda antar server

  Dengan Immutable:
  → Semua server selalu dari image yang sama
  → Update = build image baru → deploy image baru → terminate lama
  → Tidak ada drift karena tidak ada modifikasi manual

Snowflake Server #

"Snowflake server" adalah server yang sangat unik dan
tidak bisa direproduksi dengan mudah.

Tanda-tanda kamu punya snowflake server:
  ✗ "Jangan restart server itu, kita tidak tahu apa yang akan terjadi"
  ✗ "Hanya Pak Budi yang tahu cara konfigurasi server itu"
  ✗ "Server itu ada file konfigurasi yang tidak ada di source control"
  ✗ Tim takut untuk mengubah apapun di server tersebut

Immutable infrastructure mencegah snowflake server:
  Semua konfigurasi ada di code (Infrastructure as Code)
  Server baru bisa direproduksi kapan saja dari code yang sama

Cara Kerja Immutable Infrastructure #

Ada dua cara umum mengimplementasikan immutable infrastructure: golden image dan container.

Golden Image #

Alur Golden Image:

  1. Mulai dari base image (OS minimal)
       │
       ▼
  2. Konfigurasi via skrip atau tool (Packer, Ansible)
     Install aplikasi, konfigurasi OS, setup monitoring agent
       │
       ▼
  3. Build dan simpan sebagai "golden image" (AMI, VM template)
       │
       ▼
  4. Deploy instance dari golden image ini
       │
       ▼
  5. Instance berjalan, TIDAK ada modifikasi manual setelah ini

  Ketika update diperlukan:
  → Ulangi dari langkah 1 dengan perubahan baru
  → Build golden image v2
  → Deploy instance baru dari v2
  → Terminate instance v1

  Keuntungan:
  ✓ Bisa di-rollback: deploy instance dari image versi sebelumnya
  ✓ Konsisten: semua instance dari image yang sama pasti identik
  ✓ Audit: riwayat image = riwayat perubahan infrastruktur

Container #

Container adalah implementasi immutable infrastructure yang paling umum saat ini:

  Image container bersifat immutable:
    → Setelah di-build, image tidak berubah
    → Container yang berjalan tidak di-modifikasi (idealnya)
    → Update = build image baru → deploy container baru → stop yang lama

  Dockerfile mendefinisikan image secara deklaratif:
  
  # Image v1.0
  FROM python:3.11-slim
  COPY requirements.txt .
  RUN pip install -r requirements.txt
  COPY app/ ./app/
  CMD ["python", "app/main.py"]

  # Image v1.1 (update library)
  FROM python:3.11-slim
  COPY requirements.txt .      # requirements.txt sudah diupdate
  RUN pip install -r requirements.txt
  COPY app/ ./app/
  CMD ["python", "app/main.py"]

  Image v1.0 tidak diubah — image v1.1 dibuat baru
  Rollback = jalankan container dari image v1.0

Implementasi Praktis dengan IaC #

Immutable infrastructure bekerja paling baik ketika dikombinasikan dengan Infrastructure as Code.

Alur Deployment Immutable:

  Developer push kode ke repository
       │
       ▼
  CI/CD Pipeline:
    → Build aplikasi
    → Run tests
    → Build container image / golden image
    → Tag image dengan versi (git commit hash)
    → Push ke image registry
       │
       ▼
  Deployment:
    → Terraform / deployment tool buat resource baru
      dari image versi terbaru
    → Health check memastikan resource baru sehat
    → Traffic dialihkan ke resource baru
    → Resource lama di-terminate

  Semua konfigurasi ada di kode:
    ✓ Image specification (Dockerfile / Packer template)
    ✓ Infrastructure definition (Terraform)
    ✓ Deployment process (CI/CD pipeline)
    → Tidak ada "pengetahuan tersembunyi" di kepala engineer

Trade-off yang Harus Dipahami #

Keuntungan Immutable:
  ✓ Tidak ada configuration drift
  ✓ Rollback mudah — deploy versi image sebelumnya
  ✓ Environment yang identik (dev = staging = prod dari image yang sama)
  ✓ Audit trail yang jelas — setiap versi image terdokumentasi
  ✓ Keamanan lebih baik — tidak ada SSH persistent, tidak ada
    modifikasi yang tidak terlacak

Tantangan Immutable:
  ✗ Deployment lebih lambat — butuh build image baru untuk setiap perubahan
      Mitigasi: optimasi layer caching di Docker, parallel build
  
  ✗ Storage untuk menyimpan image versi lama
      Mitigasi: retention policy untuk image yang sudah tua
  
  ✗ Debug lebih sulit — tidak bisa SSH dan lihat kondisi real-time
      Mitigasi: observability yang baik (logging, metrics, tracing)
      adalah wajib di immutable infrastructure
  
  ✗ Tidak cocok untuk stateful data
      Immutable untuk compute layer, tapi database tetap stateful
      Data harus di persistent volume atau managed service

Ringkasan #

  • Immutable berarti replace, bukan patch — server tidak dimodifikasi setelah dibuat; perubahan berarti membuat yang baru dan membuang yang lama.
  • Configuration drift adalah masalah nyata — server yang dirawat secara manual tidak bisa dijamin identik satu sama lain seiring waktu.
  • Container adalah implementasi immutable yang paling umum — image immutable, deploy container baru untuk update, rollback dengan deploy image lama.
  • IaC adalah pasangan wajib immutable infrastructure — semua konfigurasi harus ada di kode, tidak ada pengetahuan yang tersimpan di kepala engineer atau di server yang berjalan.
  • Observability menjadi lebih penting — tanpa SSH persistent, satu-satunya cara mengetahui kondisi sistem adalah melalui logs, metrics, dan traces.
  • Immutable untuk compute, stateful untuk data — persistent volume dan managed database tetap stateful; yang immutable adalah application dan infrastructure layer.

← Sebelumnya: Horizontal vs Vertical Scaling   Berikutnya: Event-Driven Architecture →

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