在 AWS ECS 中的任务定义之间链接容器?

Linking containers between task definitions in AWS ECS?

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

  1. 我在 ECS 中成功将我的第一个任务定义注册为 david_mongodb。它有一个名为 david_mongodb 的容器。
  2. 然后我尝试将我的第二个任务定义注册为 david_web,它有一个名为 david_web 的容器,该容器 link 通过 david_mongodb:db 连接数据库。
  3. 当我点击 'Create' 时,它 returns 一个错误:

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

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

那么如何 link 位于不同任务定义中的容器?还是有另一种聪明的方法来处理这个问题?

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

ECS 通过 service 功能与 Elastic Load Balancing(Application Load Balancer、Network Load Balancer 和 Classic Load Balancer)集成,其中任务将自动在 ELB 中注册并适当地在 ELB 中注销.

ECS 还与 Route 53 Auto Naming 集成,使用 ASRV 记录进行 DNS-based 服务发现。您的服务任务可以自动输入到 DNS 记录中或从中删除。

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

如果您想避免使用负载均衡器和 DNS,另一种模式可能是 ambassador container (there's a sample called the ecs-task-kite that uses the ECS API) or you might be interested in an overlay network (Weave has a fairly detailed getting started guide 他们的解决方案)。

Nathan Peck is keeping track of a number of different subjects related to ECS, including service discovery, here.

您现在可以参考 networking between Amazon ECS services in a VPC 上的官方最佳实践指南,讨论在采用服务发现、ELB 或服务网格与 ECS 进行服务到服务通信时的注意事项。