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

Automasi Infrastruktur Immutable menggunakan Terraform dan Ansible untuk Cloud Hybird

⏱️ 15 menit baca β€’ πŸ“… 19 Oct 2026 β€’ πŸ‘οΈ 4 views
Automasi Infrastruktur Immutable menggunakan Terraform dan Ansible untuk Cloud Hybird

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern dan pengelolaan infrastruktur hibrida (hybrid cloud), model pengelolaan server tradisional yang dikenal sebagai mutable infrastructure telah menjadi akar dari berbagai insiden kegagalan sistem yang merugikan. Pendekatan lama di mana administrator sistem melakukan login secara langsung menggunakan SSH ke dalam mesin virtual (VM) atau bare-metal untuk menginstal dependensi, memperbarui pustaka runtime seperti Node.js, PHP-FPM, atau Go, serta mengubah konfigurasi Nginx secara manual, menyisakan ruang besar untuk human error. Fenomena ini sering disebut sebagai "Configuration Drift". Ketika sebuah server mengalami drift konfigurasi seiring berjalannya waktu, server tersebut menjadi unik dan tidak dapat direplikasi dengan tepat. Jika terjadi bencana atau lonjakan lalu lintas yang ekstrem, proses pemulihan (disaster recovery) menjadi lambat, penuh ketidakpastian, dan sangat bergantung pada pengetahuan tribal dari individu tertentu.

Bottleneck keamanan dan performa juga sering kali muncul dari ketidakkonsistensian ini. Bayangkan sebuah arsitektur web yang mendistribusikan bebannya melalui load balancer ke sepuluh instans backend web server. Jika satu instans mengalami pembaruan manual yang terlewat pada modul keamanan OpenSSL atau konfigurasi direktif worker_processes pada Nginx, instans tersebut menjadi titik lemah (single point of failure) yang rentan terhadap eksploitasi eksploitasi zero-day atau mengalami degradasi performa drastis saat menangani ribuan koneksi WebSocket secara bersamaan.

[!WARNING] Melakukan modifikasi langsung pada server produksi melalui SSH tanpa melalui pipeline otomatis adalah pelanggaran berat terhadap prinsip auditabilitas dan keamanan enterprise.

Sebagai solusi definitif, industri beralih ke Immutable Infrastructure (Infrastruktur Immutabel). Dalam model ini, server tidak pernah dimodifikasi setelah dideploy. Jika ada pembaruan kode aplikasi, perubahan konfigurasi Nginx, penyesuaian parameter PHP-FPM, atau pembaruan patch kernel Linux, server lama tidak ditambal (patched), melainkan dihancurkan secara total dan digantikan oleh instans baru yang dibangun dari awal menggunakan cetak biru (blueprint) terotomasi. Perbandingan kondisi dapat dilihat pada tabel di bawah ini:

Parameter Mutable Infrastructure (Tradisional) Immutable Infrastructure (Modern)
Siklus Hidup Server Jangka panjang, bertahun-tahun hidup dengan penambalan manual. Jangka pendek, dihancurkan dan dibuat ulang secara berkala (ephemeral).
Auditabilitas Rendah; riwayat perubahan sulit dilacak secara presisi. Tinggi; seluruh perubahan tercatat di repositori Git (GitOps).
Recovery Time (RTO) Lambat; membutuhkan proses troubleshooting manual. Sangat cepat; cukup re-provision instans baru dari image yang valid.
Konsistensi Lingkungan Buruk; rentan terhadap configuration drift antar server. Sempurna; staging dan produksi memiliki basis image yang identik.

2. Konsep Inti & Deep Dive Arsitektur

Penerapan infrastruktur imutabel dalam ekosistem hybrid cloud (misalnya menggabungkan AWS, On-Premises VMware, dan Cloudflare sebagai Edge CDN) memerlukan kombinasi alat orkestrasi yang memiliki spesialisasi tugas yang jelas. Terraform bertindak sebagai Infrastructure as Code (IaC) declarative tool yang bertugas memprovisi sumber daya fondasi: Virtual Private Cloud (VPC), subnet, firewall security groups, load balancer, dan alokasi penyimpanan blok (S3/MinIO). Sementara itu, Ansible bertindak sebagai Configuration Management dan Service Provisioning tool yang masuk setelah infrastruktur dasar berdiri untuk mengonfigurasi sistem operasi, menginstal paket perangkat lunak web (Nginx, PostgreSQL, Redis, Postfix), serta mengatur hak akses file.

Alur eksekusi end-to-end dari proses ini mengikuti siklus hidup yang ketat:

+-----------------------+
|    Developer / Git    |
+-----------------------+
            |
            v (Trigger CI/CD Pipeline)
+-----------------------+       +------------------------+
| Terraform Apply       | ----> | Cloud Provider (AWS/VM)|
+-----------------------+       +------------------------+
            |                                |
            | (Output IP / Inventory)        | (Instance Ready)
            v                                v
+-----------------------+       +------------------------+
| Ansible Playbook      | ----> | OS & Web Stack Setup   |
| (Nginx, PHP, Redis)   |       | (SSL, Firewall, Cron)  |
+-----------------------+       +------------------------+
            |
            v
+-----------------------+
| Cloudflare / CDN Edge | ---> Production Traffic Ready
+-----------------------+

Di balik layar, Terraform menggunakan mekanisme state file untuk melacak status aktual sumber daya cloud terhadap file konfigurasi HCL (HashiCorp Configuration Language). Ketika Ansible dipanggil, ia memanfaatkan dynamic inventory yang dihasilkan oleh Terraform, melakukan koneksi SSH secara paralel menggunakan protokol transport yang aman, dan menjalankan tugas-tugas (tasks) secara idempotentβ€”artinya, menjalankan playbook berulang kali tidak akan mengubah status sistem jika sistem tersebut sudah berada dalam kondisi yang diinginkan.


3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun arsitektur web enterprise yang menangani beban tinggi (high concurrency), pemilihan pendekatan provisioning sangat menentukan penggunaan sumber daya komputasi:

  1. Pendekatan Manual + Shell Scripting Murni

    • Kelebihan: Tidak memerlukan kurva belajar alat baru.
    • Kekurangan: Tidak idempotent, rentan gagal di tengah jalan (partial failure), tidak ada state management, manajemen rahasia (secrets) buruk.
    • Resource Trade-off: Hemat memori kontroler, namun boros waktu insinyur.
  2. Pendekatan Konfigurasi Monolitik (Hanya Ansible / Hanya Terraform)

    • Kelebihan: Cepat untuk skala kecil.
    • Kekurangan: Terraform dipaksa melakukan manajemen file konfigurasi aplikasi (yang bukan ranahnya), atau Ansible dipaksa memprovisi VPC dan jaringan cloud (yang sangat terbatas kapabilitasnya dibanding Terraform).
    • Resource Trade-off: Penggunaan CPU dan RAM moderat pada mesin kontroler CI/CD.
  3. Pendekatan Hibrida Terintegrasi (Terraform + Ansible)

    • Kelebihan: Pemisahan tugas yang tegas (Separation of Concerns). Terraform menguasai Infrastructure Provisioning, Ansible menguasai Configuration Management.
    • Kekurangan: Membutuhkan pemeliharaan dua set sintaks (HCL dan YAML) serta pengelolaan kunci SSH yang ketat.
    • Resource Trade-off: Membutuhkan kapasitas memori minimal 2GB RAM pada runner CI/CD, namun menghasilkan efisiensi operasional jangka panjang yang maksimal.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum memulai implementasi kode, pastikan lingkungan kerja lokal atau server CI/CD Anda memiliki pustaka dan utilitas berikut dengan versi minimum yang disyaratkan:

  • Terraform: Versi >= 1.6.0
  • Ansible: Versi >= 2.15.0
  • Python: Versi >= 3.10 (diperlukan oleh Ansible)
  • AWS CLI / OpenStack Client / vSphere Provider CLI (sesuai target hybrid cloud)
  • Kunci SSH (ED25519) untuk autentikasi tanpa kata sandi.

Lakukan verifikasi instalasi dengan menjalankan perintah terminal berikut:

terraform -version
ansible --version
python3 --version
ssh -V

Pastikan juga Anda telah mengatur variabel lingkungan untuk kredensial cloud provider Anda:

export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_DEFAULT_REGION="ap-southeast-1"

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Struktur Direktori Proyek

Buat struktur direktori proyek yang bersih dan terisolasi:

./hybrid-infra-immutable/
β”œβ”€β”€ terraform/
β”‚   β”œβ”€β”€ main.tf
β”‚   β”œβ”€β”€ variables.tf
β”‚   β”œβ”€β”€ outputs.tf
β”‚   └── provider.tf
└── ansible/
    β”œβ”€β”€ ansible.cfg
    β”œβ”€β”€ inventory.yml
    └── playbooks/
        β”œβ”€β”€ site.yml
        └── roles/
            └── webserver/
                β”œβ”€β”€ tasks/
                β”‚   └── main.yml
                └── templates/
                    └── nginx.conf.j2

Langkah 2: Konfigurasi Terraform (terraform/main.tf)

File ini mendefinisikan infrastruktur dasar pada cloud provider (dalam contoh ini menggunakan AWS sebagai representasi hybrid cloud edge):

terraform {
  required_version = ">= 1.6.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

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

  tags = {
    Name        = "production-vpc"
    Environment = "production"
  }
}

resource "aws_subnet" "public" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = true

  tags = {
    Name = "production-public-subnet"
  }
}

resource "aws_security_group" "web" {
  name        = "production-web-sg"
  description = "Allow HTTP, HTTPS, and SSH"
  vpc_id      = aws_vpc.main.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 from internal bastion"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["10.0.0.0/16"]
  }

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

resource "aws_instance" "web_server" {
  ami                    = "ami-0c55b159cbfafe1f0" # Ubuntu 22.04 LTS
  instance_type          = "t3.medium"
  subnet_id              = aws_subnet.public.id
  vpc_security_group_ids = [aws_security_group.web.id]
  key_name               = var.ssh_key_name

  tags = {
    Name        = "production-web-node"
    Environment = "production"
  }
}

output "web_instance_ip" {
  value       = aws_instance.web_server.public_ip
  description = "Public IP of the web server for Ansible inventory"
}

Langkah 3: Konfigurasi Variabel Terraform (terraform/variables.tf)

variable "aws_region" {
  type    = string
  default = "ap-southeast-1"
}

variable "ssh_key_name" {
  type    = string
  default = "production-deploy-key"
}

Langkah 4: Konfigurasi Ansible Playbook (ansible/playbooks/site.yml)

Playbook utama untuk mengonfigurasi layanan web, PHP-FPM, Nginx, Redis, dan pengamanan sistem:

---
- name: Provision Immutable Web Node
  hosts: web_servers
  become: yes
  vars:
    app_user: "www-data"
  roles:
    - webserver

Langkah 5: Peran Ansible (ansible/playbooks/roles/webserver/tasks/main.yml)

---
- name: Update apt cache and upgrade base packages
  apt:
    update_cache: yes
    upgrade: safe
    cache_valid_time: 3600

- name: Install required enterprise web stack packages
  apt:
    name:
      - nginx
      - php8.2-fpm
      - php8.2-cli
      - php8.2-mysql
      - php8.2-redis
      - php8.2-mbstring
      - redis-server
      - fail2ban
      - ufw
    state: present

- name: Configure UFW Firewall rules
  ufw:
    rule: allow
    port: "{{ item }}"
    proto: tcp
  loop:
    - "22"
    - "80"
    - "443"

- name: Enable and start UFW
  ufw:
    state: enabled
    policy: deny

- name: Deploy optimized Nginx configuration template
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
  notify: Restart Nginx

- name: Ensure PHP-FPM is running and enabled on boot
  systemd:
    name: php8.2-fpm
    state: started
    enabled: yes

- name: Ensure Redis is secured and running
  lineinfile:
    path: /etc/redis/redis.conf
    regexp: '^bind '
    line: 'bind 127.0.0.1 ::1'
  notify: Restart Redis

- name: Configure Fail2ban for SSH protection
  copy:
    dest: /etc/fail2ban/jail.local
    content: |
      [sshd]
      enabled = true
      port = ssh
      filter = sshd
      logpath = /var/log/auth.log
      maxretry = 3
      bantime = 3600
  notify: Restart Fail2ban

handlers:
  - name: Restart Nginx
    service:
    
      name: nginx
      state: restarted

  - name: Restart Redis
    service:
      name: redis-server
      state: restarted

  - name: Restart Fail2ban
    service:
      name: fail2ban
      state: restarted

Langkah 6: Templat Konfigurasi Nginx (ansible/playbooks/roles/webserver/templates/nginx.conf.j2)

user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 10240;
    use epoll;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa parameter krusial dalam file konfigurasi di atas untuk memahami dampaknya terhadap arsitektur web:

  1. worker_rlimit_nofile 65535; dan worker_connections 10240; pada Nginx

    • Fungsi: Mengatur batas maksimal deskriptor file terbuka dan jumlah koneksi simultan per worker process. Secara default, Linux membatasi proses terbuka. Pengaturan ini sangat vital untuk menangani lonjakan lalu lintas tinggi atau koneksi WebSocket real-time tanpa mengalami error 502 Bad Gateway atau Too many open files.
  2. use epoll;

    • Fungsi: Memaksa Nginx menggunakan sistem pemanggilan asinkron I/O epoll milik kernel Linux (Linux 2.6+). Ini jauh lebih efisien dibandingkan model poll atau select lama karena menggunakan kompleksitas $O(1)$ untuk memantau ribuan soket jaringan.
  3. bind 127.0.0.1 ::1 pada Redis

    • Fungsi: Menutup akses jaringan publik ke server Redis dan hanya mengizinkan koneksi dari localhost. Ini adalah tindakan pengamanan standar untuk mencegah basis data cache terekspos ke internet publik yang dapat dieksploitasi oleh botnet.
  4. maxretry = 3 pada Fail2ban

    • Fungsi: Mengatur batas maksimal 3 kali kegagalan autentikasi SSH sebelum alamat IP penyerang diblokir secara otomatis melalui aturan firewall iptables/nftables selama 1 jam.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam sebuah studi kasus nyata pada platform e-commerce enterprise dengan volume transaksi tinggi selama flash sale, arsitektur hibrida ini diuji kemampuannya. Sistem menggunakan Terraform untuk memprovisi Auto Scaling Group (ASG) berbasis AWS EC2 di belakang Application Load Balancer (ALB), dengan lapisan Cloudflare di sisi Edge untuk mitigasi DDoS dan SSL termination.

Ketika metrik pemanfaatan CPU instans mencapai 75%, AWS memicu peluncuran instans baru secara otomatis. Di sinilah pipeline CI/CD (GitHub Actions) secara otomatis menjalankan Terraform untuk mendaftarkan instans baru, diikuti oleh eksekusi Ansible Playbook secara paralel untuk mengonfigurasi tumpukan Nginx dan PHP-FPM dalam waktu kurang dari 90 detik. Hasilnya, penambahan kapasitas penanganan permintaan (throughput) terjadi tanpa intervensi manual sedikit pun, memastikan nol downtime bagi pengguna akhir.


8. Common Pitfalls, Anti-Patterns & Solusi

Kesalahan umum yang sering dilakukan oleh praktisi infrastruktur pemula meliputi:

  • Anti-Pattern 1: Menyimpan Kredensial Rahasia (Secrets) Plaintext di dalam Git

    • Masalah: Menulis kata sandi database atau token API secara langsung di dalam file variabel Terraform atau Ansible playbook.
    • Solusi: Gunakan HashiCorp Vault, AWS Secrets Manager, atau enkripsi menggunakan Ansible Vault (ansible-vault encrypt).
  • Anti-Pattern 2: Mengandalkan Mutable Updates di Produksi

    • Masalah: Mengubah konfigurasi Nginx langsung di server produksi via SSH saat terjadi insiden darurat.
    • Solusi: Terapkan kebijakan penegakan hak akses IAM yang melarang akses SSH langsung (SSH access disabled). Semua perbaikan harus melalui perubahan kode di repositori, commit, dan redeploy instans imutabel.
  • Anti-Pattern 3: Playbook Ansible Tidak Idempotent

    • Masalah: Menggunakan modul shell atau command secara berlebihan di Ansible tanpa pemeriksaan status (check mode), yang menyebabkan kegagalan saat playbook dijalankan berulang kali.
    • Solusi: Selalu gunakan modul deklaratif bawaan Ansible (seperti apt, template, service, lineinfile) yang secara inheren mendukung idempotensi.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan bahwa server web imutabel yang telah dikonfigurasi siap menghadapi beban tinggi, lakukan pengujian beban menggunakan alat benchmark industri seperti wrk atau k6.

Contoh perintah pengujian beban menggunakan wrk dengan 12 thread dan 400 koneksi paralel selama 30 detik:

wrk -t12 -c400 -d30s https://your-domain.com/

Interpretasi Hasil & Tuning Lanjutan:

  • Latency Distribution: Perhatikan metrik 99th percentile ($p99$). Jika $p99$ melebihi 200ms, periksa konfigurasi worker_connections Nginx dan pastikan direktif keepalive_timeout dioptimalkan agar koneksi TCP tetap terbuka untuk mengurangi overhead jabat tangan TLS (TLS handshake).
  • Kernel Tuning (/etc/sysctl.conf): Tambahkan parameter berikut melalui peran Ansible untuk meningkatkan kapasitas jaringan kernel Linux:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan infrastruktur imutabel ini ke lingkungan produksi, pastikan seluruh item dalam checklist berikut telah terpenuhi secara ketat:

  • Semua kredensial dan kunci rahasia telah dienkripsi menggunakan Ansible Vault atau Secret Manager.
  • Akses SSH langsung dinonaktifkan pada semua instans produksi (menggunakan akses bastion/jump host terenkripsi).
  • Aturan UFW Firewall dan Fail2ban aktif dan memblokir port yang tidak sah.
  • Konfigurasi Nginx dan PHP-FPM telah diuji melalui benchmark load testing.
  • Skrip pencadangan otomatis (backup retention) untuk database MySQL/MariaDB dan Redis terkonfigurasi di luar instans imutabel.
  • Pemantauan metrik (Prometheus/Grafana) terpasang pada setiap instans baru secara otomatis.

[!IMPORTANT] Infrastruktur imutabel bukanlah sekadar tren teknologi, melainkan fondasi ketahanan operasional jangka panjang yang menjamin prediktabilitas, keamanan, dan skalabilitas tanpa kompromi.

Dengan mengintegrasikan Terraform untuk tata letak infrastruktur dasar dan Ansible untuk konfigurasi layanan tingkat OS secara otomatis, organisasi Anda kini memiliki standar rekayasa tingkat enterprise yang siap menghadapi tantangan cloud hibrida modern.

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