在 AWS ECS(Fargate) 的一个容器中托管多个应用程序

Host Multiple applications in one container in AWS ECS(Fargate)

我们的产品包含以下 .Net5 应用程序:

  1. 客户的前端网络应用程序
  2. 管理工具 - 用于管理活动
  3. 网络API
  4. Worker 服务 - 用于后台作业

现在我们正在使用两个 AWS EC2 VM(使用 AWS 负载均衡器进行负载均衡)在 IIS 上托管这些应用程序。我们还有 5 个不同的供应商(将来会更多)。因此,我们为每个供应商部署了这 4 个应用程序,即我们在每个 VM 上的 IIS 上托管了 20 个应用程序。

现在需要迁移到 AWS Fargate 等无服务器容器服务。 这里的任何专家都可以建议继续以下任何一种方式:

  1. 集群中有 20 个容器镜像、20 个任务定义和 20 个服务
  2. 集群中有 20 个容器映像、5 个任务定义(每个都有 5 个容器定义)和 5 个服务
  3. 5 个容器映像(如果可能,每个容器中有 4 个应用程序)、5 个任务定义和集群中的 5 个服务

我不是容器服务方面的专家,所以有可能我上面说的3种方式完全是虚构的,那请指点合适的方式。 我的最终目标是找出与 EC2 VM 相比,以更具可扩展性(自动扩展)和成本效益的方式托管这些应用程序的可能性。

谢谢

认为任务是管理和缩放的原子单元。它由 1 个(通常)或多个容器(需要时)组成。如果您的应用程序有明确的边界,它需要与其他模块分开扩展,并且它有自己不同于其他模块的生命周期 modules/applications ... 那么它需要是自己的任务。如果那是您的原子实体,那么在该任务中您可能需要多个容器。例如,在您拥有前端、应用服务器、索引服务、后端服务等的场景中……。这些模块中的每一个都需要是它们自己的任务。根据模块的构建方式,这些任务中的每一项都可以是一个或多个容器。

一个服务,它只是一个结构,允许您告诉 ECS“接受该任务并始终 运行 x 它的实例”。 x 可以是一个固定数字,或者您可以告诉 ECS 根据工作负载扩展服务(根据任务数量)。

根据您上面所说的,您的应用程序似乎由 4 个模块组成(网站、工具、API 和工作人员)。这意味着您可能正在查看 4 个任务定义。鉴于我了解您的应用程序不是多租户,您可能需要为特定用户(在您的情况下为“供应商”?)提供专用服务。

所以假设您有 5 个供应商,您可能会有 5 个用于 Web 模块的 ECS 服务、5 个用于工具模块的 ECS 服务、5 个用于 API 模块的 ECS 服务和 5 个用于工具模块的 ECS 服务worker 模块的 ECS 服务。假设您可以使用不同供应商的环境变量自定义每个模块,那么您可能只需要 4 个任务定义,这些定义在您启动它们时 运行-time 得到个性化。如果这不可能,那么您必须为每个模块和每个供应商定义一个任务。

这是你应该如何看待它的高层次。如果您是 ECS 的新手,也许更好的方法是使用可以简化上述许多概念的 Docker/ECS integration we built with Docker or the Copilot CLI

HTH