测试ECS托管实例时遇到一个典型网络问题,记录一下解决思路。

如果你在公有子网部署这套方案,不做任何特殊网络配置,直接运行Exec命令,会收到这样的报错:

打开网易新闻 查看精彩图片

TargetNotConnectedException: ecs:ecs-task_xxxxxxxxxxxxxxxx is not connected

错误信息很直白——目标实例未连接。但问题根源不在实例本身,而在网络架构。

核心限制:公有IP的缺失

ECS托管实例有个关键约束:无法通过assignPublicIp=ENABLE为任务分配公有IP。这与标准ECS服务的行为不同。

这意味着,即便任务运行在公有子网,它也无法直接访问互联网,包括ECS Exec所需的后端服务。

两种可行方案

针对这个问题,实践中主要有两条路径:

方案一:NAT Gateway + VPC Endpoints

通过NAT Gateway提供出站互联网访问,同时部署必要的VPC Endpoints(如SSM、EC2 Messages等)来优化流量路径。这是生产环境的推荐做法,但需注意VPC Endpoints按小时计费的成本。

方案二:公有子网 + 互联网网关

理论上,如果路由表正确配置了互联网网关(IGW),任务可以通过IGW直接访问公网。这种方式无需额外组件,但安全性需要额外评估。

网络模式的选择

上述讨论基于awsvpc网络模式。根据具体场景,也可以考虑将ECS网络模式切换为bridge模式,这在某些遗留架构或特定安全要求下可能更简洁。

对于已有NAT Gateway和VPC Endpoints基础设施的生产环境,直接采用方案一通常是更稳妥的选择。网络架构的决策,最终取决于成本、安全性和运维复杂度的平衡。