Terraform và Blue/Green Deployment hoạt động như thế nào trong hệ thống thật? Chuyên mục Devops 2025-05-26 2 Lượt xem 2 Lượt thích 0 Bình luận
🎯 Mục tiêu bài viết
-
Hiểu Blue/Green Deployment là gì và tại sao nên dùng.
-
Cách thực hiện nó với ECS Fargate + CodeDeploy + ALB.
-
Tích hợp Blue/Green vào quá trình hạ tầng với Terraform.
-
Demo kiến trúc thực tế áp dụng cho môi trường dev/stage/prod.
🔍 Blue/Green Deployment là gì?
Là chiến lược triển khai ứng dụng không downtime, với hai môi trường chạy song song:
-
Blue: Phiên bản hiện tại đang phục vụ user.
-
Green: Phiên bản mới chờ sẵn, chưa nhận traffic.
Khi đã sẵn sàng, ta chuyển traffic từ Blue → Green và rollback được dễ dàng nếu có lỗi.
🧠 Lợi ích: an toàn khi deploy, rollback nhanh, không gián đoạn dịch vụ.
🏗️ Kiến trúc triển khai Blue/Green với ECS + CodeDeploy
Thành phần | Mục đích |
---|---|
ECS Cluster | Chạy task container |
ECS Service | Sử dụng deployment_controller = CODE_DEPLOY |
Application Load Balancer | Định tuyến traffic |
2 Target Groups (blue/green) | Quản lý chuyển đổi traffic |
CodeDeploy App + Deployment Group | Quản lý quá trình deploy (shift traffic, rollback, thời gian wait...) |
Jenkins Pipeline | Tự động hóa CI/CD |
🧱 Tích hợp Blue/Green vào Terraform như thế nào?
Bạn cần mở rộng các module ECS đã tạo từ bài trước để hỗ trợ Blue/Green bằng:
1. Cấu hình ECS Service
resource "aws_ecs_service" "this" {
name = "liveapp-${terraform.workspace}-service"
cluster = aws_ecs_cluster.main.id
launch_type = "FARGATE"
deployment_controller {
type = "CODE_DEPLOY"
}
load_balancer {
target_group_arn = aws_lb_target_group.blue.arn
container_name = "liveapp"
container_port = 80
}
task_definition = aws_ecs_task_definition.this.arn
desired_count = 2
network_configuration {
...
}
depends_on = [aws_lb_listener.listener]
}
2. Tạo 2 target groups: blue và green
resource "aws_lb_target_group" "blue" {
...
name = "liveapp-${terraform.workspace}-blue"
}
resource "aws_lb_target_group" "green" {
...
name = "liveapp-${terraform.workspace}-green"
}
3. CodeDeploy App & Deployment Group
resource "aws_codedeploy_app" "ecs" {
name = "liveapp-${terraform.workspace}-codedeploy"
compute_platform = "ECS"
}
resource "aws_codedeploy_deployment_group" "ecs" {
app_name = aws_codedeploy_app.ecs.name
deployment_group_name = "liveapp-${terraform.workspace}-dg"
service_role_arn = aws_iam_role.codedeploy.arn
deployment_config_name = "CodeDeployDefault.ECSAllAtOnce"
ecs_service {
cluster_name = aws_ecs_cluster.main.name
service_name = aws_ecs_service.this.name
}
load_balancer_info {
target_group_pair_info {
prod_traffic_route {
listener_arns = [aws_lb_listener.listener.arn]
}
target_group {
name = aws_lb_target_group.blue.name
}
target_group {
name = aws_lb_target_group.green.name
}
}
}
auto_rollback_configuration {
enabled = true
events = ["DEPLOYMENT_FAILURE"]
}
}
🔁 Vòng đời triển khai
-
Terraform apply tạo hạ tầng với ECS, ALB, CodeDeploy, 2 target group.
-
Jenkins/GitHub Actions gọi aws deploy để:
-
Đăng ký task mới (green)
-
CodeDeploy shift traffic từ Blue → Green
-
-
Nếu có lỗi → rollback tự động.
-
Nếu thành công → Green trở thành Blue mới.
⚙️ Triển khai thực tế
Bạn nên chia từng phần thành các module:
terraform-aws-infrastructure/
├── modules/
│ ├── ecs/
│ ├── codedeploy/
│ ├── alb/
terraform workspace new dev
terraform apply -var-file="envs/dev.tfvars"
📌 Kinh nghiệm triển khai
-
✅ Sử dụng CodeDeployDefault.ECSAllAtOnce hoặc ECSCanary10Percent5Minutes để kiểm soát traffic shift.
-
✅ Luôn dùng CloudWatch log cho ECS và Application Load Balancer để debug.
-
✅ Không hardcode ARN/Listener — luôn truyền vào module.
-
✅ Kiểm tra IAM Role codedeploy.amazonaws.com kỹ càng.
✅ Kết luận
Blue/Green với ECS + CodeDeploy kết hợp với Terraform giúp bạn:
-
Triển khai hạ tầng & CI/CD một cách bài bản.
-
Không downtime, rollback nhanh chóng.
-
Quản lý môi trường phức tạp như production dễ dàng hơn.
Bình luận (0)