You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ELB健康检查失败排查求助:附Terraform配置及安全组代码

ELB健康检查失败排查方案

问题描述

实例持续出现ELB健康检查失败,控制台目标组Targets中仅显示状态为unhealthy,详情仅提示health checks failed,无法获知具体失败原因,导致实例不断被重新部署。相关Terraform配置如下:

main.tf配置

resource "aws_lb" "jira-alb" {
  name               = "jira-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.jira_clb_sg.id]
  subnets            = [var.public_subnet_ids[0], var.public_subnet_ids[1]]

  enable_deletion_protection = false

  access_logs {
    bucket   = aws_s3_bucket.this.id
    enabled  = true
  }

  tags = {
    Environment = "production"
  }
}

resource "aws_lb_target_group" "jira" {
  name     = "jira-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = var.vpc_id

  health_check {
    enabled = true
    healthy_threshold = 10
    unhealthy_threshold = 5
    interval = 30
    timeout = 5
    path = "/index.html"
  }

stickiness {
  type = "lb_cookie"
  cookie_duration = 1 ## CANT BE 0.. RANGES FROM 1-604800
}
}

resource "aws_lb_listener" "jira-listener" {

  port            = 443
  protocol        = "HTTPS"
  ssl_policy      = "ELBSecurityPolicy-TLS-1-2-2017-01"
  load_balancer_arn = aws_lb.jira-alb.arn
  certificate_arn = data.aws_acm_certificate.this.arn ##TODO Change to a variable

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

resource "aws_autoscaling_group" "this" {
  vpc_zone_identifier       = var.subnet_ids
  health_check_grace_period = 300
  health_check_type         = "ELB"
  force_delete              = true
  desired_capacity          = 2
  max_size                  = 2
  min_size                  = 2
  target_group_arns = [aws_lb_target_group.jira.arn]

  timeouts {
    delete = "15m"
  }

  launch_template {
    id      = aws_launch_template.this.id
    version = aws_launch_template.this.latest_version
  }

  instance_refresh {
    strategy = "Rolling"
    preferences {
      min_healthy_percentage = 50
    }
  }
}

security_groups.tf配置

resource "aws_security_group" "jira_clb_sg" {
  description = "Allow-Veracode-approved-IPs from external to elb"
  vpc_id      = var.vpc_id

  tags = {
    Name      = "public-elb-sg-for-jira"
    Project   = "Jira Module"
    ManagedBy = "terraform"
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = var.veracode_ips
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = -1
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_security_group" "jira_sg" {
  description = "Allow-Traffic-From-CLB"
  vpc_id      = var.vpc_id

  tags = {
    Name      = "allow-jira-public-clb-sg"
    Project   = "Jira Module"
    ManagedBy = "terraform"
  }

  ingress {
    from_port       = 0
    to_port         = 0
    protocol        = -1
    security_groups = [aws_security_group.jira_clb_sg.id]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = -1
    cidr_blocks = ["0.0.0.0/0"]
  }
}

负载均衡器仅允许Veracode授权IP的443端口流量,自动扩缩容组实例允许来自负载均衡器安全组的所有端口流量。

排查步骤

1. 校验健康检查基础配置与实例服务匹配度

  • 确认实例内部服务在80端口监听:登录实例执行netstat -tulpn | grep :80,检查是否有进程占用目标端口。若Jira实际运行在默认8080端口,目标组port配置错误会直接导致检查失败。
  • 验证健康检查路径可用性:在实例内部执行curl http://localhost:80/index.html,确认返回2xx状态码。若路径不存在、服务未启动或返回4xx/5xx,都会触发不健康标记。

2. 排查网络连通性问题

  • 安全组与抓包验证:虽然实例安全组允许负载均衡器流量,可在实例上执行tcpdump -i any port 80 and host <ELB健康检查IP>(健康检查IP可从VPC前缀列表com.amazonaws.<region>.elb获取),确认是否收到ELB的检查请求。
  • 子网路由与网络ACL:若实例在私有子网,确认路由表指向NAT网关;若为公有子网,确认实例有公网IP且网络正常。同时检查VPC/子网的网络ACL,需同时放行80端口入站和1024-65535端口出站流量(无状态规则)。

3. 从ELB访问日志提取详细失败信息

你的负载均衡器已开启访问日志,直接前往对应S3 Bucket下载最新日志文件,日志中会记录:

  • 健康检查请求的源IP、目标实例IP
  • 返回的HTTP状态码(如404、502、连接超时)
  • 响应时间
    通过这些信息可直接定位是请求被拒、路径不存在还是服务无响应。

4. 调整健康检查参数缩小排查范围

  • 临时降低healthy_threshold(如改为2)和interval(如改为10),减少测试等待时间。
  • 更换健康检查路径为服务原生端点(如Jira的/status),避免/index.html非服务默认页面导致404。
  • 显式配置matcher参数(默认200-399),若服务返回状态码不在此区间,需调整为匹配实际返回的状态码范围(如matcher = "200-299")。

5. 验证自动扩缩容组健康检查配置

  • 确认health_check_grace_period(当前300秒)足够服务启动:若Jira启动时间超过5分钟,实例未就绪就被触发检查,会直接标记为不健康并重新部署,可临时延长至600秒测试。
  • 检查启动模板用户数据:查看实例系统日志(CloudWatch Logs或/var/log/cloud-init.log),确认初始化脚本(安装Jira、启动服务)是否执行成功。

内容的提问来源于stack exchange,提问作者Legion_of_boom__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:40:31