我在 AWS 上托管了一个大型应用程序。 当新版本准备就绪时(当前在生产环境中运行 6 个 ec2 实例),我使用 CodeDeploy 和 Code Pipeline(从 github 更新)来更新服务器。
我已将代码部署设置为一对一操作,并在负载均衡器上定义了 300 秒的连接耗尽时间。
不过,我的应用程序很重(它将大型字典 pickle 文件从磁盘加载到内存),启动过程大约需要 60 秒。在这 60 秒内,CodeDeploy 将实例部署过程标记为已完成,从而使其作为健康实例重新加入到负载均衡器 - 这可能会导致用户尝试访问应用程序时出错。
我考虑过使用 ValidateService
Hook ,但我不确定在我的情况下如何使用..
关于如何在继续下一个实例之前等待应用程序完全加载和准备就绪,有什么想法吗?
这是我当前的 AppSpec.yml
版本:0.0
操作系统:Linux
文件:
- 来源:/部署
目的地:/部署
- 来源:/webserver/src
目的地:/vagrant/webserver/src
权限:
- 对象:/部署
图案: ”**”
所有者:根
模式:644
类型:
- 目录
- 对象:/webserver/src
所有者:根
模式:644
除外:[/webserver/src/dictionaries]
类型:
- 目录
Hook :
申请站:
- 位置:/deployment/aws_application_stop.sh
安装前:
- 位置:/deployment/aws_before_install.sh
安装后:
- 位置:/deployment/aws_after_install.sh
申请开始:
- 位置:/deployment/aws_application_start.sh
最佳答案
我会在 ValidateService
Hook 中循环,检查您期望的条件,或者只是休眠 60 秒,假设这是正常的初始化时间。
ValidateService
Hook 应该做到这一点:在继续/完成部署之前确保服务完全运行。当然,这取决于您的应用程序。但考虑一个拉取专门设计的页面 EG http://localhost/service-ready
的循环。在该 URL 中,测试并确认适合您的服务的所有内容。如果服务尚未验证,则返回 -Pending-
字符串。当一切都 100% 时返回 -OK-
可能会循环 10-20 次,并 sleep 10 秒,并在返回 -OK-
时退出,如果服务从未验证,则抛出错误。
关于python - 将 CodeDeploy ValidateService Hook 与 Python 应用程序结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37967838/