Terraform cho người mới — Quản lý hạ tầng bằng code từ số 0
Bạn vẫn mở AWS Console click click để dựng server à? Hôm nay tôi chỉ cho mấy anh cách quản lý hạ tầng bằng code với Terraform — vừa nhanh, vừa lặp lại được, mà còn review được trên Git.
Infrastructure as Code là gì?
Đơn giản là bạn viết cấu hình server, network, database dưới dạng file văn bản thay vì bấm nút trên web. Hạ tầng giờ là code: lưu được Git, review được như pull request, rollback được khi lỡ tay phá.
Terraform của HashiCorp là ông vua trong mảng này. Nó nói chuyện với cloud provider qua "provider" (AWS, GCP, DigitalOcean...) và lưu trạng thái vào file tfstate.
Cấu trúc cơ bản
provider "aws" {
region = "ap-southeast-1"
}
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "lumiblog"
}
}
Ba lệnh bạn phải nằm lòng:
terraform init— tải provider, chuẩn bị môi trường.terraform plan— xem Terraform SẼ làm gì, không làm gì hết. An toàn tuyệt đối.terraform apply— thực thi. Nó sẽ hỏi xác nhận trước đó.
State file — con dao hai lưỡi
File terraform.tfstate ghi lại toàn bộ hạ tầng hiện có. Nếu mất file này, Terraform "quên" anh đang có cái gì, lần apply sau sẽ tạo trùng hoặc xóa nhầm.
Kinh nghiệm thực tế của tôi: luôn chạy state trên remote, đừng để trên máy local. Dùng backend S3:
terraform {
backend "s3" {
bucket = "lumi-tfstate"
key = "prod/terraform.tfstate"
region = "ap-southeast-1"
}
}
Và nhớ bật versioning + lock trên bucket. Team nào cũng vậy, hai người cùng apply là tèo.
Biến và output
Đừng hardcode mọi thứ. Dùng biến để dùng lại được:
variable "instance_type" {
description = "Loại instance"
default = "t3.micro"
}
resource "aws_instance" "web" {
instance_type = var.instance_type
}
output "public_ip" {
value = aws_instance.web.public_ip
}
terraform output public_ip lấy IP nhanh gọn, tiện cho mấy script deploy.
Module — nhân lên tới N lần
Khi dựng đi dựng lại cùng một cấu trúc (staging, production), hãy gói thành module:
module "app" {
source = "./modules/vm"
name = each.key
instance_type = "t3.small"
}
Thay vì copy-paste 50 dòng config, gọi module một dòng. Rồi mấy môi trường giống chang, chém một chỗ là sync hết.
Vài mẹo tôi đúc kết được
- Đặt tên resource có nghĩa — tên xấu làm state khó đọc, đổi tên là đau đầu.
- Chạy
terraform plantrước mọiapply— cái đồng nghiệp cũ lười, giờ deploy gãy. - Dùng workspaces hoặc thư mục riêng cho từng môi trường, đừng trộn staging với production chung state.
- Lock version của provider (
required_version) — provider nâng cấp bất ngờ là hạ tầng teo.
Terraform không khó, chỉ cần kỷ luật. Bắt đầu từ hôm nay để mai này hạ tầng của anh "tự biến mất và tái sinh" chỉ với một dòng lệnh. Anh làm code rồi, làm hạ tầng bằng code cũng thấy quen thôi!