L
Infrastructure as Code (IaC) • Literally Web ID

Infrastructure as Code (IaC) with Terraform & AWS: Automated Multi-Region Deployments

⏱️ 15 menit baca • 📅 14 Oct 2026 • 👁️ 1 views
Infrastructure as Code (IaC) with Terraform & AWS: Automated Multi-Region Deployments

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web enterprise modern, kegagalan infrastruktur tunggal (single point of failure atau SPOF) bukan lagi sekadar risiko teoretis, melainkan sebuah kepastian matematis jika diabaikan. Bisnis global menuntut ketersediaan tinggi (high availability) hingga 99.999% (five nines), yang berarti waktu downtime kumulatif tidak boleh melebihi 5,26 menit per tahun. Namun, kenyataan di lapangan sering kali menunjukkan bahwa tim infrastruktur masih bergantung pada manajemen server manual, skrip Bash ad-hoc, atau klik antarmuka konsol AWS (AWS Console) yang rentan terhadap human error, inkonsistensi environment, dan konfigurasi drift.

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

  • Inkonsistensi Environment: Perbedaan konfigurasi antara staging dan production yang menyebabkan bug hantu (ghost bugs) saat rilis kode baru.
  • Latensi Global: Mengandalkan satu region AWS tunggal (misalnya ap-southeast-1 Singapura) untuk melayani audiens global atau regional yang luas, mengakibatkan tingginya Time to First Byte (TTFB) bagi pengguna di luar area tersebut.
  • Recovery Lambat: Ketika terjadi bencana alam, kegagalan zona ketersediaan (Availability Zone), atau pemadaman total AWS region tertentu, proses pemulihan manual membutuhkan waktu berjam-jam untuk rekonstruksi arsitektur database, load balancer, dan konfigurasi DNS.

Perbandingan Kondisi: Sebelum vs Sesudah Penerapan

Parameter Sebelum (Manual / Skrip Ad-hoc) Sesudah (Terraform & Multi-Region AWS)
Waktu Provisioning Hitungan hari hingga minggu Hitungan menit (Fully Automated)
Inkonsistensi Konfigurasi Tinggi (Sering terjadi configuration drift) Nol (Deklaratif & Immutable Infrastructure)
Disaster Recovery (RTO/RPO) RTO > 4 jam, RPO > 24 jam RTO < 5 menit, RPO < 1 detik (Active-Active)
Skalabilitas Global Kompleks, butuh replikasi manual Instan melalui modul yang dapat direplikasi lintas region

[!IMPORTANT] Mengabaikan Infrastruktur sebagai Kode (IaC) dalam skala enterprise sama dengan membangun gedung pencakar langit tanpa cetak biru arsitektur yang valid. Setiap perubahan harus dapat dilacak, diuji, dan dihancurkan tanpa rasa takut.


2. Konsep Inti & Deep Dive Arsitektur

Otomatisasi multi-region dengan Terraform memerlukan pemahaman mendalam tentang siklus hidup state, provider aliasing, dan sinkronisasi data terdistribusi. Di balik layar, Terraform mengevaluasi grafik ketergantungan (dependency graph) dari resource yang dideklarasikan, lalu mengeksekusi rencana eksekusi (execution plan) secara paralel atau sekuensial berdasarkan relasi antar-resource.

Dalam arsitektur web modern, sistem ini tidak hanya mengurus mesin virtual (EC2), tetapi juga seluruh ekosistem pendukung: Nginx reverse proxy, PHP-FPM, database MySQL/MariaDB dengan replikasi multi-master atau cross-region read replica, Redis cluster untuk caching dan session sharing, serta Route 53 dengan Latency-Based Routing atau Failover Routing.

[ Global Users ] ---> [ AWS Route 53 (Latency / Failover Routing) ]
                           /                                   \
                          /                                     \
         [ Region A: ap-southeast-1 ]                  [ Region B: us-east-1 ]
         +--------------------------+                  +--------------------------+
         | Cloudflare CDN / WAF     |                  | Cloudflare CDN / WAF     |
         |   |                      |                  |   |                      |
         |   v                      |                  |   v                      |
         | ALB (Application L.B)    |                  | ALB (Application L.B)    |
         |   |                      |                  |   |                      |
         |   v                      |                  |   v                      |
         | Auto Scaling Group (EC2) |                  | Auto Scaling Group (EC2) |
         |   - Nginx + PHP-FPM / Go |                  |   - Nginx + PHP-FPM / Go |
         |   - Redis (Session Store)|                  |   - Redis (Session Store)|
         +--------------------------+                  +--------------------------+
                       ^                                             ^
                       |--------- Cross-Region DB Replication -------|
                                   (AWS Aurora Global Database)

Alur data dan eksekusi saat klien melakukan permintaan (request):

  1. Permintaan DNS diselesaikan oleh AWS Route 53, mengarahkan pengguna ke region terdekat yang sehat.
  2. Traffic melewati Cloudflare CDN dan WAF untuk menyaring serangan Layer 7 dan melakukan edge caching pada aset statis (HTML, CSS, JS, gambar).
  3. Permintaan dinamis diteruskan ke Application Load Balancer (ALB) di region tersebut.
  4. ALB mendistribusikan beban ke instance EC2 di dalam Auto Scaling Group.
  5. Web server (Nginx) memproses file PHP/Go/Node, mengambil data dari Redis (jika cached), atau melakukan query ke database Aurora RDS yang tersinkronisasi secara global.

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun arsitektur multi-region, terdapat beberapa pendekatan penyimpanan data dan manajemen state yang dapat dipilih berdasarkan kebutuhan bisnis dan anggaran.

Pendekatan Arsitektur Kelebihan Kekurangan Trade-off Utama (CPU, RAM, Latency)
Active-Passive (Hot Standby) Sederhana, konsistensi data mudah dijaga, biaya lebih rendah. Region pasif tidak memproses traffic secara aktif; waktu failover sedikit lebih lama. Latency rendah di primary, namun utilitas hardware region sekunder terbuang percuma.
Active-Active (Multi-Region) Ketersediaan maksimal (99.999%), latensi minimal global, utilitas sumber daya merata. Kompleksitas tinggi pada konsistensi database (split-brain risk), biaya operasional lebih tinggi. Konsumsi RAM & CPU tinggi di semua region; latensi replikasi database lintas benua (cross-region latency).
Distributed State (Remote Backend S3+DynamoDB) Aman, mendukung kolaborasi tim, penguncian state otomatis mencegah korupsi data. Membutuhkan setup awal bucket S3 dan tabel DynamoDB di luar Terraform (bootstrap). Overhead jaringan minimum ke AWS S3/DynamoDB saat eksekusi terraform plan/apply.

[!TIP] Untuk aplikasi web berstandar enterprise yang melayani pengguna lintas benua, pendekatan Active-Active dengan AWS Aurora Global Database dan Remote State S3/DynamoDB adalah standar industri terbaik meskipun memiliki kompleksitas konfigurasi yang lebih tinggi.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mulai menulis kode Terraform, pastikan mesin lokal atau lingkungan CI/CD Anda memiliki prasyarat berikut terinstall dengan versi yang kompatibel:

  • Terraform CLI: Versi >= 1.5.0
  • AWS CLI: Versi >= 2.13.0 terkonfigurasi dengan kredensial IAM yang memiliki hak akses administrator atau kebijakan terkelola yang sesuai (IAM FullAccess / AdministratorAccess untuk setup awal).
  • Git: Untuk manajemen versi modul.

Verifikasi instalasi melalui terminal:

terraform version
aws --version

Konfigurasikan profil AWS CLI Anda:

aws configure --profile enterprise-prod

Masukkan AWS Access Key ID, Secret Access Key, region default (misal: ap-southeast-1), dan format output (json).


5. Panduan Implementasi Langkah demi Langkah

Berikut adalah struktur direktori proyek Terraform yang modular dan siap produksi:

terraform-aws-multiregion/
├── backend.tf
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars
└── modules/
    └── web_infrastructure/
        ├── main.tf
        ├── variables.tf
        └── outputs.tf

1. File Konfigurasi Backend (backend.tf)

File ini memastikan state file disimpan secara aman dan terdistribusi di AWS S3 dengan penguncian konsistensi melalui DynamoDB.

terraform {
  required_version = ">= 1.5.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket         = "enterprise-terraform-state-store-prod"
    key            = "global/infrastructure.tfstate"
    region         = "ap-southeast-1"
    dynamodb_table = "enterprise-terraform-locks"
    encrypt        = true
  }
}

2. Variabel Global (variables.tf)

variable "project_name" {
  type        = string
  description = "Nama proyek untuk penamaan resource"
  default     = "enterprise-web"
}

variable "primary_region" {
  type        = string
  description = "Region AWS Utama"
  default     = "ap-southeast-1"
}

variable "secondary_region" {
  type        = string
  description = "Region AWS Sekunder"
  default     = "us-east-1"
}

variable "instance_type" {
  type        = string
  description = "Tipe instance EC2 untuk web server"
  default     = "t3.medium"
}

3. Konfigurasi Utama & Multi-Region Provider (main.tf)

provider "aws" {
  alias  = "primary"
  region = var.primary_region
}

provider "aws" {
  alias  = "secondary"
  region = var.secondary_region
}

# Modul untuk Region Utama (ap-southeast-1)
module "infra_primary" {
  source = "./modules/web_infrastructure"
  providers = {
    aws = aws.primary
  }
  region_name   = var.primary_region
  project_name  = var.project_name
  instance_type = var.instance_type
}

# Modul untuk Region Sekunder (us-east-1)
module "infra_secondary" {
  source = "./modules/web_infrastructure"
  providers = {
    aws = aws.secondary
  }
  region_name   = var.secondary_region
  project_name  = var.project_name
  instance_type = var.instance_type
}

4. Modul Reusable Web Infrastructure (modules/web_infrastructure/main.tf)

variable "region_name" { type = string }
variable "project_name" { type = string }
variable "instance_type" { type = string }

data "aws_vpc" "default" {
  default = true
}

data "aws_subnets" "default" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.default.id]
  }
}

resource "aws_security_group" "web_sg" {
  name        = "${var.project_name}-${var.region_name}-web-sg"
  description = "Allow HTTP, HTTPS, and SSH"
  vpc_id      = data.aws_vpc.default.id

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

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

  ingress {
    description = "SSH Admin"
    from_port   = 22
    to_port     = 22
    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"]
  }

  tags = {
    Name = "${var.project_name}-${var.region_name}-sg"
  }
}

data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
  }
  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
  owners = ["099720109477"]
}

resource "aws_launch_template" "web_lt" {
  name_prefix   = "${var.project_name}-${var.region_name}-lt-"
  image_id      = data.aws_ami.ubuntu.id
  instance_type = var.instance_type

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

  user_data = base64encode(<<-EOF
              #!/bin/bash
              apt-get update -y
              apt-get install -y nginx php-fpm php-mysql redis-server
              systemctl start nginx
              systemctl enable nginx
              echo "<h1>Welcome to Enterprise Web Server in ${var.region_name}</h1>" > /var/www/html/index.nginx-debian.html
              systemctl restart nginx
              EOF
  )

  tags = {
    Name = "${var.project_name}-${var.region_name}-lt"
  }
}

resource "aws_autoscaling_group" "web_asg" {
  vpc_zone_identifier = data.aws_subnets.default.ids
  desired_capacity    = 2
  max_size            = 5
  min_size            = 1

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

  tag {
    key                 = "Name"
    value               = "${var.project_name}-${var.region_name}-asg-instance"
    propagate_at_launch = true
  }
}

output "asg_name" {
  value = aws_autoscaling_group.web_asg.name
}

Inisialisasi dan terapkan konfigurasi:

terraform init
terraform plan -out=tfplan
terraform apply tfplan

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • Backend S3 & DynamoDB (backend.tf): Penggunaan encrypt = true memastikan state file terenkripsi secara at-rest menggunakan KMS AWS. Tabel DynamoDB berfungsi sebagai state locking mechanism untuk mencegah dua engineer atau pipeline CI/CD melakukan apply secara bersamaan yang dapat merusak file state.
  • Provider Aliasing (main.tf): Pendekatan alias = "primary" dan alias = "secondary" memungkinkan kita mendefinisikan satu modul yang sama (source = "./modules/web_infrastructure") dan menerapkannya ke beberapa region AWS yang berbeda secara paralel menggunakan blok providers di dalam pemanggilan modul.
  • User Data Automation (modules/web_infrastructure/main.tf): Skrip bash di dalam user_data otomatis menginstal Nginx, PHP-FPM, dan Redis saat instance EC2 pertama kali booting (bootstrapping), memastikan setiap instance baru langsung siap melayani traffic web tanpa intervensi manual.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Bayangkan sebuah platform e-commerce enterprise yang mengalami lonjakan traffic masif saat flash sale akhir tahun. Dengan arsitektur Terraform multi-region di atas:

  1. Auto Scaling Group (ASG): Ketika CPU utilization pada instance Nginx melewati ambang batas 70%, ASG secara otomatis menambah jumlah instance EC2 baik di region Singapura maupun Virginia.
  2. Database Failover: Menggunakan AWS Aurora Global Database, jika region primer mengalami gangguan total, region sekunder dapat dipromosikan menjadi primary write-node dalam waktu kurang dari 30 detik.
  3. Zero Downtime Deployment: Pembaruan versi aplikasi dilakukan dengan memperbarui AMI di aws_launch_template dan melakukan Rolling Update pada ASG tanpa memutus koneksi pengguna yang sedang aktif.

8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Hardcoding Kredensial atau Region. Kesalahan: Menulis AWS Access Key dan Secret Key langsung di dalam file .tf. Solusi: Selalu gunakan Environment Variables (AWS_ACCESS_KEY_ID), IAM Instance Profiles, atau AWS Vault.
  • Anti-Pattern 2: Menggunakan State File Lokal di Tim. Kesalahan: Menyimpan file terraform.tfstate di local laptop masing-masing developer. Solusi: Wajib menggunakan remote backend terpusat seperti S3 dengan DynamoDB locking.
  • Pitfall 3: Mengabaikan lifecycle { create_before_destroy = true } pada Launch Template. Kesalahan: Terraform mencoba menghapus Launch Template lama sebelum membuat yang baru, yang menyebabkan kegagalan pembaruan ASG. Solusi: Tambahkan blok lifecycle pada resource aws_launch_template.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji ketahanan dan performa infrastruktur web yang telah di-deploy, gunakan tool benchmark seperti k6 atau wrk.

Contoh skrip pengujian menggunakan k6 (load-test.js):

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

export const options = {
  stages: [
    { duration: '1m', target: 100 }, // Ramp-up ke 100 users
    { duration: '3m', target: 500 }, // Beban puncak 500 users
    { duration: '1m', target: 0 },   // Ramp-down
  ],
};

export default function () {
  const res = http.get('http://<YOUR-ALB-DNS-NAME>');
  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 200ms': (r) => r.timings.duration < 200,
  });
  sleep(1);
}

Jalankan benchmark:

k6 run load-test.js

Tuning Parameter Lanjutan:

  • Pada Nginx (/etc/nginx/nginx.conf), sesuaikan parameter worker_processes auto;, worker_connections 65535;, dan aktifkan keepalive_timeout 65; untuk menangani koneksi konkuren tinggi.
  • Pada kernel Linux (/etc/sysctl.conf), tingkatkan batas file descriptor: fs.file-max = 2097152.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis infrastruktur ini ke lingkungan production yang sebenarnya, pastikan Anda telah mencentang seluruh poin dalam checklist berikut:

  • Remote backend S3 & DynamoDB aktif dan terenkripsi.
  • Semua kredensial sensitif dikelola via IAM Roles atau Secrets Manager, bukan teks biasa.
  • Auto Scaling Group dikonfigurasi di minimal 2 Availability Zone per region.
  • Health check ALB terkonfigurasi dengan benar untuk mendeteksi kegagalan web server.
  • Kebijakan Backup dan Snapshot otomatis diaktifkan untuk database dan EBS volumes.
  • Uji coba Disaster Recovery (simulasi region switch) telah dilakukan secara berkala.

Dengan menerapkan Infrastructure as Code menggunakan Terraform dan strategi multi-region AWS ini, organisasi Anda tidak hanya mencapai otomatisasi penuh, tetapi juga membangun fondasi sistem web yang tangguh, aman, dan siap menghadapi pertumbuhan skala global.

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