如何实现双域名托管同一服务器并自动更新ECS Fargate目标组?
解决ECS Fargate多目标组自动注册的方案
方案一:通过Lambda + CloudWatch Events自动同步目标组
这是最直接的自动化方案,利用AWS原生服务实现任务IP的自动同步:
- 创建Lambda函数,核心逻辑:
- 调用
ECS.ListTasks获取目标ECS服务下所有处于RUNNING状态的任务 - 调用
ECS.DescribeTasks提取这些任务的弹性网络接口(ENI)私有IP - 调用
ELBv2.RegisterTargets将这些IP注册到第二个目标组 - 调用
ELBv2.DeregisterTargets移除目标组中已停止运行的任务IP
- 调用
- 配置CloudWatch Events规则,触发条件选择ECS Task State Change,过滤条件设为任务状态变为
RUNNING且属于目标ECS服务 - 为Lambda函数配置IAM权限:允许
ecs:ListTasks、ecs:DescribeTasks、elasticloadbalancing:RegisterTargets、elasticloadbalancing:DeregisterTargets操作,同时限定对应的ECS集群、服务和目标组资源
方案二:合并目标组,利用ALB主机头路由
如果两个域名指向同一应用,完全可以省去第二个目标组,通过ALB的路由规则实现域名分流:
- 保留已有的目标组(自动更新的那个)
- 在ALB的监听器下添加两条规则:
- 规则1:匹配主机头
www.abc.com,转发到现有目标组 - 规则2:匹配主机头
www.xzy.com,同样转发到现有目标组
- 规则1:匹配主机头
- 确保Cloudflare的两个域名都指向该ALB的公网地址
方案三:使用ECS服务扩展(Service Extension)
通过AWS ECS的服务扩展功能,自定义服务部署后的操作:
- 创建ECS服务扩展,在服务部署完成的生命周期钩子中,执行同步目标组的逻辑
- 扩展的核心逻辑和方案一的Lambda函数一致,只是通过ECS原生的扩展机制触发,不需要额外配置CloudWatch Events
内容的提问来源于stack exchange,提问作者Kemal Mutlu
相关产品推荐
相关产品推荐

