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

