Я не смог этого сделать. У меня настроены проверки работоспособности в двух целевых группах моего 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"
}
}