Recraftory

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 existing

Modul 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.tf

Contoh 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"
}