无负载均衡ECS Fargate公网可访问最小服务部署故障排查
问题根因
- 你当前使用的AWS Service Discovery(Cloud Map)默认只会将ECS Fargate任务的私有内网IP注册到关联的Route53托管区域,公网环境下访问私有IP自然无法建立连接,这是预期行为,不是配置错误。
- Fargate的awsvpc网络模式下确实不支持动态端口映射,但你可以手动指定固定的HostPort,不存在非80端口无法运行的问题,只要访问时携带对应端口,或者将HostPort配置为80即可省略端口访问。
具体配置方案
1. 公网IP自动同步到域名(核心解决访问不通问题)
原生Service Discovery不支持注册Fargate公网IP,你可以通过极低开销的EventBridge + Lambda方案实现自动同步:
- 新建EventBridge规则,监听ECS任务状态变更事件,匹配你的ECS服务、任务启动/停止的事件类型
- 编写Lambda函数,逻辑如下:
- 捕获到任务启动事件时,调用ECS API查询该任务绑定的弹性网卡公网IP
- 调用Route53 API,更新
my-service.test-1234.com的A记录为查询到的公网IP,TTL设为60s降低更新延迟 - 捕获到任务停止事件时,可选择删除A记录或者保留待下次启动覆盖
- 给Lambda配置最小IAM权限:允许查询ECS任务详情、修改对应Route53托管区域的记录集
这个方案几乎不会产生额外成本,Lambda每月免费额度完全可以覆盖这种低频次调用。
2. 非80端口适配方案
你可以二选一:
- 保留容器监听8080,访问域名时携带端口:
http://my-service.test-1234.com:8080/stocks/MMM - 修改TaskDefinition的端口映射,将HostPort设为80,无需改动容器内服务配置:
PortMappings: - HostPort: 80 ContainerPort: 8080
修改后直接通过http://my-service.test-1234.com/stocks/MMM即可访问,不需要携带端口。
3. 后续扩容适配
如果后续需要扩容到多实例,只需要修改Lambda逻辑,将所有运行中任务的公网IP都添加到域名的A记录中,即可实现DNS轮询式的负载分发,仍然不需要负载均衡器。
内容的提问来源于stack exchange,提问作者jakimarks
相关产品推荐
相关产品推荐

