Infrastructure as Code dengan Terraform
Mengelola infrastruktur secara deklaratif dengan Terraform: provider, state, plan, module, variable, dan remote backend.
Terraform mendefinisikan infrastruktur sebagai kode deklaratif. Anda menyatakan kondisi yang diinginkan, lalu Terraform menghitung langkah untuk mencapainya.
Konsep utama
| Konsep | Arti |
|---|---|
| Provider | Plugin untuk platform (Proxmox, AWS, Cloudflare) |
| Resource | Objek yang dikelola (VM, network, DNS) |
| State | Catatan kondisi infrastruktur |
| Plan | Rencana perubahan |
| Apply | Eksekusi perubahan |
| Module | Kumpulan resource reusable |
| Variable | Input konfigurasi |
| Output | Nilai hasil |
Alur kerja
terraform init
terraform fmt
terraform validate
terraform plan -out=tfplan
terraform apply tfplan
terraform destroySelalu review plan sebelum apply.
Struktur project
terraform/
├─ main.tf
├─ variables.tf
├─ outputs.tf
├─ providers.tf
├─ backend.tf
├─ terraform.tfvars
└─ modules/
└─ vm/
├─ main.tf
├─ variables.tf
└─ outputs.tfProvider Proxmox
terraform {
required_version = ">= 1.8"
required_providers {
proxmox = {
source = "bpg/proxmox"
version = "~> 0.66"
}
}
}
provider "proxmox" {
endpoint = var.proxmox_endpoint
api_token = var.proxmox_token
insecure = true
}Jangan simpan token di file yang di-commit. Gunakan environment variable atau secret manager.
Resource VM
resource "proxmox_virtual_environment_vm" "web" {
name = "web-01"
node_name = "pve"
vm_id = 110
clone {
vm_id = 9000
}
cpu {
cores = 2
}
memory {
dedicated = 2048
}
network_device {
bridge = "vmbr0"
}
}Variable dan output
variables.tf:
variable "proxmox_endpoint" {
type = string
sensitive = true
}
variable "proxmox_token" {
type = string
sensitive = true
}
variable "vm_count" {
type = number
default = 1
}outputs.tf:
output "vm_ids" {
value = [for vm in proxmox_virtual_environment_vm.web : vm.vm_id]
}Module
modules/vm/main.tf:
variable "name" { type = string }
variable "cores" { type = number }
variable "memory" { type = number }
resource "proxmox_virtual_environment_vm" "this" {
name = var.name
node_name = "pve"
cpu { cores = var.cores }
memory { dedicated = var.memory }
}Pemakaian:
module "app" {
source = "./modules/vm"
name = "app-01"
cores = 2
memory = 2048
}State
State menyimpan pemetaan resource ke infrastruktur nyata.
- Jangan commit state ke Git (bisa berisi data sensitif).
- Gunakan remote backend dengan locking.
- Backup state.
Contoh backend S3:
terraform {
backend "s3" {
bucket = "org-terraform-state"
key = "devops/proxmox.tfstate"
region = "ap-southeast-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}Untuk Proxmox, state bisa disimpan di S3/MinIO atau backend lain yang mendukung locking.
State adalah sumber kebenaran
Kehilangan state membuat Terraform tidak tahu resource mana yang sudah ada. Selalu gunakan backend remote dan backup.
Workspace dan environment
terraform workspace new staging
terraform workspace new production
terraform workspace select production
terraform planAtau pisahkan direktori/state per environment agar isolasi lebih jelas.
Drift
Drift terjadi saat infrastruktur berubah di luar Terraform.
terraform plan -refresh-only
terraform apply -refresh-onlyJangan biarkan perubahan manual permanen; kembalikan ke kode atau perbarui kode.
Rahasia
- Tandai variable
sensitive = true. - Gunakan environment variable
TF_VAR_*. - Simpan state di storage terenkripsi.
- Gunakan secret manager untuk kredensial.
- Jangan menaruh token di output.
Praktik: provisioning VM
- Siapkan token API Proxmox.
- Buat template VM.
- Tulis konfigurasi provider dan resource.
terraform init.terraform plandan review.terraform apply.- Verifikasi VM di Proxmox.
- Simpan state remote.
Ringkasan
- Terraform mengelola infrastruktur deklaratif dan idempotent.
- Plan sebelum apply; review perubahan.
- State harus remote, terkunci, dan terbackup.
- Module dan variable membuat konfigurasi reusable.
- Rahasia tidak boleh masuk kode/state terbuka.
Selanjutnya
Konfigurasi server di Server Automation dengan Ansible.