首页 > 解决方案 > 使用 Fargate 进行动态舞台路由/多集群设置

问题描述

我有一个带有两个容器的服务的 fargate 集群:

  1. 一个运行 nginx 的容器,用于终止 mTLS(它接受定义的 CA 列表)并将调用转发到具有客户端证书 DN 的应用程序容器
  2. 在 tomcat 上运行的 Spring 应用程序,它通过过滤器基于传入的 DN 执行细粒度的授权检查(每个路由和 HTTP 方法)

来自 nginx 的端点通过 NAT 网关暴露在互联网上。

基础设施通过 terraform 进行管理,推出新版本是通过任务定义替换完成的,然后指向 ECR 中的新图像。ECS 负责并启动新容器,然后在 5 到 10 分钟内将 DNS 切换到这些容器。

此设置的问题:

  1. 我无法进行金丝雀或蓝/绿部署
  2. 如果新的应用程序版本出现问题(应用程序无法启动,我们有巨大的错误峰值,......)回滚将花费大量时间。
  3. 如果不应用新版本,我无法测试我的服务集成,因此可能会破坏一切。

我的目标是具有多个集群和基于特定标头的路由的一些概念。这样我就可以使用我的新应用程序版本启动一个新集群,并且在我 a)发送特定标头或 b)完全切换到具有特定 SSM 参数的新版本之前,流量不会被路由到该版本。

基本上,您可以在 CloudFront 上使用 Lambda@Edge 轻松进行静态前端部署(使用多个源存储桶并根据传入请求使用 lambda 切换源)。

由于我需要 mTLS 和那些细粒度的授权,我既不能使用标准 ALB 也不能使用 API 网关。

是否有其他智能解决方案可以满足我的要求?

标签: amazon-web-servicesarchitectureamazon-ecsaws-fargate

解决方案


为了最终解决这个问题,我们没有继续复制任务定义(xxx-blue 和 xxx-green)和 ELB 并创建两个不同的 A 记录。部署过程:

  1. 通过检查两个 CNAMES 的权重找出哪个任务定义处于非活动状态(其中一个的权重为 0%)
  2. 替换在 ECR 中包含新图像的非活动定义。
  3. 等待应用程序变得健康
  4. 通过 CNAME 记录将流量切换到替换任务定义的 ELB
  5. 运行集成测试并验证没有日志异常
  6. (手动触发)将其他任务定义中的所需任务设置为零以缩小旧版本。否则,如果出现意外行为,A 记录可用于将流量切换回旧任务的 ELB。

我们没有做到这一点:拥有基于客户端的路由到不同的任务。


推荐阅读