Capistrano - 在部署到ALB目标组

时间:2017-11-12 18:20:19

标签: amazon-web-services capistrano3 elastic-load-balancer

我正在使用部署文件中的自定义任务将Rails应用程序部署到自动调整的环境中(基本上我使用Ruby aws sdk通过匹配我的生产环境并部署到这些实例的标签来选择实例)

这些实例实际上是在目标组下注册的,我的应用程序将流量分配给来自应用程序负载均衡器(ELBv2)的那些TG

在我的capistrano部署期间,deploy:restart任务要求重新启动服务器(我正在使用Phusion Passenger)来使用新应用程序。由于重新启动可能会很长(最多1分钟),因此我添加了一个60秒的自定义重启wait选项,以确保我的服务器逐个重新启动,以确保我的服务能够持续使用。

然而,唯一缺少的并且使上述延迟无用的是,在此期间我的ALB不断向这些实例发送请求,因为它们在我的目标组中没有被标记为“不健康”或“待定”。

我见过像https://github.com/thattommyhall/capistrano-elb这样的库很遗憾它们已经过时了,不能用于ALB和TG

最后一条信息:我的capistrano部署任务实际部署到几台匹配不同角色的机器上:

  • API服务器(正面,ALB + TG后面如上所述)
  • 工人和调度员(不在任何ALB之后,不得采取任何特殊预防措施)

所以我的(子)问题是(是)

  • 是否可以手动将TG后面的实例标记为“待定”?如果没有,那么deregister后跟立即register会达到同样的效果吗?

  • 我如何从Capistrano任务中执行上述:api角色的实例,假设实例都在AWS云中,具有IAM角色,位于一个目标组下(实际上,如果我可以获得一些技巧来支持同一个实例的几个TG,那将是有用的。

1 个答案:

答案 0 :(得分:0)

我目前正在设置使用lifeCycle挂钩进行自动缩放,并且稍后可能会这样做,但是否则可能的解决方案(我还没有验证)将是

  • 取消注册目标(CLI)。

  • (可选)等待目标取消注册(CLI)。

  • 恢复乘客:重启命令

  • (可选)再次注册目标(CLI)。

  • 等待目标投入使用(CLI)。

  • 在下一个实例上继续使用相同的挂钩

执行速度取决于服务器重启时间/健康检查效率。也许更好的解决方案,如果生产中有足够的服务器,那就是跳过等待时间并确保你总是有一个"窗口" x服务器在线

即。假设您有5台服务器,需要30秒才能重新启动,您可以每15秒注销一次 - 重新启动 - 注册服务器,以确保随时都有2台服务器(假设运行状况检查频繁,将实例标记为15秒内健康)