Можно ли заставить развертывание Codedeploy BlueGreen на ECS использовать данные проверки работоспособности? - PullRequest
0 голосов
/ 06 февраля 2020

Я не смог этого сделать. У меня настроены проверки работоспособности в двух целевых группах моего NLB, и они сообщают о работоспособности, но развертывание произойдет и будет успешным, даже если целевая группа, на которую переключаются, никогда не станет здоровой.

Я могу использовать сигналы тревоги и сигналы на основе лямбды конечно, проверяет откат, но я не уверен, что смогу создать сигнал тревоги, который нацелен на текущую целевую группу, не обслуживающую продукт, а не на текущую группу, чтобы правильно откатить развертывание.

Кажется, что невозможно использовать что-либо кроме CodeDeployDefault.ECSAllAtOnce для ECS зеленого / синего, и я также вижу, что вообще невозможно определить минимальные исправные хосты в конфигурациях развертывания ECS, поэтому это означает, что CodeDeploy не делает учитываете состояние здоровья при развертывании ECS?

Вот моя терраформа развертывания кода:

resource "aws_codedeploy_deployment_group" "deployment_group" {
  app_name               = aws_codedeploy_app.application.name
  deployment_group_name  = "${var.project_name}-deployment-group"
  service_role_arn       = aws_iam_role.codedeploy_role.arn
  deployment_config_name = "CodeDeployDefault.ECSAllAtOnce"

  # Automatically rollback on failure, alarm, or request.
  # See: https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_AutoRollbackConfiguration.html
  auto_rollback_configuration {
    enabled = "true"
    events = ["DEPLOYMENT_FAILURE", "DEPLOYMENT_STOP_ON_ALARM", "DEPLOYMENT_STOP_ON_REQUEST"]
  }

  blue_green_deployment_config {
    # See: https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_DeploymentReadyOption.html
    deployment_ready_option {
      action_on_timeout = "CONTINUE_DEPLOYMENT"
    }

    terminate_blue_instances_on_deployment_success {
      action = "TERMINATE"

      # How many minutes to wait before terminating old instances
      termination_wait_time_in_minutes = 1
    }
  }

  # These settings are required for ECS deployments.
  deployment_style {
    deployment_option = "WITH_TRAFFIC_CONTROL"
    deployment_type   = "BLUE_GREEN"
  }

  # What to deploy
  ecs_service {
    cluster_name = aws_ecs_cluster.cluster.name
    service_name = aws_ecs_service.service.name
  }

  load_balancer_info {
    target_group_pair_info {
      # The path used by a load balancer to route production traffic when an Amazon ECS deployment is complete.
      prod_traffic_route {
        listener_arns = [aws_lb_listener.listener.arn]
      }

      # Blue group is the original group at first.
      target_group {
        name = aws_lb_target_group.blue_group.name
      }

      # Green group is the one that gets switched to at first.
      target_group {
        name = aws_lb_target_group.green_group.name
      }
    }
  }
}

А вот мои целевые группы:

resource "aws_lb_target_group" "blue_group" {
  name        = "${var.project_name}-${var.stage}-b"
  port        = 8080
  protocol    = "TCP"
  target_type = "ip"
  vpc_id = var.vpc_id

  health_check {
      path = var.nlb_healthcheck_path
      port = var.container_port
      protocol = "HTTP"
      healthy_threshold = 2
      unhealthy_threshold = 2
      interval = 10
   }

  stickiness {
      enabled = false
      type = "lb_cookie"
  }
}

resource "aws_lb_target_group" "green_group" {
  name        = "${var.project_name}-${var.stage}-g"
  port        = 8080
  protocol    = "TCP"
  target_type = "ip"
  vpc_id = var.vpc_id

  health_check {
      path = aws_lb_target_group.blue_group.health_check[0].path
      port = aws_lb_target_group.blue_group.health_check[0].port
      protocol = aws_lb_target_group.blue_group.health_check[0].protocol
      healthy_threshold = aws_lb_target_group.blue_group.health_check[0].healthy_threshold
      unhealthy_threshold = aws_lb_target_group.blue_group.health_check[0].unhealthy_threshold
      interval = aws_lb_target_group.blue_group.health_check[0].interval
   }

  stickiness {
      enabled = false
      type = "lb_cookie"
  }
}
...