← Tổng quan series

Workspace và file cấu hình Terraform

Tạo một project Terraform có version pinning, chạy plan/apply có kiểm soát và hiểu data source trong một cấu hình thực tế.

Một workspace nhỏ nhưng đúng chuẩn

Một thư mục Terraform thường là một root module: nơi chứa các file .tf và là nơi ta chạy lệnh. Terraform đọc tất cả file .tf trong thư mục, vì vậy có thể tách versions.tf, provider.tf, main.tf, variables.tf để dễ đọc; không cần import giữa các file.

infra-dev/
├── versions.tf
├── provider.tf
├── main.tf
└── .gitignore

versions.tf nên khóa provider để máy local và CI không tự kéo phiên bản khác nhau:

terraform {
  required_version = ">= 1.9.0, < 2.0.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.0"
    }
  }
}

Vòng đời một lần thay đổi

terraform init       # tải provider, khởi tạo backend
terraform fmt -check # CI kiểm tra format
terraform validate   # kiểm tra cú pháp và kiểu
terraform plan       # xem dự kiến thay đổi
terraform apply      # thực thi plan

plan không chỉ để “xem cho biết”. Hãy lưu plan trong CI để bước apply dùng đúng thứ đã review:

terraform plan -out=tfplan
terraform show -no-color tfplan
terraform apply tfplan

Không nên lưu tfplan vào artifact công khai vì nó có thể chứa dữ liệu nhạy cảm.

Ví dụ cấu hình có input và data source

variable "aws_region" {
  type    = string
  default = "ap-southeast-1"
}

provider "aws" {
  region = var.aws_region
}

data "aws_availability_zones" "available" {
  state = "available"
}

resource "aws_vpc" "main" {
  cidr_block           = "10.20.0.0/16"
  enable_dns_hostnames = true

  tags = { Name = "demo-vpc" }
}

data không tạo availability zone mới; nó truy vấn danh sách AWS đang có. Khi một resource tham chiếu aws_vpc.main.id, Terraform tự hiểu dependency và tạo VPC trước.

Những lỗi người mới hay gặp

  • Chạy Terraform ở sai thư mục nên không thấy file cấu hình.
  • Không commit .terraform.lock.hcl: file này nên commit để khóa checksum provider.
  • Hard-code AMI ID từ region khác. Hãy dùng data "aws_ami" hoặc biến theo môi trường.
  • Dùng apply -auto-approve ngay từ lần đầu, bỏ qua plan.

.gitignore tối thiểu:

.terraform/
*.tfstate
*.tfstate.*
tfplan
*.tfvars
!example.tfvars

Một plan tốt phải trả lời được ba câu hỏi

Trước khi approve, hãy chỉ ra được: resource nào sẽ đổi, vì sao nó đổi và tác động có thể là gì. Với thay đổi có nguy cơ recreate, dùng thêm:

terraform show -json tfplan > tfplan.json

File JSON phù hợp cho policy checker, nhưng không nên upload công khai. Trong code review, hãy yêu cầu người viết nêu rõ nếu plan có destroy, replace, thay đổi security group hoặc thay đổi database.

Nếu terraform init báo provider lock không khớp, không xóa .terraform.lock.hcl để chữa cháy. Kiểm tra Terraform version, architecture runner và chạy terraform providers lock theo quy trình của team.

Bản này diễn giải lại theo hướng lab; xem bài nguồn DevOps VN để đối chiếu toàn bộ ví dụ.