在 AWS ECS 上滚动部署 Play Framework webapp
Rolling deployment of Play Framework webapp on AWS ECS
我想在 AWS ECS 上部署 Play Web 应用程序。我创建了一个由 2 个 EC2 实例 运行 组成的 Web 服务集群。每个实例都是 运行 一个任务。集群由 AWS ELB 进行负载平衡。
将新的 docker 图像推送到存储库后,我创建了我的任务定义的新修订版,其中包括用 latest
标记的新图像。当我更新服务以使用新任务定义时,所有 EC2 实例都会立即更新它们的任务。尽管我有 2 个 EC2 实例,但我遇到了停机,因为 AWS 同时更新所有实例,而不是以滚动部署的方式一个接一个地更新实例。
我尝试在每个 EC2 实例上启动多个任务,但这显然是不可能的,因为每个任务都需要 Play 的默认端口 9000,并且我在服务的事件选项卡中收到 "port already in use" 错误消息.
我能想到两种可能的解决方案:
- 每个任务实例使用一个动态端口而不是默认端口。 (如何为动态端口配置负载平衡器 "search"?)
- 创建两个独立的 ECR 集群,将它们都放在一个负载均衡器目标组中,并在第一个集群完成更新后手动更改第二个集群的任务定义。 (这怎么能自动化——或者它能完全自动化吗?)
这些解决方案中的一种是可行的吗?对于这种情况是否有任何其他解决方案或最佳实践?
好的,我找到了问题的根源。
首先,我有点混淆了术语。 AWS Elastic Beanstalk 的文档解释了 difference between a rolling update and a rolling deployment。我试图实现滚动部署,而不是滚动更新 - 我将相应地编辑我的问题。
此外,我注意到我更改了实例的 "Minimum healthy percent" 并且无意中将设置保存为 0%。因此,ECS 正确地冒昧地同时重新部署了一个以上的 EC2 实例,在我的集群上没有留下任何健康的实例。我找到了一个非常有用的视频 here,作者在视频中介绍了升级 ECS 集群然后再次降级的过程。现在一切正常。
我想在 AWS ECS 上部署 Play Web 应用程序。我创建了一个由 2 个 EC2 实例 运行 组成的 Web 服务集群。每个实例都是 运行 一个任务。集群由 AWS ELB 进行负载平衡。
将新的 docker 图像推送到存储库后,我创建了我的任务定义的新修订版,其中包括用 latest
标记的新图像。当我更新服务以使用新任务定义时,所有 EC2 实例都会立即更新它们的任务。尽管我有 2 个 EC2 实例,但我遇到了停机,因为 AWS 同时更新所有实例,而不是以滚动部署的方式一个接一个地更新实例。
我尝试在每个 EC2 实例上启动多个任务,但这显然是不可能的,因为每个任务都需要 Play 的默认端口 9000,并且我在服务的事件选项卡中收到 "port already in use" 错误消息.
我能想到两种可能的解决方案:
- 每个任务实例使用一个动态端口而不是默认端口。 (如何为动态端口配置负载平衡器 "search"?)
- 创建两个独立的 ECR 集群,将它们都放在一个负载均衡器目标组中,并在第一个集群完成更新后手动更改第二个集群的任务定义。 (这怎么能自动化——或者它能完全自动化吗?)
这些解决方案中的一种是可行的吗?对于这种情况是否有任何其他解决方案或最佳实践?
好的,我找到了问题的根源。 首先,我有点混淆了术语。 AWS Elastic Beanstalk 的文档解释了 difference between a rolling update and a rolling deployment。我试图实现滚动部署,而不是滚动更新 - 我将相应地编辑我的问题。
此外,我注意到我更改了实例的 "Minimum healthy percent" 并且无意中将设置保存为 0%。因此,ECS 正确地冒昧地同时重新部署了一个以上的 EC2 实例,在我的集群上没有留下任何健康的实例。我找到了一个非常有用的视频 here,作者在视频中介绍了升级 ECS 集群然后再次降级的过程。现在一切正常。