【问题标题】:how to add a load balancer to an ec2 instance using terraform如何使用 terraform 将负载均衡器添加到 ec2 实例
【发布时间】:2026-01-06 03:25:01
【问题描述】:

我正在 ec2 实例 中进行开发,我刚刚使用 terraform负载均衡器 添加到 ec2 但是现在,当我尝试访问 负载平衡器 dns 地址时,我在浏览器上收到 504 Gateway Time-out 错误消息,我还注意到 目标组 不健康,因此运行状况检查失败。

我有以下load balancer 配置:

resource "aws_lb" "alb" {
  name               = "backend-lb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.lb_sg.id]
  idle_timeout       = 60
  subnets            = [element(aws_subnet.public.*.id, 0), element(aws_subnet.public.*.id, 1)]
}

resource "aws_lb_target_group" "alb_target_group" {
  name        = "backend-tg"
  port        = 8000
  protocol    = "HTTP"
  target_type = "ip"
  vpc_id      = aws_vpc.main.id

  health_check {
    enabled = true
    path = "/"
    port = "8000"
    protocol = "HTTP"
    healthy_threshold = 3
    unhealthy_threshold = 2
    interval = 90
    timeout = 20
    matcher = "200"
  }

  depends_on = [aws_lb.alb]
}

resource "aws_lb_listener" "http" {
  load_balancer_arn = aws_lb.alb.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.alb_target_group.arn

  }
}

resource "aws_lb_target_group_attachment" "one" {
  target_group_arn = aws_lb_target_group.alb_target_group.arn
  target_id        = aws_instance.ec2.private_ip
  port             = 8000
}

请注意我在aws_lb_target_group_attachment target_id 中使用了.private_ip,因为我在尝试使用.id.arn 时遇到了错误Error: Error registering targets with target group: ValidationError: The IP address '....foo id or arn' is not a valid IPv4 address

我在这里做错了什么,将 负载均衡器 添加到 ec2 实例 是否合适?

【问题讨论】:

    标签: amazon-web-services amazon-ec2 terraform cloud load-balancing


    【解决方案1】:

    首先您需要修复aws_lb_target_group 中的target_type。将其从 ip 更改为 instance。或者只是删除该设置,因为 instance 是默认设置。

    那么目标 ID 应该是实例的 ID,而不是 IP 地址。代码应该是:

    target_id        = aws_instance.ec2.id
    

    之后,如果仍然无法正常工作,您需要验证 EC2 实例的安全组是否允许负载均衡器在端口 8000 上进入,EC2 实例上的该软件实际上正在侦听端口上的 Web 请求8000,并且 EC2 实例的端口 8000 上的 HTTP GET 请求返回状态码 200

    【讨论】:

    • 嘿,马克 B,也许你对它为什么不工作有更好的了解,当我在浏览器上检查负载均衡器的 dns 时,确实安全组正在监听端口 8000一个Not Found: The requested resource was not found on this server,当我将所有值8000 更改为80 时,我得到一个502 error。您上面提到的所有步骤都在我的代码中进行了更新。我可以使用端口8000 上的 ec2 公共 IPv4 地址,ec2 工作正常,但负载均衡器和运行状况检查不能。有什么想法吗?
    • 您需要将这些目标组和健康检查设置更改回端口8000。未找到错误听起来像是您在 EC2 服务器上运行的软件未将请求正确路由到您的网站,因为它不知道如何处理 DNS 名称。
    • 是的,你是对的,我只是忘记访问正确的 url loadbalancerDNS/api/...唯一的问题实际上是健康检查失败...必须与路径有关谢谢