Blue/green giải quyết điều gì?
blue là phiên bản đang phục vụ traffic; green là phiên bản mới. Thay vì replace trực tiếp một ASG, ta dựng green song song, chạy health check/smoke test, rồi đổi listener hoặc target group. Nếu green lỗi, chuyển traffic về blue.
ALB listener -> target group blue (đang nhận traffic)
-> target group green (đang kiểm tra)
Module nên tách base và application
Module base có VPC, ALB, security group và listener. Module application nhận color và tạo launch template/ASG tương ứng:
module "blue" {
source = "./modules/app"
color = "blue"
ami_id = var.blue_ami_id
target_group = module.base.blue_target_group_arn
}
module "green" {
source = "./modules/app"
color = "green"
ami_id = var.green_ami_id
target_group = module.base.green_target_group_arn
}
color phải nằm trong tên/identity để Terraform không nhầm hai nhóm. Tránh dùng một biến boolean rồi mutate cùng resource nếu mục tiêu là giữ cả hai phiên bản cùng tồn tại.
Cutover
Một cách chuyển traffic là thay default action của listener:
resource "aws_lb_listener" "http" {
load_balancer_arn = aws_lb.app.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
forward {
target_group { arn = var.active_target_group_arn }
}
}
}
Thực tế có thể dùng weighted target groups để chuyển dần 1% -> 10% -> 100%, hoặc dùng một hệ thống release riêng điều khiển cutover. Terraform là công cụ quản lý desired state; đừng nhét toàn bộ health-check loop phức tạp vào terraform apply.
Checklist rollback
- Green có endpoint kiểm tra riêng.
- Health check kiểm tra dependency thật, không chỉ trả HTTP 200 giả.
- DB migration tương thích với cả blue và green.
- Có người chịu trách nhiệm quyết định cutover.
- Blue chưa bị destroy ngay sau apply green.
- Có metric và log để xác định rollback.
Runbook cutover 10 phút
- Apply green với image/version mới, chưa đổi listener.
- Gọi health endpoint và smoke test qua target group green.
- Kiểm tra error rate, latency, log và dependency như database/queue.
- Chuyển 1% hoặc 10% traffic nếu hệ thống hỗ trợ weighted forward.
- Theo dõi trong một khoảng thời gian đã thống nhất rồi mới lên 100%.
- Giữ blue đủ lâu cho rollback; chỉ destroy khi release đã ổn định.
Nếu dùng Terraform để đổi active_color, hãy để thay đổi đó nhỏ và dễ rollback. Đừng cùng một apply vừa đổi AMI, schema database, listener và xóa blue; blast radius quá lớn và khó xác định nguyên nhân khi lỗi.
Bản chuyển thể từ Terraform Blue/Green Deployment.