1. Konsep Infrastructure as Code
Infrastructure as Code (IaC) adalah pendekatan pengelolaan infrastruktur IT melalui kode yang dapat dibaca manusia, bukan melalui konfigurasi manual melalui web console. Dengan IaC, Anda bisa membuat, memodifikasi, dan menghapus infrastruktur cloud secara konsisten dan reproducible.
Terraform adalah tool IaC open-source yang dikembangkan oleh HashiCorp. Terraform menggunakan bahasa deklaratif bernama HCL (HashiCorp Configuration Language) untuk mendeskripsikan infrastruktur yang diinginkan, lalu menghitung dan menjalankan langkah-langkah yang diperlukan untuk mencapai state tersebut.
Mengapa Terraform?
| Keunggulan | Penjelasan |
|---|---|
| Multi-Cloud | Bisa mengelola infrastruktur di AWS, GCP, Azure, dan 1000+ provider lainnya |
| Declarative | Cukup deskripsikan akhir state yang diinginkan, Terraform menangani cara mencapainya |
| Version Control | Infrastruktur di-version sebagai kode di Git — bisa track perubahan dan rollback |
| Reusable | Modul bisa digunakan kembali di berbagai project dan environment |
| Planning | Fitur terraform plan menunjukkan perubahan sebelum diterapkan |
| State Tracking | Terraform melacak state aktual infrastruktur dan membandingkannya dengan desired state |
| Dependency Graph | Secara otomatis menentukan urutan pembuatan resource berdasarkan dependency |
IaC vs Manual Provisioning
| Aspek | Manual (Console) | IaC (Terraform) |
|---|---|---|
| Kecepatan | 🔴 Lambat, satu per satu | 🟢 Cepat, sekaligus |
| Konsistensi | 🔴 Rentan human error | 🟢 Identik setiap kali |
| Dokumentasi | 🔴 Dokumentasi terpisah | 🟢 Kode = dokumentasi |
| Reproduksi | 🔴 Sulit mengulang | 🟢 Jalankan ulang kapan saja |
| Collaboration | 🔴 Satu orang tahu | 🟢 Semua orang bisa baca kode |
| Rollback | 🔴 Manual dan rumit | 🟢 terraform apply versi sebelumnya |
| Scalability | 🔴 Tidak practical | 🟢 Scale dengan mudah |
Install Terraform
Gunakan version constraint untuk menghindari breaking changes. Tanda ~> 5.0 berarti "gunakan versi 5.x terbaru, tetapi jangan upgrade ke 6.0". Tanda = 5.82.2 berarti "gunakan persis versi ini". Untuk production, selalu pin versi dengan ketat.
4. Resources & Data Sources
Resource adalah blok yang mendeskripsikan satu atau lebih infrastruktur objects — seperti EC2 instance, VPC, S3 bucket, atau DNS record. Data source memungkinkan Anda mengambil data dari provider yang sudah ada (bukan membuat baru) untuk digunakan dalam konfigurasi.
Resource Blocks
- JANGAN commit
*.tfstateke Git — file ini bisa berisi password, API keys, dan secrets - Tambahkan
*.tfstatedan*.tfstate.backupke.gitignore - Gunakan remote backend (S3, GCS, Terraform Cloud) dengan enkripsi untuk production
- Aktifkan state locking (DynamoDB) untuk menghindari race condition saat banyak orang apply
- Gunakan
sensitive = truepada output yang mengandung data sensitif
6. Modules
Module adalah kumpulan file Terraform (.tf) yang dikemas bersama untuk digunakan kembali. Module memungkinkan Anda mengorganisir kode, membagikannya ke tim, dan menghindari duplikasi. Setiap direktori yang berisi file .tf adalah sebuah module.
Root Module vs Child Module
/"No. STRUKTUR DIREKTORI"/
main.tf
/"variables.tf"/
/"outputs.tf"/
/"providers.tf"/
/"modules/"/
vpc/
main.tf
/"variables.tf"/
/"outputs.tf"/
ec2/
main.tf
/"variables.tf"/
/"outputs.tf"/
rds/
main.tf
/"variables.tf"/
/"outputs.tf"/
Using Modules
# Menggunakan Local Module
module "vpc" {
source = "./modules/vpc"
name_prefix = local.name_prefix
environment = var.environment
vpc_cidr = "10.0.0.0/16"
availability_zones = ["ap-southeast-1a", "ap-southeast-1b"]
public_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
private_subnets = ["10.0.10.0/24", "10.0.11.0/24"]
}
module "ec2" {
source = "./modules/ec2"
name_prefix = local.name_prefix
environment = var.environment
subnet_ids = module.vpc.public_subnet_ids
# Menggunakan output dari module VPC!
}
# Menggunakan Remote Module (Terraform Registry)
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.1.2"
name = "${local.name_prefix}-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 = {
Environment = var.environment
ManagedBy = "terraform"
}
}
# Output dari Module
output "vpc_id" {
value = module.vpc.vpc_id
}
output "public_subnets" {
value = module.vpc.public_subnet_ids
}
Best Practices untuk Modules
- Single Responsibility — Setiap module menangani satu concern (VPC, EC2, RDS)
- Parameterize — Gunakan variable untuk input yang berbeda, bukan hardcode
- Document — Tulis README.md untuk setiap module dengan usage example
- Version — Gunakan version pinning untuk remote modules
- Test — Gunakan
terratestatautflintuntuk testing module - Output — Ekspose semua informasi yang dibutuhkan caller melalui outputs
- Terraform Registry — Publish module yang reusable ke registry untuk sharing
# tflint — Terraform Linter
# Install
brew install tflint
# Run
tflint --init
tflint --recursive
# terraform validate
terraform validate
# Success! The configuration is valid.
# checkov — Security scanning
pip install checkov
checkov -d .
# terraform-docs — Generate documentation
brew install terraform-docs
terraform-docs markdown table ./modules/vpc > ./modules/vpc/README.md
Kunjungi registry.terraform.io untuk menemukan ribuan module dan provider yang sudah dibuat komunitas. Module populer seperti terraform-aws-modules/vpc sudah digunakan oleh ribuan perusahaan dan sangat teruji. Jangan reinvent the wheel — gunakan module yang sudah ada jika memungkinkan.
7. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Terraform dan Infrastructure as Code: