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__
相关产品推荐
相关产品推荐

