如何使用ECS的一个EC2实例连续部署

时间:2016-11-14 10:45:44

标签: amazon-web-services amazon-ec2 continuous-integration travis-ci amazon-ecs

我想使用ECS的一个EC2实例连续部署我的nodejs webapp。我无法为此应用创建多个实例。

我目前的持续整合过程: 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. 在不使用负载均衡器的情况下完成此操作的方法是什么?
  4. 我错过了什么或者做了最好的做法?

2 个答案:

答案 0 :(得分:2)

以下是使用绿色/蓝色部署模式的方法:

  1. 将您的容器托管在端口8080& 8081(或任何你想要的端口)。我们叫8080绿色和8081蓝色。 (您可能必须将网络模式从桥接器切换到主机以使其在单个实例上工作)。
  2. 使用Elastic Load Balancing将流量从80/443重定向到绿色或蓝色。
  3. 部署时,使用脚本将ELB上的活动侦听器交换到另一个颜色/容器。
  4. 这也允许您回滚到“上次已知的好”状态。

    有关详细信息,请参阅http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html

答案 1 :(得分:2)

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

要解决此问题,最新更新中的亚马逊introduced 动态端口功能:

  

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