在AWS ECS上滚动部署Play Framework webapp

时间:2017-01-31 12:08:48

标签: amazon-web-services playframework port updates amazon-ecr

我想在AWS ECS上部署Play网络应用程序。我创建了一个运行Web服务的2个EC2实例的集群。每个实例都运行一个任务。该集群由AWS ELB负载平衡。

将新的docker镜像推送到存储库后,我创建了一个新的任务定义修订版,其中包含用latest标记的新图像。当我更新服务以使用新任务定义时,所有EC2实例都会立即更新其任务。即使我有2个EC2实例,我也会遇到停机,因为AWS会同时更新所有实例,而不是以滚动部署的方式更新一个实例。

我尝试在每个EC2实例上启动多个任务,但这显然是不可能的,因为每个任务都需要Play的默认端口9000,并且我在服务的事件选项卡中收到“端口已在使用中”错误消息。

我可以想到两种可能的解决方案:

  • 每个任务实例使用动态端口而不是默认端口。 (如何配置负载均衡器以“搜索”动态端口?)
  • 创建两个单独的ECR群集,将它们都放在单个负载均衡器目标组中,并在第一个群集完成更新后手动更改第二个群集的任务定义。 (如何将其自动化 - 或者可以自动化?)

这些解决方案中的一种是可行的方式还是针对此方案的其他解决方案或最佳实践?

1 个答案:

答案 0 :(得分:0)

好的,我找到了问题的根源。 首先,我把术语混淆了一下。 AWS Elastic Beanstalk的文档解释了difference between a rolling update and a rolling deployment。我试图实现滚动部署,而不是滚动更新 - 我将相应地编辑我的问题。

此外,我注意到我改变了"最低健康百分比"实例并无意中将设置保存为0%。因此,ECS正确地采取了自由并同时重新部署了多个EC2实例,在我的集群上没有留下健康的实例。我发现了一个非常有用的视频here,作者在此过程中完成升级ECS群集的过程,然后再次降级。一切都按预期工作。