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

无负载均衡ECS Fargate公网可访问最小服务部署故障排查

问题根因

  1. 你当前使用的AWS Service Discovery(Cloud Map)默认只会将ECS Fargate任务的私有内网IP注册到关联的Route53托管区域,公网环境下访问私有IP自然无法建立连接,这是预期行为,不是配置错误。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:09:02