使用Transit Gateway做出口时AWS Fargate任务一直处于PENDING状态
问题诊断
你的Fargate任务一直处于Pending状态,核心原因是跨VPC的流量路径不完整:
- main-vpc私有子网的互联网流量(拉取Docker镜像)通过Transit Gateway(TGW)后,TGW没有对应的路由指引流量到egress-vpc的NAT网关,导致流量无法进入互联网。
- 从egress-vpc返回的流量找不到回到main-vpc的路径,形成单向断流。
修正方案
1. 给TGW默认路由表添加默认路由,指向egress-vpc的TGW附件
在tgw.tf中新增TGW路由资源,让TGW知道把互联网流量转发到egress-vpc:
resource "aws_ec2_transit_gateway_route" "tgw_default_route" { transit_gateway_route_table_id = aws_ec2_transit_gateway.main_tgw.default_route_table_id destination_cidr_block = "0.0.0.0/0" transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.egress_vpc_attachment.id # 确保egress-vpc的TGW附件创建完成后再添加路由 depends_on = [aws_ec2_transit_gateway_vpc_attachment.egress_vpc_attachment] }
2. 给egress-vpc私有子网路由表添加返回main-vpc的路由
在egress-vpc.tf的aws_route_table.egress_vpc_subnets_rt中新增一条路由,让返回流量能通过TGW回到main-vpc:
resource "aws_route_table" "egress_vpc_subnets_rt" { vpc_id = aws_vpc.egress_vpc.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.egress_vpc_nat_gateway.id } # 添加返回main-vpc的路由规则 route { cidr_block = "10.0.0.0/16" transit_gateway_id = aws_ec2_transit_gateway.main_tgw.id } tags = { Name = "egress-vpc-private-subnet-rt" } }
3. 补充VPC的DNS配置(可选但建议)
Fargate任务拉取镜像需要正常的DNS解析,给两个VPC添加DNS相关配置:
# 在main-vpc.tf的aws_vpc.main_vpc中添加 enable_dns_hostnames = true enable_dns_support = true # 在egress-vpc.tf的aws_vpc.egress_vpc中添加 enable_dns_hostnames = true enable_dns_support = true
修正后完整流量路径
- Fargate任务发起镜像拉取请求 → main-vpc私有子网路由表 → 流量转发到TGW
- TGW匹配0.0.0.0/0路由 → 流量转发到egress-vpc的TGW附件
- egress-vpc私有子网路由表匹配0.0.0.0/0路由 → 流量转发到NAT网关
- NAT网关将流量转发到互联网,完成镜像拉取
- 返回流量从互联网到NAT网关 → egress-vpc私有子网匹配10.0.0.0/16路由 → 流量转发回TGW
- TGW通过路由传播匹配main-vpc CIDR → 流量回到main-vpc的Fargate任务
内容的提问来源于stack exchange,提问作者Jack Ripper
相关产品推荐
相关产品推荐

