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-approvengay 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ụ.