61

我正在尝试在 AWS ECS 中设置一个具有关联数据库的基本 Web 应用程序。在本地,我在不同的容器中进行了这些设置,在 ECS 上,我希望有单独的任务定义,以便我可以分别扩展这两个。

  1. david_mongodb我在 ECS中成功注册了我的第一个任务定义。它有一个在其中命名的容器david_mongodb
  2. 然后我尝试将我的第二个任务定义注册为david_web,它有一个名为的容器,它david_web通过david_mongodb:db.
  3. 当我单击“创建”时,它返回一个错误:

    Unable to create Task Definition
    Linked container 'david_mongodb:db' doesn't exist.
    

似乎任务定义在其他任务定义中看不到容器名称?我认为将容器david_webdavid_mongodb容器放在同一个任务定义中会起作用,但我不想这样做:它会阻止我单独扩展 Web 应用程序或数据库。本概述似乎证实了我的架构是推荐的......

那么如何链接存在于不同任务定义中的容器呢?还是有另一种巧妙的方法来处理这个问题?

4

2 回答 2

87

ECS 任务定义中的链接类似于Docker 链接,并且仅当容器是同一任务定义的一部分时才有效(作为单个任务定义的一部分的容器一起放置在同一主机上)。为了在不同任务定义中的容器之间进行通信,您需要一种机制来发现容器所在的位置(什么主机)以及用于通信的端口。

ECS 通过服务功能与 Elastic Load Balancing(应用程序负载均衡器、网络负载均衡器和经典负载均衡器)集成,其中任务将自动在 ELB 中注册并在 ELB 中适当地取消注册。

ECS 还与Route 53 自动命名A集成,用于使用和SRV记录的基于 DNS 的服务发现。您的服务任务可以自动输入和从 DNS 记录中删除。

使用 DNS 的 Amazon ECS 服务发现描述了一种不同的方法,其中 Lambda 函数通过 CloudWatch Events 侦听 ECS 事件流并更新 Route 53 DNS 记录。此方法已被上述 Route 53 自动命名功能取代。

如果您想避免使用负载均衡器和 DNS,另一种模式可能是大使容器(有一个使用 ECS API 的名为ecs-task-kite的示例),或者您可能对覆盖网络感兴趣(Weave 有一个相当详细的获取开始指导他们的解决方案)。

Nathan Peck在此处跟踪与 ECS 相关的许多不同主题,包括服务发现。

于 2015-12-30T00:09:02.920 回答
0

您现在可以参考这篇关于VPC 中 Amazon ECS 服务之间联网的官方最佳实践指南,讨论采用服务发现、ELB 或服务网格与 ECS 进行服务到服务通信时的注意事项。

于 2021-08-30T04:21:02.507 回答