目标组在使用动态端口映射时经常无法通过端口 80 的健康检查并启动新实例

Target group constantly fails health check on port 80 and launches new instances when using dynamic port mapping

我有一个 ECS 集群和一个应用程序负载均衡器。我在 aws's docs.

之后为 Amazon ECS 设置了动态端口映射

问题是我的实例的端口 80 被注册为我的目标组中的目标,这总是失败(并且它会因为容器暴露在临时端口范围 32768 - 65535:

因此,我不断启动新 EC2 实例并终止现有实例的 Autoscaling 组

下面是我创建 ALB、侦听器和 target_group:

的 Tarraform 配置文件
resource "aws_alb" "default" {
  name               = "${var.app_name}-${var.app_environment}-alb"
  load_balancer_type = "application"
  internal           = true
  subnets         = var.loadbalancer_subnets
  security_groups = [aws_security_group.load_balancer_security_group.id]
}

resource "aws_lb_listener" "default" {
  load_balancer_arn = aws_alb.default.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.default.arn
  }
}

resource "aws_lb_target_group" "default" {
  name_prefix = "rushmo"
  port        = 80
  protocol    = "HTTP"
  vpc_id      = var.vpc_id
  target_type = "instance"

  health_check {
    healthy_threshold   = "2"
    unhealthy_threshold = "5"
    interval            = "300"
    port                = "traffic-port"
    path                = "/"
    protocol            = "HTTP"
    matcher             = "200,301,302"
  }

}

resource "aws_autoscaling_group" "default" {
  name             = "${var.app_name}-${var.app_environment}-ASG"
  desired_capacity = 1
  health_check_type         = "ELB"
  health_check_grace_period = 600 # 10 min
  launch_configuration      = aws_launch_configuration.default.name
  max_size                  = 1
  min_size                  = 1

  target_group_arns    = [aws_lb_target_group.default.arn]
  termination_policies = ["OldestInstance"]

  vpc_zone_identifier = var.application_subnets
  protect_from_scale_in = true
}

注意:如果我从目标组中手动注销端口 80 上的目标,则不断终止和启动新实例的问题已解决,但我不明白是什么我做错了,为什么这个端口 80 显示为注册目标,而不仅仅是临时端口范围

我认为问题是由于:

health_check_type         = "ELB"

这使得 ASG 可以在您实例的端口 80 上使用 ALB 的运行状况检查。但是,由于您使用的是 ECS,健康检查应该只用于您的容器,而不是实例本身。因此它应该是:

health_check_type         = "EC2"