1

我有一个托管在 AWS 上的重型应用程序。我使用 CodeDeploy 和 Code Pipeline(从 gi​​thub 更新)在新版本准备就绪时更新服务器(当前在生产环境中运行 6 个 ec2 实例)。

我已经将 codedeploy 设置为一个接一个地运行,并且还定义了一个 300 秒的连接耗尽负载均衡器。

尽管如此,我的应用程序仍然很重(它将大型字典 pickle 文件从磁盘加载到内存),启动过程大约需要 60 秒。在这 60 秒内,CodeDeploy 将部署到实例的过程标记为已完成,使其作为健康实例重新加入负载均衡器 - 这可能会导致尝试访问应用程序的用户出错。

我考虑过使用ValidateService钩子,但我不知道如何在我的情况下..

关于如何在继续下一个实例之前等待应用程序完全加载和准备就绪的任何想法?

这是我当前的 AppSpec.yml version: 0.0 os: linux files: - source: /deployment destination: /deployment - source: /webserver/src destination: /vagrant/webserver/src permissions: - object: /deployment pattern: "**" owner: root mode: 644 type: - directory - object: /webserver/src owner: root mode: 644 except: [/webserver/src/dictionaries] type: - directory hooks: ApplicationStop: - location: /deployment/aws_application_stop.sh BeforeInstall: - location: /deployment/aws_before_install.sh AfterInstall: - location: /deployment/aws_after_install.sh ApplicationStart: - location: /deployment/aws_application_start.sh

4

1 回答 1

2

我会在ValidateService钩子中循环,检查您期望的条件,或者只是休眠 60 秒,假设这是正常的初始化时间。

钩子应该这样做:ValidateService在继续/完成部署之前确保服务完全运行。这当然取决于您的应用程序。但是考虑一个拉出一个专门设计的页面 EG 的循环http://localhost/service-ready。在该 URL 中,测试并确认适合您的服务的所有内容。-Pending-如果服务尚未验证,则返回一个字符串。-OK-当一切都是 100% 时返回 a

也许在 10 秒的睡眠中循环 10-20 次,并在它返回时退出,-OK-然后如果服务从未验证过则抛出错误。

于 2016-06-23T00:26:17.440 回答