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

Deklarasi Infrastruktur Skala Enterprise Menggunakan Terraform dan Ansible

⏱️ 15 menit baca β€’ πŸ“… 13 Oct 2026 β€’ πŸ‘οΈ 1 views
Deklarasi Infrastruktur Skala Enterprise Menggunakan Terraform dan Ansible

Deklarasi Infrastruktur Skala Enterprise Menggunakan Terraform dan Ansible

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern yang menuntut ketersediaan tinggi (high availability) dan latensi rendah, pengelolaan infrastruktur secara manual (manual provisioning) melalui console cloud provider atau eksekusi command SSH ad-hoc telah menjadi beban teknis (technical debt) yang berbahaya. Di lingkungan enterprise yang mengelola ratusan server web (Nginx/Apache), backend service (Node.js, Go, PHP-FPM), cluster database (MySQL/MariaDB), sistem caching (Redis), hingga infrastruktur jaringan edge (Cloudflare CDN, WAF), konsistensi konfigurasi adalah kunci utama mitigasi kegagalan sistem.

Akar masalah dari kegagalan infrastruktur tradisional sering kali berakar pada fenomena configuration driftβ€”kondisi di mana server produksi menyimpang dari spesifikasi baseline awal akibat perubahan manual yang tidak tercatat. Hal ini memicu inkonsistensi antara environment Staging dan Production, yang berujung pada downtime bernilai tinggi saat deployment aplikasi baru.

Sebelum vs Sesudah Penerapan

Aspek Pendekatan Tradisional (Manual / Ad-hoc) Pendekatan Enterprise (Terraform + Ansible)
Provisioning Kecepatan Berjam-jam hingga berhari-hari, rentan human error. Otomatis, deterministik, selesai dalam hitungan menit.
Auditabilitas Tidak ada jejak audit yang jelas (who changed what). Version-controlled (GitOps), setiap perubahan terikat pada commit hash.
Pemulihan Bencana (DR) Proses rekonstruksi manual yang lambat dan berisiko tinggi. Disaster Recovery instan melalui rekonstruksi state deklaratif.
Skalabilitas Multi-Region Kompleksitas tinggi, konfigurasi ulang manual per region. Konsisten lintas region melalui parameterisasi modul modular.

2. Konsep Inti & Deep Dive Arsitektur

Pendekatan modern menggabungkan dua kekuatan utama: Terraform untuk Infrastructure as a Service (IaaS) dan provisioning sumber daya komputasi/jaringan, serta Ansible untuk Configuration Management dan orkestrasi layanan di dalam OS.

+-------------------------------------------------------------------------+
|                           Developer / GitOps                            |
+-------------------------------------------------------------------------+
                                     |
                                     v
+-------------------------------------------------------------------------+ 
|                         Terraform Workspace                             | 
|  - Menyiapkan VPC, Subnet, EC2/VM, Security Groups, S3, Load Balancer  | 
+-------------------------------------------------------------------------+ 
                                     |
                  [Mengeluarkan Output: IP Address, etc]
                                     v
+-------------------------------------------------------------------------+ 
|                     Dynamic Inventory Generation                        | 
+-------------------------------------------------------------------------+ 
                                     |
                                     v
+-------------------------------------------------------------------------+ 
|                         Ansible Playbooks                               | 
|  - Konfigurasi OS, Hardening (Fail2ban, SSL), Nginx, PHP-FPM, MySQL     | 
|  - Setup Supervisor, Redis, Postfix, Cron, SSL Let's Encrypt            | 
+-------------------------------------------------------------------------+ 
                                     |
                                     v
+-------------------------------------------------------------------------+ 
|                   Production-Ready Web Infrastructure                   | 
+-------------------------------------------------------------------------+

Alur eksekusi dimulai dengan Terraform membaca file konfigurasi .tf, merencanakan perubahan (execution plan), dan menerapkannya ke API Cloud Provider. Setelah mesin virtual atau server fisik siap, Terraform mengeluarkan output berupa IP address yang secara otomatis diumpankan ke Ansible Dynamic Inventory. Ansible kemudian mengambil alih untuk melakukan hardening, instalasi runtime, deployment konfigurasi Nginx/Go, setup sistem antrean (queue), hingga konfigurasi sertifikat TLS.


3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun infrastruktur enterprise, pemilihan kombinasi tool menentukan efisiensi resource pool Anda:

  • Terraform vs Cloud-Init murni: Cloud-init bagus untuk bootstrap instans tunggal, namun gagal dalam melacak state lintas waktu (state tracking), dependensi graf, dan manajemen resource kompleks lintas multi-cloud. Terraform menyediakan Dependency Graph yang akurat.
  • Ansible vs Bash Scripting: Bash script bersifat imperatif (memberitahu bagaimana cara melakukan sesuatu), yang sering kali gagal jika dijalankan berulang kali (not idempotent). Ansible bersifat deklaratif dan idempotent, artinya menjalankan playbook sepuluh kali berturut-turut pada server yang sama akan menghasilkan state akhir yang persis sama tanpa mengubah apa pun jika sudah sesuai.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum memulai implementasi, pastikan lingkungan kerja Anda memenuhi spesifikasi teknis berikut:

  • Terraform CLI: Versi >= 1.6.0
  • Ansible: Versi >= 2.15+
  • Cloud Provider Account: AWS (Access Key & Secret Key dengan hak akses Administrator atau IAM policy yang sesuai)
  • Remote Backend: AWS S3 Bucket untuk state file dan DynamoDB Table untuk state locking.
  • SSH Key Pair: Dibuat secara lokal (ssh-keygen -t rsa -b 4096 -f ~/.ssh/enterprise_infra_key) untuk autentikasi Ansible.

[!IMPORTANT] Jangan pernah menyimpan terraform.tfstate secara lokal di mesin engineer untuk lingkungan produksi. Gunakan remote state dengan enkripsi aktif demi keamanan data sensitif.


5. Panduan Implementasi Langkah demi Langkah

A. Desain Modul Terraform yang Modular dan Reusable

Struktur direktori proyek Terraform dirancang modular agar mudah diskalakan:

infra-root/
β”œβ”€β”€ modules/
β”‚   β”œβ”€β”€ networking/
β”‚   β”‚   β”œβ”€β”€ main.tf
β”‚   β”‚   β”œβ”€β”€ variables.tf
β”‚   β”‚   └── outputs.tf
β”‚   └── compute/
β”‚       β”œβ”€β”€ main.tf
β”‚       β”œβ”€β”€ variables.tf
β”‚       └── outputs.tf
β”œβ”€β”€ environments/
β”‚   └── production/
β”‚       β”œβ”€β”€ main.tf
β”‚       β”œβ”€β”€ variables.tf
β”‚       β”œβ”€β”€ backend.tf
β”‚       └── outputs.tf

Konfigurasi Remote State: environments/production/backend.tf

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

  backend "s3" {
    bucket         = "enterprise-terraform-state-store-prod"
    key            = "prod/infrastructure/terraform.tfstate"
    region         = "ap-southeast-1"
    dynamodb_table = "terraform-state-locks"
    encrypt        = true
  }
}

provider "aws" {
  region = "ap-southeast-1"
  default_tags {
    tags {
      Environment = "Production"
      ManagedBy   = "Terraform"
      Project     = "EnterpriseWebPlatform"
    }
  }
}

Implementasi Modul Compute: modules/compute/main.tf

variable "instance_type" {
  type    = string
  default = "t3.xlarge"
}

variable "subnet_id" {
  type = string
}

variable "security_group_ids" {
  type = list(string)
}

variable "ssh_public_key" {
  type = string
}

resource "aws_key_pair" "deployer" {
  key_name   = "enterprise-deployer-key"
  public_key = var.ssh_public_key
}

resource "aws_instance" "web_server" {
  ami                    = "ami-0c55b159cbfafe1f0" # Ubuntu 22.04 LTS
  instance_type          = var.instance_type
  subnet_id              = var.subnet_id
  vpc_security_group_ids = var.security_group_ids
  key_name               = aws_key_pair.deployer.key_name

  root_block_device {
    volume_size           = 100
    volume_type           = "gp3"
    encrypted             = true
    delete_on_termination = false
  }

  tags = {
    Name = "prod-web-node"
    Role = "web-frontend"
  }
}

output "instance_ip" {
  value = aws_instance.web_server.public_ip
}

B. Orkestrasi Konfigurasi Lanjutan Menggunakan Ansible Playbooks

Setelah Terraform selesai melakukan provisioning dan menghasilkan IP address, Ansible mengambil alih konfigurasi server web lengkap dengan stack Nginx, PHP-FPM, Redis, dan Fail2ban.

Struktur direktori Ansible:

ansible/
β”œβ”€β”€ inventory/
β”‚   └── production.yml
β”œβ”€β”€ roles/
β”‚   β”œβ”€β”€ common/
β”‚   β”œβ”€β”€ webserver/
β”‚   β”œβ”€β”€ database_client/
β”‚   └── security/
└── site.yml

Inventory Dinamis: ansible/inventory/production.yml

all:
  hosts:
    web_node_1:
      ansible_host: 54.255.x.x
      ansible_user: ubuntu
      ansible_ssh_private_key_file: ~/.ssh/enterprise_infra_key
  children:
    webservers:
      hosts:
        web_node_1:

Main Playbook: ansible/site.yml

---
- name: Configure Enterprise Web Infrastructure
  hosts: webservers
  become: true
  gather_facts: yes
  roles:
    - common
    - security
    - webserver

Role Webserver: ansible/roles/webserver/tasks/main.yml

---
- name: Install Nginx and PHP-FPM
  apt:
    name:
      - nginx
      - php8.2-fpm
      - php8.2-cli
      - php8.2-mysql
      - php8.2-redis
      - php8.2-curl
      - php8.2-mbstring
      - redis-server
    state: present
    update_cache: yes

- name: Configure Nginx Global Settings
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
  notify: Restart Nginx

- name: Configure Web Application vhost
  template:
    src: vhost.conf.j2
    dest: /etc/nginx/sites-available/enterprise_app.conf
    owner: root
    group: root
    mode: '0644'
  notify: Restart Nginx

- name: Enable Web Application vhost
  file:
    src: /etc/nginx/sites-available/enterprise_app.conf
    dest: /etc/nginx/sites-enabled/enterprise_app.conf
    state: link
  notify: Restart Nginx

- name: Remove default Nginx site
  file:
    path: /etc/nginx/sites-enabled/default
    state: absent
  notify: Restart Nginx

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

Template Konfigurasi Nginx: ansible/roles/webserver/templates/vhost.conf.j2

server {
    listen 80;
    server_name enterprise-app.local;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name enterprise-app.local;

    root /var/www/html/public;
    index index.php index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/enterprise-app.local/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/enterprise-app.local/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    location ~ /\.ht {
        deny all;
    }
}

6. Bedah Kode & Penjelasan Detail Baris Kunci

  1. Terraform S3 Backend & DynamoDB Locking: Penggunaan parameter dynamodb_table mencegah race condition. Jika dua engineer mencoba menjalankan terraform apply secara bersamaan, Terraform akan menolak operasi kedua karena tabel DynamoDB menandai state tersebut sedang terkunci (locked).
  2. Ansible become: true: Menjalankan task dengan hak akses root (sudo), krusial untuk instalasi paket sistem dan modifikasi file konfigurasi di /etc/nginx/.
  3. Nginx HTTP/2 & Security Headers: Konfigurasi listen 443 ssl http2 mengaktifkan protokol HTTP/2 untuk multiplexing request yang meningkatkan performa muat halaman web secara signifikan. Penambahan header keamanan (X-Frame-Options, X-Content-Type-Options) melindungi web server dari serangan Clickjacking dan MIME-type sniffing.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Di lingkungan produksi dengan traffic tinggi (high concurrency > 10.000 req/sec), konfigurasi sistem operasi dasar Linux sering kali mengalami bottleneck pada limit file descriptor (too many open files).

Untuk mengatasi hal ini, tambahkan task Ansible pada role common untuk menyesuaikan kernel sysctl dan limits:

- name: Set sysctl parameters for high concurrency
  sysctl:
    name: "{{ item.key }}"
    value: "{{ item.value }}"
    state: present
    reload: yes
  loop:
    - { key: 'fs.file-max', value: '2097152' }
    - { key: 'net.core.somaxconn', value: '65535' }
    - { key: 'net.ipv4.tcp_max_syn_backlog', value: '65535' }

8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Menyimpan Secret di dalam Git Repository.
    • Solusi: Gunakan Terraform Vault provider atau Ansible Vault untuk mengenkripsi variabel sensitif seperti database password dan API token.
  • Anti-Pattern 2: Hardcoding IP Address di Ansible Static Inventory.
    • Solusi: Gunakan Terraform output yang diekspor ke file JSON, lalu baca sebagai Dynamic Inventory di Ansible.
  • Anti-Pattern 3: Tidak Melakukan State Backup.
    • Solusi: Selalu aktifkan versioning pada S3 bucket yang menyimpan Terraform state file.

9. Benchmark, Metrik Kinerja & Tuning Performa

Lakukan pengujian beban (load testing) menggunakan tool wrk untuk menguji ketahanan web server yang telah dideklarasikan:

wrk -t12 -c400 -d30s https://enterprise-app.local/
  • Interpretasi Hasil: Pastikan metrik Requests/sec tinggi dan Latency rata-rata di bawah 50ms. Jika terjadi error Connection refused atau Socket closed, lakukan tuning pada parameter worker_connections di dalam nginx.conf dan tingkatkan limit nofile pada user www-data melalui Ansible.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan infrastruktur ke publik, pastikan checklist berikut terpenuhi:

  • Remote state Terraform dienkripsi dan menggunakan DynamoDB locking.
  • Semua credential dan secret telah dienkripsi menggunakan Ansible Vault / Secrets Manager.
  • Firewall (Security Groups / UFW) dikonfigurasi secara ketat (Prinsip Least Privilege).
  • Fail2ban aktif untuk melindungi port SSH dan endpoint login web.
  • Sertifikat SSL/TLS valid dan terkonfigurasi otomatis via Certbot/Let's Encrypt.
  • Monitoring dan log aggregation (Prometheus, Grafana, ELK Stack) terpasang di setiap node.

Dengan menggabungkan Terraform dan Ansible secara disiplin, organisasi Anda memiliki fondasi infrastruktur yang reproducible, aman, dan siap menghadapi skala enterprise tanpa rasa cemas terhadap anomali configuration drift.

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