> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skanesgalab.my.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Modularisasi Infrastruktur dengan Terraform Modules

> Praktik membuat Terraform Module mandiri (Reusable Modules), struktur folder standar, input/output variables, dan memanggil modul lokal maupun dari Terraform Registry.

## Mengapa Butuh Terraform Modules?

Ketika arsitektur sistemmu berkembang, menulis semua konfigurasi (VPC, Subnet, EC2, Database) secara berulang-ulang untuk lingkungan `dev`, `staging`, dan `prod` melanggar prinsip **DRY (*Don't Repeat Yourself*)**.

Jika ada perubahan aturan firewall, kamu terpaksa mengedit 3 file berbeda di 3 folder.

**Terraform Module** adalah wadah pembungkus (*container*) untuk sekumpulan berkas konfigurasi Terraform yang dapat dipanggil dan digunakan kembali berkali-kali hanya dengan memberikan parameter input yang berbeda.

***

## Struktur Standar Sebuah Modul

Struktur direktori standar untuk modul Terraform kustom:

```text theme={null}
modules/
└── aws_web_cluster/
    ├── main.tf       # Resource yang dibuat oleh modul (EC2, SG, dsb)
    ├── variables.tf  # Input yang diwajibkan saat memanggil modul
    ├── outputs.tf    # Nilai yang dikembalikan modul ke pemanggil
    └── README.md     # Dokumentasi cara pakai modul
```

***

## Hands-On: Membuat Modul Kustom

Mari kita buat sebuah modul yang bertugas membuat kelompok server web:

### 1. File `modules/aws_web_cluster/variables.tf` (Parameter Input)

```hcl theme={null}
variable "cluster_name" {
  type        = string
  description = "Nama prefix untuk cluster server"
}

variable "server_count" {
  type        = number
  default     = 2
}

variable "instance_type" {
  type    = string
  default = "t2.micro"
}

variable "subnet_id" {
  type        = string
  description = "ID subnet tempat server akan ditempatkan"
}
```

### 2. File `modules/aws_web_cluster/main.tf`

```hcl theme={null}
resource "aws_instance" "cluster_nodes" {
  count         = var.server_count
  ami           = "ami-0df7a207adb9748c7" # Ubuntu 22.04 LTS
  instance_type = var.instance_type
  subnet_id     = var.subnet_id

  tags = {
    Name = "${var.cluster_name}-node-${count.index + 1}"
  }
}
```

### 3. File `modules/aws_web_cluster/outputs.tf` (Nilai Kembalian)

```hcl theme={null}
output "instance_ids" {
  value = aws_instance.cluster_nodes[*].id
}

output "private_ips" {
  value = aws_instance.cluster_nodes[*].private_ip
}
```

***

## Memanggil Modul di Lingkungan Berbeda

Sekarang, kita bisa memanggil modul yang sama untuk lingkungan **Development** dan **Production** dengan sangat ringkas:

### Di Lingkungan Dev (`environments/dev/main.tf`):

```hcl theme={null}
module "dev_web_cluster" {
  source       = "../../modules/aws_web_cluster"
  cluster_name = "dev-app"
  server_count = 1                 # Cukup 1 server murah untuk dev
  instance_type= "t2.nano"
  subnet_id    = "subnet-xxxxxxx"
}
```

### Di Lingkungan Production (`environments/prod/main.tf`):

```hcl theme={null}
module "prod_web_cluster" {
  source       = "../../modules/aws_web_cluster"
  cluster_name = "prod-app"
  server_count = 5                 # 5 server bertenaga tinggi untuk produksi
  instance_type= "t3.medium"
  subnet_id    = "subnet-yyyyyyy"
}

# Mengambil output dari modul prod:
output "production_ips" {
  value = module.prod_web_cluster.private_ips
}
```

***

## Menggunakan Modul Resmi dari Terraform Registry

Selain membuat modul sendiri, komunitas global dan cloud provider menyediakan ribuan modul resmi yang teruji di [registry.terraform.io](https://registry.terraform.io).

Contoh memanggil modul resmi **AWS VPC** (kamu tidak perlu menulis 50 baris resource VPC dari nol):

```hcl theme={null}
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.1.2"

  name = "enterprise-vpc"
  cidr = "10.0.0.0/16"

  azs             = ["ap-southeast-1a", "ap-southeast-1b"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24"]

  enable_nat_gateway = true
  single_nat_gateway = true

  tags = {
    Terraform   = "true"
    Environment = "prod"
  }
}
```

*Dengan modul resmi di atas, seluruh subnet publik, subnet privat, routing table, dan NAT Gateway dibuat secara otomatis hanya dalam 10 baris kode!*


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.