L
Infrastructure as Code (IaC) β€’ Literally Web ID

Arsitektur Zero-Downtime Deployment Menggunakan Infrastructure as Code (IaC) dan Terraform

⏱️ 15 menit baca β€’ πŸ“… 13 Oct 2026 β€’ πŸ‘οΈ 1 views
Arsitektur Zero-Downtime Deployment Menggunakan Infrastructure as Code (IaC) dan Terraform

1. Konteks Industri & Analisis Akar Masalah

Di era digital modern, ekspektasi pengguna terhadap ketersediaan layanan web berada pada titik tertinggi sepanjang masa. Downtime sekecil apa pun, baik selama jendela pemeliharaan terjadibat maupun kegagalan rilis yang tidak terduga, dapat berdampak langsung pada kerugian finansial yang masif, penurunan reputasi merek, dan degradasi peringkat SEO.

Secara historis, penerapan pembaruan infrastruktur dan aplikasi dilakukan secara manual melalui skrip shell yang rentan terhadap human error, konfigurasi yang menyimpang (configuration drift), dan ketidakpastian status sistem. Pendekatan tradisional ini sering kali mengandalkan prosedur reboot atau penghentian layanan sementara, yang secara inheren melanggar prinsip high availability.

Bottleneck performa dan keamanan yang paling sering ditemui di dunia nyata meliputi:

  • Inkonsistensi Environment: Perbedaan konfigurasi antara server staging dan production menyebabkan bug yang lolos ke lingkungan hidup.
  • Ketergantungan State Terpusat yang Rapuh: Penggunaan file state lokal atau mekanisme penguncian (locking) yang buruk, memicu korupsi state saat beberapa engineer melakukan apply secara bersamaan.
  • Waktu Pemulihan yang Lambat (MTTR tinggi): Saat terjadi kegagalan deployment, proses rollback manual memakan waktu berharga karena ketidakjelasan status infrastruktur sebelumnya.

Perbandingan Kondisi: Sebelum vs Sesudah Penerapan

Parameter Sebelum (Manual / Tradisional) Sesudah (Declarative IaC & Zero-Downtime)
Waktu Deployment Berjam-jam dengan intervensi manual Hitungan menit, sepenuhnya otomatis
Konsistensi Lingkungan Sering terjadi drift, rawan error Dijamin identik melalui code-defined state
Strategi Rollback Manual, ad-hoc, tingkat keberhasilan rendah Otomatis berbasis immutable infrastructure dan blue-green routing
Audit Trail Lemah, bergantung pada catatan manusia Transparan melalui Git commit history dan Terraform state

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur Zero-Downtime Deployment berbasis Terraform mengandalkan prinsip Infrastructure as Code (IaC) deklaratif, di mana Anda mendefinisikan desired state dari sistem alih-alih langkah-langkah prosedural untuk mencapainya. Terraform membandingkan desired state ini dengan current state yang disimpan dalam file state terdistribusi, lalu menghitung rencana eksekusi (execution plan) untuk menjembatani perbedaannya.

Dalam ekosistem web multi-tier, arsitektur ini melibatkan orkestrasi berlapis:

  1. Edge & Security Layer: Cloudflare sebagai CDN dan WAF untuk mitigasi DDoS dan terminasi SSL/TLS.
  2. Load Balancing Layer: Nginx atau Application Load Balancer (ALB) untuk mendistribusikan traffic ke instance backend secara mulus.
  3. Application Tier: Sekelompok web server (Node.js, Go, PHP-FPM) di dalam Auto Scaling Group yang mendukung rolling update atau blue-green deployment.
  4. Database & Caching Tier: MySQL/MariaDB dengan replikasi master-replica dan Redis untuk manajemen sesi serta caching terdistribusi.
  5. Storage & Queue Tier: AWS S3 untuk asset storage dan Supervisor untuk mengelola proses background worker.
[ Cloudflare CDN / WAF ]
          β”‚
          β–Ό
[ Load Balancer (Nginx / ALB) ]
    β”Œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β–Ό                               β–Ό
[ App Node 1 (Blue) ]   [ App Node 2 (Green) ]
    β”‚                               β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  β–Ό
     [ Database & Redis Cluster ]

Alur eksekusi data saat terjadi pembaruan aplikasi menggunakan strategi Blue-Green:

  1. Terraform memprovisi infrastruktur baru (Green) di samping infrastruktur lama (Blue).
  2. Kesehatan node Green diverifikasi melalui health check HTTP otomatis.
  3. Load balancer memperbarui aturan perutean traffic secara atomik dari Blue ke Green.
  4. Node Blue dihentikan (drain) dan dihapus setelah tidak ada koneksi aktif.

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk mencapai zero-downtime, terdapat beberapa pendekatan arsitektural yang umum digunakan. Berikut adalah analisis komparatif mendalam:

Pendekatan Kelebihan Kekurangan Trade-off Sumber Daya
Rolling Update Efisien dalam penggunaan sumber daya hardware. Membutuhkan waktu transisi lebih lama; risiko kompatibilitas versi sementara. Konsumsi CPU/RAM stabil, potensi lonjakan latensi saat kapasitas berkurang sebagian.
Blue-Green Deployment Rollback instan; isolasi lingkungan sempurna; nol risiko mixed-version bug. Membutuhkan dua kali lipat kapasitas infrastruktur selama proses rilis. Penggunaan biaya dan resource cloud berlipat ganda sementara waktu.
Canary Deployment Pengujian aman pada subset kecil pengguna nyata (real traffic). Kompleksitas tinggi pada routing rule dan manajemen state aplikasi. Overhead jaringan meningkat untuk pengelolaan weight-based routing.

[!TIP] Gunakan pendekatan Blue-Green untuk aplikasi kritikal yang memerlukan jaminan instant rollback, dan Canary untuk rilis fitur skala besar guna memitigasi regresi fungsional.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mulai menulis kode Terraform dan konfigurasi infrastruktur, pastikan lingkungan kerja Anda memenuhi spesifikasi berikut:

  • Terraform CLI: Versi >= 1.5.0 terinstal pada mesin control plane atau CI/CD runner.
  • Cloud Provider Account: Akses kredensial yang valid (misalnya AWS IAM User/Role dengan hak akses penuh ke EC2, VPC, S3, RDS, dan DynamoDB).
  • Backend State Terdistribusi: Bucket S3 untuk penyimpanan file .tfstate dan tabel DynamoDB untuk State Locking.
  • Tool Pendukung: git, ansible (opsional untuk konfigurasi post-provisioning), dan curl/jq untuk pengujian.

Verifikasi instalasi Terraform dengan menjalankan perintah berikut di terminal:

terraform version

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah implementasi kode Terraform yang lengkap, siap produksi, dan tanpa placeholder untuk membangun infrastruktur web multi-tier berarsitektur zero-downtime.

5.1. Konfigurasi Backend & Provider (provider.tf)

terraform {
  required_version = ">= 1.5.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket         = "prod-terraform-state-lock-bucket"
    key            = "web-infra/terraform.tfstate"
    region         = "ap-southeast-1"
    dynamodb_table = "terraform-lock-table"
    encrypt        = true
  }
}

provider "aws" {
  region = "ap-southeast-1"

  default_tags {
    tags = {
      Environment = "Production"
      ManagedBy   = "Terraform"
      Project     = "ZeroDowntimeWeb"
    }
  }
}

5.2. Jaringan & Keamanan (network.tf)

resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = "prod-vpc"
  }
}

resource "aws_subnet" "public_1" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "ap-southeast-1a"
  map_public_ip_on_launch = true

  tags = {
    Name = "prod-public-subnet-1"
  }
}

resource "aws_subnet" "public_2" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.2.0/24"
  availability_zone       = "ap-southeast-1b"
  map_public_ip_on_launch = true

  tags = {
    Name = "prod-public-subnet-2"
  }
}

resource "aws_internet_gateway" "gw" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "prod-igw"
  }
}

resource "aws_route_table" "public" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.gw.id
  }

  tags = {
    Name = "prod-public-rt"
  }
}

resource "aws_route_table_association" "rta_1" {
  subnet_id      = aws_subnet.public_1.id
  route_table_id = aws_route_table.public.id
}

resource "aws_route_table_association" "rta_2" {
  subnet_id      = aws_subnet.public_2.id
  route_table_id = aws_route_table.public.id
}

5.3. Security Group & Load Balancer (loadbalancer.tf)

resource "aws_security_group" "alb_sg" {
  name        = "prod-alb-sg"
  description = "Allow HTTP/HTTPS traffic to ALB"
  vpc_id      = aws_vpc.main.id

  ingress {
    description = "Allow HTTP"
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    description = "Allow HTTPS"
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_lb" "web_alb" {
  name               = "prod-web-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.alb_sg.id]
  subnets            = [aws_subnet.public_1.id, aws_subnet.public_2.id]

  enable_deletion_protection = true
}

resource "aws_lb_target_group" "web_tg" {
  name     = "prod-web-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.main.id

  health_check {
    path                = "/health.php"
    protocol            = "HTTP"
    port                = "80"
    interval            = 15
    timeout             = 5
    healthy_threshold   = 2
    unhealthy_threshold = 3
    matcher             = "200"
  }
}

resource "aws_lb_listener" "http" {
  load_balancer_arn = aws_lb.web_alb.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.web_tg.arn
  }
}

5.4. Auto Scaling & Web Tier dengan Konsep Immutable (compute.tf)

resource "aws_security_group" "instance_sg" {
  name        = "prod-instance-sg"
  description = "Allow traffic from ALB only"
  vpc_id      = aws_vpc.main.id

  ingress {
    description     = "Allow HTTP from ALB"
    from_port       = 80
    to_port         = 80
    protocol        = "tcp"
    security_groups = [aws_security_group.alb_sg.id]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_launch_template" "web_lt" {
  name_prefix   = "prod-web-lt-"
  image_id      = "ami-0c55b159cbfafe1f0" # Ubuntu 22.04 LTS official AMI
  instance_type = "t3.medium"

  network_interfaces {
    associate_public_ip_address = true
    security_groups             = [aws_security_group.instance_sg.id]
  }

  user_data = base64encode(<<-EOF
              #!/bin/bash
              apt-get update -y
              apt-get install -y nginx php-fpm php-mysql git
              systemctl enable nginx
              systemctl start nginx
              systemctl enable php8.1-fpm
              systemctl start php8.1-fpm
              echo "<?php echo json_encode(['status' => 'healthy', 'node' => gethostname()]); ?>" > /var/www/html/health.php
              echo "<h1>Zero-Downtime Deployment Active</h1>" > /var/www/html/index.php
              systemctl restart nginx
              EOF
  )

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_autoscaling_group" "web_asg" {
  name_prefix         = "prod-web-asg-"
  desired_capacity    = 2
  max_size            = 6
  min_size            = 2
  target_group_arns   = [aws_lb_target_group.web_tg.arn]
  vpc_zone_identifier = [aws_subnet.public_1.id, aws_subnet.public_2.id]

  launch_template {
    id      = aws_launch_template.web_lt.id
    version = "$Latest"
  }

  instance_refresh {
    strategy = "Rolling"
    preferences {
      min_healthy_percentage = 50
      instance_warmup        = 300
    }
    triggers = ["tag"]
  }

  tag {
    key                 = "Name"
    value               = "prod-web-instance"
    propagate_at_launch = true
  }
}

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa baris paling krusial dari implementasi di atas untuk memahami bagaimana zero-downtime dijamin secara teknis:

  1. lifecycle { create_before_destroy = true } pada aws_launch_template: Parameter ini sangat vital. Tanpa konfigurasi ini, Terraform akan menghancurkan launch template lama sebelum membuat yang baru, yang dapat menyebabkan kegagalan pada operasi ASG. Dengan opsi ini, Terraform membuat template baru terlebih dahulu, lalu mengarahkan ASG untuk menggunakannya.

  2. Blok instance_refresh pada aws_autoscaling_group: Blok ini mengotomatiskan proses pembaruan instance di dalam Auto Scaling Group menggunakan strategi Rolling. Parameter min_healthy_percentage = 50 memastikan bahwa setidaknya 50% kapasitas instance tetap aktif dan melayani traffic selama proses pembaruan berjalan, mencegah terjadinya lonjakan beban atau downtime pada aplikasi.

  3. Konfigurasi health_check pada aws_lb_target_group: Pengaturan healthy_threshold = 2 dan interval = 15 memastikan bahwa ALB secara ketat menguji jalur /health.php sebelum menyatakan sebuah instance siap menerima traffic produksi. Jika instance baru gagal merespons dengan HTTP 200, instance tersebut otomatis diisolasi.


7. Skenario Produksi & Studi Kasus Dunia Nyata

Bayangkan sebuah platform e-commerce dengan traffic puncak mencapai 50.000 requests per second (RPS) pada saat flash sale. Pada sistem lama, pembaruan aplikasi backend memerlukan restart layanan PHP-FPM dan Nginx secara bersamaan, yang berakibat pada dropped connections dan error 502 Bad Gateway.

Dengan menerapkan arsitektur Terraform di atas:

  • Ketika tim merilis versi kode baru, mereka cukup memperbarui skrip user_data atau mereferensikan AMI baru pada launch_template.
  • Perintah terraform apply dijalankan melalui pipeline CI/CD (GitHub Actions atau GitLab CI).
  • AWS ASG melakukan Instance Refresh secara bertahap. Instance lama baru dimatikan setelah instance baru benar-benar terdaftar di Target Group dan melewati pemeriksaan kesehatan (health check).
  • Hasilnya: Transisi transparan tanpa satu pun paket data yang gagal dilayani (Zero Dropped Connections).

8. Common Pitfalls, Anti-Patterns & Solusi

[!WARNING] Kesalahan konfigurasi dalam manajemen state atau siklus hidup sumber daya dapat berakibat fatal pada penghapusan infrastruktur produksi secara tidak sengaja (accidental deletion).

  1. Anti-Pattern: Menggunakan Local State File untuk Produksi

    • Dampak: File state yang disimpan secara lokal di mesin engineer rentan hilang, rusak, atau menimbulkan konflik saat dikerjakan oleh tim.
    • Solusi: Selalu gunakan remote backend terenkripsi (seperti S3 dengan DynamoDB locking).
  2. Pitfall: Melewatkan Parameter lifecycle { prevent_destroy = true } pada Database

    • Dampak: Kesalahan ketik pada skrip Terraform dapat memicu penghapusan database produksi (aws_rds_instance).
    • Solusi: Terapkan aturan proteksi destruktif pada sumber daya stateful seperti database dan storage bucket.
  3. Pitfall: Waktu Warm-up Instance yang Terlalu Singkat

    • Dampak: Instance baru langsung dibanjiri traffic sebelum cache aplikasi atau koneksi database siap, menyebabkan timeout.
    • Solusi: Sesuaikan parameter instance_warmup di ASG agar memberikan waktu yang cukup bagi proses warm-up PHP-FPM/Node.js.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memvalidasi bahwa arsitektur zero-downtime benar-benar tahan banting terhadap lonjakan traffic, pengujian beban (load testing) wajib dilakukan menggunakan tool seperti k6 atau wrk.

Contoh skrip pengujian k6 sederhana untuk menguji stabilitas endpoint selama proses deployment:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 100 }, // Ramp-up ke 100 virtual users
    { duration: '5m', target: 100 }, // Pertahankan beban
    { duration: '2m', target: 0 },   // Ramp-down
  ],
};

export default function () {
  const res = http.get('http://prod-web-alb-123456789.ap-southeast-1.elb.amazonaws.com/');
  check(res,
    {
      'status is 200': (r) => r.status === 200,
      'response time < 200ms': (r) => r.timings.duration < 200,
    }
  );
  sleep(1);
}

Interpretasi Hasil & Tuning Lanjutan:

  • Jika metrik http_req_failed menunjukkan angka di atas 0% selama Terraform apply, periksa kembali konfigurasi min_healthy_percentage dan durasi health check interval.
  • Lakukan tuning pada kernel Linux (sysctl.conf) pada instance web server untuk mengoptimalkan penanganan koneksi TCP (net.core.somaxconn, net.ipv4.tcp_tw_reuse).

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan arsitektur ini ke lingkungan produksi, pastikan seluruh poin dalam checklist berikut telah terpenuhi:

  • Remote backend Terraform dikonfigurasi dengan enkripsi dan state locking aktif.
  • Semua sumber daya stateful (Database, S3) dilindungi dengan prevent_destroy = true.
  • Konfigurasi lifecycle { create_before_destroy = true } diterapkan pada seluruh launch template.
  • Skrip health check aplikasi merespons dengan benar dalam waktu kurang dari 5 detik.
  • Pipeline CI/CD memiliki mekanisme approval manual sebelum tahap terraform apply dieksekusi.
  • Kebijakan IAM mengikuti prinsip least privilege.

Dengan mengombinasikan kekuatan IaC deklaratif dari Terraform, manajemen state yang aman, serta strategi pembaruan infrastruktur yang tepat, organisasi Anda dapat mencapai keandalan tingkat tinggiβ€”memungkinkan inovasi produk dirilis dengan cepat, aman, dan tanpa pernah mengalami detik downtime.

🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server