Quay lại

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    comment-3 Created with Sketch Beta. 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 → Greenrollback đượ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

  1. Terraform apply tạo hạ tầng với ECS, ALB, CodeDeploy, 2 target group.

  2. Jenkins/GitHub Actions gọi aws deploy để:

    • Đăng ký task mới (green)

    • CodeDeploy shift traffic từ Blue → Green

  3. Nếu có lỗi → rollback tự động.

  4. 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/
Các môi trường sử dụng workspace:
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)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday