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

Terraform部署ALB+ASG架构出现504错误的排查求助

排查Terraform搭建AWS ALB 504超时错误的方案

咱们先从你的配置里几个核心问题入手,这些大概率就是导致504 Gateway Timeout的原因:

1. 目标组端口与EC2实际服务端口不匹配

你的ALB目标组tg-alb配置的是监听80端口,但EC2上的Docker容器是把应用映射到了8080端口(-p 8080:8080)。ALB一直往EC2的80端口发请求,但这个端口根本没有服务在监听,自然会超时。

2. EC2安全组未正确允许ALB的流量访问8080端口

你给EC2安全组设置的入站规则只允许10.0.1.0/24和10.0.2.0/24这两个子网访问8080端口,但如果ALB所在的子网不是这两个(或者ALB的弹性IP不在这个范围内),请求根本到不了EC2的应用服务。而且用固定CIDR不如直接引用ALB的安全组更可靠,因为ALB的IP可能会变化。

3. 缺少目标组健康检查配置(或健康检查端口错误)

默认情况下,ALB目标组的健康检查会使用和目标组一致的端口(也就是你配置的80端口),但EC2的80端口没有服务,所以健康检查会失败,ALB会认为这些实例不可用,不会转发流量,最终导致504。


修复方案

下面是针对上述问题的代码修改:

修正目标组配置(调整端口+添加健康检查)

resource "aws_alb_target_group" "tg-alb" {
 name = "tg-alb"
 port = 8080  # 改为EC2实际监听的8080端口
 protocol = "HTTP"
 target_type = "instance"
 vpc_id = aws_vpc.final-vpc.id

 # 添加健康检查,确保和服务端口一致
 health_check {
   path = "/"  # 根据你的应用实际健康检查路径调整,这里用根路径示例
   port = "traffic-port"  # 使用目标组的端口(也就是上面的8080)
   protocol = "HTTP"
   interval = 30
   timeout = 5
   healthy_threshold = 2
   unhealthy_threshold = 2
 }
}

修正EC2安全组入站规则(允许ALB安全组访问)

resource "aws_security_group" "ec2-webServers-sg" {
 name = "ec2-webServers-sg"
 vpc_id = aws_vpc.final-vpc.id
 ingress {
   description = "Allow ALB traffic to app port"
   from_port = 8080
   to_port = 8080
   protocol = "tcp"
   # 直接引用ALB的安全组,替代固定CIDR,更安全且适配ALB的动态IP
   security_groups = [aws_security_group.lb-sg.id]
 }
 egress {
   description = "SQL"
   from_port = 3306
   to_port = 3306
   protocol = "tcp"
   cidr_blocks = ["10.0.10.0/24", "10.0.20.0/24"]
 }
 egress {
   from_port = 0
   to_port = 0
   protocol = "-1"
   cidr_blocks = ["0.0.0.0/0"]
 }
 tags = {
   Name = "F-web-servers-sg"
 }
}

确认ALB安全组配置(允许外部访问)

如果你的lb-sg还没配置外部访问规则,需要添加以下内容,确保用户能访问ALB的80端口:

resource "aws_security_group" "lb-sg" {
 name = "lb-sg"
 vpc_id = aws_vpc.final-vpc.id
 ingress {
   description = "Allow HTTP traffic from anywhere"
   from_port = 80
   to_port = 80
   protocol = "tcp"
   cidr_blocks = ["0.0.0.0/0"]
 }
 egress {
   from_port = 0
   to_port = 0
   protocol = "-1"
   cidr_blocks = ["0.0.0.0/0"]
 }
 tags = {
   Name = "F-alb-sg"
 }
}

额外排查步骤

修改完配置后,建议做以下验证:

  • 登录AWS控制台,查看目标组的目标健康状态,如果所有实例都显示healthy,说明转发路径正常。
  • 登录EC2实例,执行curl localhost:8080确认应用服务是否正常运行,同时检查Docker容器状态(docker ps)。
  • 可以用tcpdump在EC2上抓包,确认ALB的请求是否到达了8080端口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:42:46