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

配置ALB后EC2无法访问的技术求助

排查ALB配置后域名无法访问的问题

我有一台运行Docker容器的EC2实例,用于提供静态Web应用服务。原本域名直接指向EC2时,80端口可正常访问,但配置ALB负责SSL终止后,域名完全无法访问。期望的流程是:域名请求转发到ALB,ALB处理HTTPS连接,再通过HTTP 80端口转发到EC2。以下是我的Terraform配置:

DNS.tf

resource "aws_route53_zone" "main" {
  name = var.domain_name
}

resource "aws_route53_record" "www" {
  zone_id = aws_route53_zone.main.zone_id
  name    = "www.${var.domain_name}"
  type    = "A"
 // ttl     = "300"
 // records = [aws_lb.resume-app-application-load-balancer.dns_name]
  depends_on = [aws_lb.resume-app-application-load-balancer]

    alias {
    name                   = aws_lb.resume-app-application-load-balancer.dns_name
    zone_id                = aws_lb.resume-app-application-load-balancer.zone_id
    evaluate_target_health = true
  }
}

resource "aws_route53_record" "root" {
  zone_id = aws_route53_zone.main.zone_id
  name    = var.domain_name
  type    = "A"
 // ttl     = "300"
 // records = [aws_lb.resume-app-application-load-balancer.dns_name]
  depends_on = [aws_lb.resume-app-application-load-balancer]

    alias {
    name                   = aws_lb.resume-app-application-load-balancer.dns_name
    zone_id                = aws_lb.resume-app-application-load-balancer.zone_id
    evaluate_target_health = true
  }
}

resource "aws_route53_record" "example" {
  for_each = {
    for dvo in aws_acm_certificate.resume-app-cert.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      record = dvo.resource_record_value
      type   = dvo.resource_record_type
    }
  }

  allow_overwrite = true
  name            = each.value.name
  records         = [each.value.record]
  ttl             = 60
  type            = each.value.type
  zone_id         = aws_route53_zone.main.zone_id
}

ALB.tf

resource "aws_lb" "resume-app-application-load-balancer" {
  name               = var.resume-app-application-load-balancer-name
  internal           = false
  load_balancer_type = "application"
  subnets            = [aws_subnet.resume-app-public-subnet.id, aws_subnet.resume-app-public-subnet2.id] # 2 subnets minimum

  depends_on = [aws_acm_certificate_validation.resume-app-cert]
}

ALB_LISTENER.tf

# Create a listener on port 443 for HTTPS traffic
resource "aws_lb_listener" "resume-app-application-load-balancer-listener" {
  load_balancer_arn = aws_lb.resume-app-application-load-balancer.arn
  port              = 443
  protocol          = "HTTPS"
  
  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = aws_acm_certificate.resume-app-cert.arn
  
  default_action {
    target_group_arn = aws_lb_target_group.resume-app-application-load-balancer-target-group.arn
    type             = "forward"
  }

  depends_on = [aws_acm_certificate_validation.resume-app-cert]
}

ALB_TARGET_GROUP.tf

resource "aws_lb_target_group" "resume-app-application-load-balancer-target-group" {
  name     = var.resume-app-application-load-balancer-target-group-name
  port     = 80 # Port on which EC2 instance listens
  protocol = "HTTP"
  vpc_id   = aws_vpc.resume-app-vpc.id

  health_check {
    path                = "/"
    port                = 80
    protocol            = "HTTP"
    interval            = 30
    timeout             = 10
    healthy_threshold   = 2
    unhealthy_threshold = 2
  }
}

ACM + ACM VALIDATION.tf

resource "aws_acm_certificate" "resume-app-cert" {
  domain_name       = var.domain_name
  validation_method = "DNS"

  tags = {
    Name = "resume-app-ssl-cert"
  }
}

resource "aws_acm_certificate_validation" "resume-app-cert" {
  certificate_arn         = aws_acm_certificate.resume-app-cert.arn
  validation_record_fqdns = [for record in aws_route53_record.example : record.fqdn]
}

SECURITY_GROUP.tf

resource "aws_security_group" "resume-app-security-group" {
  name        = var.security_group_name
  description = "Allow HTTP and HTTPS traffic for inbound and outbound connections to the web app."
  vpc_id      = aws_vpc.resume-app-vpc.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = var.cidr_ingress_80
  }

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

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = var.cidr_ingress_22
  }

  ingress {
    from_port   = -1
    to_port     = -1
    protocol    = "icmp"
    cidr_blocks = var.cidr_ingress_icmp
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = var.cidr_egress_protocol
    cidr_blocks = var.cidr_egress_ips
  }
}

排查与修复建议

1. 目标组未关联EC2实例

你的aws_lb_target_group仅定义了规则,但没有将EC2实例添加到目标组中,ALB无法识别后端服务地址。需要添加实例关联资源:

resource "aws_lb_target_group_attachment" "resume-app-ec2-attachment" {
  target_group_arn = aws_lb_target_group.resume-app-application-load-balancer-target-group.arn
  target_id        = aws_instance.your-ec2-resource.id # 替换为你的EC2实例资源ID
  port             = 80
}

2. 缺失HTTP端口监听

当前ALB仅配置了443端口的HTTPS监听,没有处理80端口的HTTP请求。用户直接用HTTP访问域名会失败,建议添加HTTP到HTTPS的重定向监听:

resource "aws_lb_listener" "resume-app-http-redirect" {
  load_balancer_arn = aws_lb.resume-app-application-load-balancer.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"
    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

3. 安全组需允许ALB访问EC2的80端口

确认EC2实例已绑定resume-app-security-group,且该安全组的80端口 ingress规则允许ALB所在VPC的子网IP段访问。如果var.cidr_ingress_80设置为0.0.0.0/0则没问题,否则需添加ALB子网的CIDR。

4. 检查目标组健康状态

Route53别名记录开启了evaluate_target_health = true,若目标组中EC2实例健康检查失败,Route53会停止解析域名到ALB。需验证:

  • EC2上的Docker容器正常运行,80端口映射正确
  • 健康检查路径/返回200状态码
  • EC2安全组允许ALB的健康检查流量(默认来自VPC内部IP)

5. 确认ACM证书已完成验证

登录AWS ACM控制台,检查证书状态是否为已颁发。若DNS验证未完成,ALB的HTTPS监听无法正常工作,导致HTTPS访问失败。可通过Route53控制台确认验证记录是否正确生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:25:56