Dasar
Alur Kerja Inti
terraform init # install providers & modules terraform plan # preview changes terraform apply # apply changes terraform destroy # tear down all resources
Perintah Esensial
terraform initInisialisasi direktori kerja, unduh provider
terraform planTampilkan rencana eksekusi tanpa menerapkan
terraform applyTerapkan perubahan ke infrastruktur
terraform destroyHancurkan semua resource yang dikelola
terraform fmtFormat file .tf ke gaya kanonik
terraform validatePeriksa sintaks konfigurasi
terraform showTampilkan state atau rencana saat ini
terraform outputCetak nilai output
Provider
Konfigurasi Provider
terraform { required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } } } provider "aws" { region = "us-east-1" }
Catatan Provider
sourceAlamat registry (hashicorp/aws, hashicorp/google)
versionBatasan versi (~> 5.0, >= 3.0, < 4.0)
.terraform.lock.hclLock file — commit ke version control
aliasGunakan beberapa konfigurasi untuk provider yang sama
Resource
Blok Resource
resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t3.micro" tags = { Name = "web-server" } }
Meta-Argumen Resource
depends_onDependensi eksplisit pada resource lain
countBuat beberapa instance (count = 3)
for_eachBuat instance dari map atau set
providerPilih alias provider non-default
lifecycleSesuaikan perilaku buat/perbarui/hancurkan
Merujuk Resource
# type.name.attribute aws_instance.web.id aws_instance.web.public_ip aws_vpc.main.cidr_block
Variabel
Deklarasi Variabel
variable "region" { type = string default = "us-east-1" } variable "instance_count" { type = number description = "Number of instances" }
Mengatur Nilai Variabel
-var 'region=us-west-2'Flag CLI
-var-file=prod.tfvarsMuat dari file .tfvars
terraform.tfvarsDimuat otomatis jika ada
TF_VAR_regionVariabel environment
Interactive promptDitanyakan saat plan/apply jika tidak ada default
Tipe Variabel
string"us-east-1"
number42
booltrue / false
list(string)["a", "b"]
map(string){ key = "val" }
object({...})Tipe terstruktur dengan atribut bernama
Output
Mendefinisikan Output
output "instance_ip" { value = aws_instance.web.public_ip description = "Public IP of the web server" } output "db_password" { value = random_password.db.result sensitive = true }
Perintah Output
terraform outputCetak semua output
terraform output instance_ipCetak output tertentu
terraform output -jsonFormat JSON untuk scripting
sensitive = trueSembunyikan nilai dari output CLI
module.vpc.vpc_idAkses output modul anak
State
Remote Backend
terraform { backend "s3" { bucket = "my-tf-state" key = "prod/terraform.tfstate" region = "us-east-1" } }
Perintah State
terraform state listTampilkan semua resource dalam state
terraform state show <addr>Tampilkan atribut resource
terraform state mv <src> <dst>Ganti nama / pindahkan resource dalam state
terraform state rm <addr>Hapus resource dari state (infra tetap ada)
terraform state pullUnduh state remote ke stdout
terraform import <addr> <id>Impor infra yang sudah ada ke state
Modul
Menggunakan Modul
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" cidr = "10.0.0.0/16" }
Sumber Modul
"./modules/vpc"Path lokal
"terraform-aws-modules/vpc/aws"Terraform Registry
"github.com/org/repo//module"Repository GitHub
"s3::https://bucket/module.zip"S3 bucket
Struktur Modul
modules/vpc/ main.tf # resources variables.tf # input variables outputs.tf # output values
Data Source
Membaca Resource yang Ada
data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/*"] } owners = ["099720109477"] }
Data Source Umum
data.aws_amiCari AMI berdasarkan filter
data.aws_vpcCari VPC yang sudah ada
data.aws_caller_identityID akun AWS saat ini
data.aws_regionRegion AWS saat ini
data.terraform_remote_stateBaca output dari file state lain
data.externalJalankan program eksternal untuk data
Lifecycle
Aturan Lifecycle
resource "aws_instance" "web" { lifecycle { create_before_destroy = true prevent_destroy = true ignore_changes = [tags] } }
Opsi Lifecycle
create_before_destroyBuat pengganti sebelum menghancurkan yang lama
prevent_destroyError jika terraform destroy menarget ini
ignore_changesJangan deteksi drift pada atribut yang terdaftar
replace_triggered_byPaksa penggantian ketika resource yang dirujuk berubah
preconditionValidasi asumsi sebelum apply
postconditionValidasi hasil setelah apply
Pola Umum
Loop & Kondisional
# for_each with a map resource "aws_iam_user" "users" { for_each = toset(["alice", "bob"]) name = each.value } # conditional resource count = var.create_db ? 1 : 0
Fungsi Berguna
file("key.pub")Baca isi file
join(", ", list)Gabungkan list menjadi string
lookup(map, key, default)Pencarian map dengan fallback
length(list)Jumlah elemen
toset(["a", "b"])Ubah list ke set (untuk for_each)
try(expr, fallback)Kembalikan fallback jika expr error
templatefile(path, vars)Render file template