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

同一VPC中公有与私有子网ECS Fargate服务通信最佳实践

同一VPC下ECS Fargate跨子网通信的最佳实践与Service Discovery指南

嘿,针对你这个公有子网部署web-tier、私有子网部署app-tier的ECS Fargate架构,我可以明确说:ECS Service Discovery绝对是这个场景下的首选方案,结合VPC的基础网络配置,就能实现安全、高效又省心的服务间通信。下面我把最佳实践和具体落地步骤给你捋清楚:

一、先明确几个核心最佳实践原则

  • 别硬编码IP,直接上Service Discovery:Fargate任务的IP是动态变化的,手动维护地址根本不现实,Service Discovery能自动搞定服务地址的注册与解析
  • 安全组要锁死:web-tier的安全组只开放必要的外部流量(比如80/443给用户访问),同时仅允许它访问app-tier的服务端口;app-tier的安全组仅对web-tier的安全组开放对应端口,拒绝所有其他外部访问(包括VPC内无关子网的流量)
  • 用VPC自带的DNS就行:VPC默认的DNS服务器(即VPC网段+2的IP)能直接解析Service Discovery的私有域名,无需额外部署第三方DNS服务

二、为啥ECS Service Discovery刚好适配这个场景?

你想啊,Fargate任务每次调度都会分配新的私有IP,总不能让web-tier的代码写死某个IP吧?Service Discovery基于AWS Cloud Map实现,它会自动把app-tier的每个实例注册到你指定的私有域名下,web-tier只需要记住这个固定域名——不管app-tier扩容、缩容还是实例重启,域名解析的IP都会自动更新,还能自动剔除不健康的实例,完美适配Fargate的无服务器特性,省了你大量手动维护的麻烦。

三、具体怎么用?一步一步来

1. 搞定VPC与安全组的基础配置

  • 确保你的VPC开启了DNS主机名和DNS解析(这俩是默认配置,除非你手动修改过,若关闭了请重新开启)
  • 私有子网的路由表不要添加指向Internet Gateway的路由,这是私有子网的基本要求,确保app-tier实例不会直接暴露到公网
  • 分别为web-tier和app-tier创建安全组:
    • web-tier安全组:入站允许0.0.0.0/0的80/443端口(若对外提供服务),出站允许访问app-tier的服务端口(比如你的app用3000端口就开3000)
    • app-tier安全组:入站仅允许来自web-tier安全组的对应端口访问,出站按需配置(比如需要访问私有子网内的RDS就开对应端口)

2. 创建Service Discovery私有命名空间

  • 选择私有命名空间,绑定到你的目标VPC,这样只有该VPC内的资源能解析这个命名空间下的域名,安全性拉满
  • 命名空间整个好记的,比如internal.myapp.com,一眼就能识别是内部服务域名

3. 给私有子网的app-tier服务配置Service Discovery

  • 创建ECS服务时,找到Service Discovery选项并开启,选择你刚创建的私有命名空间
  • 设置服务的DNS记录:比如服务名叫app-service,生成的域名就是app-service.internal.myapp.com
  • DNS类型选A记录即可(若有多个实例,Cloud Map会自动做负载均衡),端口填写你app-tier服务的实际端口
  • 注意任务定义里容器暴露的端口要和这里配置的一致,否则会出现注册失败的问题

4. 配置公有子网的web-tier服务

  • web-tier这边无需开启Service Discovery(除非你需要其他服务访问它,当前场景是它主动访问app-tier)
  • 直接在web-tier的代码里使用刚才生成的app-tier域名(app-service.internal.myapp.com)发起请求即可,不用管具体IP——同一VPC内的DNS会自动解析到正确的app实例
  • 要是你习惯用环境变量,也可以把这个域名设成环境变量,代码读取环境变量来发起请求,灵活性更高

5. 验证通信是否正常

  • 进入web-tier的Fargate任务,执行nslookup app-service.internal.myapp.com,查看是否能解析到app-tier的实例IP
  • 再用curl app-service.internal.myapp.com:3000(替换成你的服务端口)测试,确认能拿到正常响应

四、几个额外的优化小技巧

  • 若app-tier有多个服务(比如用户服务、订单服务),可以给每个服务设置独立子域名,比如user-service.internal.myapp.com、order-service.internal.myapp.com,管理起来更清晰
  • 配合ECS的健康检查:当app-tier实例不健康时,Service Discovery会自动把它从DNS记录中移除,避免web-tier访问到故障实例
  • 高并发场景下,可以在app-tier前端加一个Network Load Balancer(NLB),将NLB注册到Service Discovery,web-tier访问NLB的域名,由NLB转发到app实例,提升负载均衡能力与可用性

内容的提问来源于stack exchange,提问作者wildthing81

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:27:35