0

我想连续部署我的nodejs webapp,只需使用一个EC2实例与ECS。我无法为此应用创建多个实例。如何仅使用一个EC2实例连续部署ECS

我目前的持续集成流程: Travis从github构建代码,构建标签并推送Docker镜像,并通过ECS Deploy shell script部署到ECS。

每次部署发生时,都会发生以下错误。因为端口80总是被我的webapp使用。

The closest matching container-instance ffa4ec4ccae9 
is already using a port required by your task 
  1. 它实际上是可以使用ECS一个实例? (文档不清)
  2. 如何摆脱ECS上的端口问题? (停止正在运行的容器)
  3. 如何在不使用Load Balancer的情况下完成此操作?
  4. 我错过了什么,或者从最佳实践中脱颖而出?
+0

如果您的应用程序在部署期间无法容忍脱机,则应考虑您的选择只有1个EC2实例。 – doorstuck

回答

2

主要问题是端口冲突,这是在集群中的同一节点上部署任务的第二个实例时发生的。除此之外,没有任何东西可以阻止您拥有多个容器实例(例如,当不使用负载均衡器;根本无法绑定到任何端口)。

为了解决这一问题,亚马逊introduced一个动态端口功能在最近更新:

动态端口,使得它更容易启动集群中的任务,而无需担心端口冲突。以前,要使用Elastic Load Balancing将流量路由到您的应用程序,您必须在ECS任务中定义一个固定的主机端口。这增加了操作复杂性,因为您必须跟踪每个应用程序使用的端口,并且降低了集群效率,因为每个实例只能放置一个任务。现在,您可以在ECS任务定义中指定一个动态端口,该端口在EC2实例上调度时为容器提供未使用的端口。 ECS调度程序使用此端口自动将任务添加到应用程序负载平衡器的目标组。要开始,您可以从EC2控制台或使用AWS命令行界面(CLI)创建应用程序负载平衡器。使用将主机端口设置为0的容器在ECS控制台中创建任务定义。该容器在计划时自动接收临时端口范围内的端口。

2

这里有一个办法做到这一点使用绿色/蓝色的部署模式:

  1. 主机的端口8080上的集装箱& 8081(或任何与你想要的)。我们称8080绿色和8081蓝色。 (您可能必须将网络模式从网桥切换到主机才能使其在单个实例上运行)。
  2. 使用Elastic Load Balancing将来自80/443的流量重定向到绿色或蓝色。
  3. 部署时,使用脚本将ELB上的活动侦听器交换到其他颜色/容器。

这也允许你回滚到'最后已知的好'状态。

请参阅http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html了解更多信息。

+0

如果没有负载平衡器,我不能完成这项工作吗? – sith

+0

如果您将网络切换到主机并公开两个端口,并且可能使用nginx或ECS主机上的某些设备重定向流量,那么您可能无需ELB即可执行此操作。但是,使用负载均衡器可以为您提供很多其他的好处,我强烈建议您使用它。 – mcheshier