如何使用 terraform 将负载均衡器添加到 ec2 实例

Posted

技术标签:

【中文标题】如何使用 terraform 将负载均衡器添加到 ec2 实例【英文标题】:how to add a load balancer to an ec2 instance using terraform 【发布时间】:2021-10-31 22:57:55 【问题描述】:

我正在 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 实例 是否合适?

【问题讨论】:

【参考方案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/...唯一的问题实际上是健康检查失败...必须与路径有关谢谢

以上是关于如何使用 terraform 将负载均衡器添加到 ec2 实例的主要内容,如果未能解决你的问题,请参考以下文章

使用 Terraform 关闭/打开 Elastic Beanstalk 负载均衡器?

如何在不停机的情况下更新和 ECS 服务添加一个额外的负载平衡服务与之对话?

如何在 terraform 中由 AKS 群集资源创建的虚拟机规模集或负载均衡器上启用诊断日志?

尝试创建 aws_route53_record 以指向负载均衡器,但使用 terraform 不断出现错误

terraform GCP https) 负载均衡器

使用terraform“数据”时如何重新转动多个对象?