如何仅使用带有 ECS 的一个 EC2 实例进行持续部署

How to deploy continuously using just One EC2 instance with ECS

我想仅使用 一个 EC2 实例 和 ECS 连续部署我的 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. 除了最佳实践之外,我还有什么遗漏或做过的吗?

这是一种使用 green/blue 部署模式的方法:

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

这还允许您回滚到 'last known good' 状态。

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

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

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

Dynamic ports makes it easier to start tasks in your cluster without having to worry about port conflicts. Previously, to use Elastic Load Balancing to route traffic to your applications, you had to define a fixed host port in the ECS task. This added operational complexity, as you had to track the ports each application used, and it reduced cluster efficiency, as only one task could be placed per instance. Now, you can specify a dynamic port in the ECS task definition, which gives the container an unused port when it is scheduled on the EC2 instance. The ECS scheduler automatically adds the task to the application load balancer’s target group using this port. To get started, you can create an application load balancer from the EC2 Console or using the AWS Command Line Interface (CLI). Create a task definition in the ECS console with a container that sets the host port to 0. This container automatically receives a port in the ephemeral port range when it is scheduled.