使用AWS ECS服务和Elastic LoadBalancer向公众开放多个端口

时间:2019-08-29 18:17:50

标签: amazon-web-services amazon-ecs amazon-elb

我拥有公开多个端口的服务,并且可以与kubernetes正常工作,但是现在我们将其移至AWS ECS。似乎我只能通过Load Balancer公开端口,并且每个服务/任务只能使用1个端口,即使docker定义了多个端口,我也必须选择一个端口

enter image description here

Add to load balancer按钮可添加一个端口。添加后,将没有按钮添加第二个端口。

是否有比提供第二个代理服务来公开第二个端口更好的工作环境?

更新:我使用基于Fargate的服务。

3 个答案:

答案 0 :(得分:6)

我在为每个实例创建多个容器时遇到了这个问题,而第二个容器却没有出现,因为它使用了taskdefinition中定义的相同端口。

我们所做的是,在这些容器的顶部创建了一个应用程序负载平衡器,并删除了硬编码端口。当应用程序负载平衡器未获得预定义的端口时,该做什么,即使用动态端口映射功能。容器将出现在随机端口上,并驻留在一个目标组中,负载均衡器将自动将请求发送到这些端口。

更多详细信息,请here

答案 1 :(得分:5)

我不能说这将是一个不错的解决方法,但是我正在开发一个项目,该项目需要使用AWS ECS运行Ejabberd,但是当它将服务端口绑定到负载均衡器时发生了相同的问题。

我正在使用terraform,由于AWS ECS的这一限制,我们同意为每个实例运行一个容器来解决端口问题,因为我们应该公开两个端口。

如果您不想为容器分配动态端口,并且希望每个实例运行一个容器,那么该解决方案肯定会起作用。

  1. 创建目标组并指定容器的第二个端口。

  2. 转到ECS集群的AutoScalingGroups

  3. 在ECS集群的Autoscaling组中编辑并添加新创建的目标组

因此,如果您缩放到两个容器,则意味着将有两个实例,因此新启动的实例将注册到第二个目标组,而Autoscaling组将负责该操作。 在我看来,这种方法效果很好,但是无需考虑任何事情。

  

不要将主端口绑定到目标中,最好将主端口绑定到目标中   ALB服务。这种方法的主要优点是,如果您的   容器无法响应AWS运行状况检查,容器将   自动重启。由于目标组健康检查不会重新创建您的容器。

     

当Docker容器中有动态端口公开时,此方法将不起作用。

AWS应该更新其ECS代理以处理这种情况。

答案 2 :(得分:3)

您不需要任何解决方法,AWS ECS现在在同一ECS服务中支持多个目标组。这对于您希望公开容器的多个端口的用例很有帮助。

当前,如果要创建指定多个目标组的服务,则必须使用Amazon ECS API,SDK,AWS CLI或AWS CloudFormation模板创建服务。创建服务后,您可以通过AWS管理控制台查看该服务以及注册到该服务的目标组。

  

例如,一个Jenkins容器可能会暴露8080端口,   Jenkins Web界面和API的端口50000。

参考:

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html

https://aws.amazon.com/about-aws/whats-new/2019/07/amazon-ecs-services-now-support-multiple-load-balancer-target-groups/