State dan Modul
Mengelola state file dan modularisasi konfigurasi Terraform
Terraform State
Apa itu State
- File JSON yang mencatat semua resource yang dikelola
- Digunakan untuk mapping konfigurasi ke resource nyata
- Default tersimpan di
terraform.tfstate
Masalah Local State
- Sulit berkolaborasi dalam tim
- Berisiko hilang atau corrupt
- Tidak aman untuk production
Remote State Backend
S3 Backend
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "ap-southeast-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}- State disimpan di S3 dengan encryption
- DynamoDB untuk state locking (mencegah concurrent modification)
State Commands
terraform state list # Daftar semua resource
terraform state show aws_instance.web # Detail satu resource
terraform state rm aws_instance.web # Hapus dari state (tidak menghapus resource)
terraform import aws_instance.web i-123 # Import resource existingModul Terraform
Konsep Modul
- Sebuah direktori dengan file .tf yang mengelompokkan resource
- Reusable dan parameterizable
- Seperti fungsi dalam pemrograman
Struktur Modul
modules/
└── vpc/
├── main.tf
├── variables.tf
└── outputs.tfContoh Modul VPC
modules/vpc/main.tf
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
tags = {
Name = var.vpc_name
}
}
resource "aws_subnet" "public" {
count = length(var.availability_zones)
vpc_id = aws_vpc.main.id
cidr_block = cidrsubnet(var.vpc_cidr, 8, count.index)
availability_zone = var.availability_zones[count.index]
}modules/vpc/variables.tf
variable "vpc_cidr" {
type = string
}
variable "vpc_name" {
type = string
}
variable "availability_zones" {
type = list(string)
}modules/vpc/outputs.tf
output "vpc_id" {
value = aws_vpc.main.id
}
output "subnet_ids" {
value = aws_subnet.public[*].id
}Menggunakan Modul
module "vpc" {
source = "./modules/vpc"
vpc_cidr = "10.0.0.0/16"
vpc_name = "production"
availability_zones = ["ap-southeast-1a", "ap-southeast-1b"]
}
output "vpc_id" {
value = module.vpc.vpc_id
}Public Registry
Terraform memiliki registry publik dengan modul terverifikasi:
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
}