Elastic Beanstalk自动缩放是在将应用程序从ondeck移动到当前之前添加节点

当我的组中的自动调节规则触发新EC2实例的部署时,或者例如,我更改实例大小以模拟节点的部署行为,但在应用程序准备就绪之前将其添加到负载平衡器。

部署开始,并且.ebextensions中的脚本开始执行。 标题为current的文件夹是空的,因为它是第一次部署到此节点,因此访问此节点会在浏览器中显示403 Forbidden错误。

最终,应用程序部署完成,ondeck文件夹将按预期方式移入当前,此时应用程序将运行并且403错误消失。

这里的问题是在该过程完成之前将该节点添加到负载均衡器中,因此一些stream量被分配到损坏的节点。

有什么办法可以阻止这种情况发生? 难道我做错了什么?

只要该实例开始通过负载均衡器的运行状况检查,负载均衡器就会开始向新的EC2实例发送stream量。 我猜你的负载平衡器configuration了TCP ping健康检查。 这意味着只要新实例开始对端口80上的ping进行响应,就认为它是健康的并准备好接收请求。 就像你已经注意到,但是,这将在应用程序完全部署之前发生,实际上提供了良好的回应。

解决scheme是configuration您的负载均衡器以执行HTTP请求的运行状况检查,以便新的EC2实例在您的应用程序运行并成功响应Web请求之前不会被视为健康。 在AWS控制台上,findEC2仪表板的负载均衡器部分,然后为您的Elastic Beanstalk环境select负载均衡器。 您将在负载均衡器configuration面板中看到一个运行状况检查选项卡,您可以在其中编辑运行状况检查设置并切换到HTTP请求作为ping方法。

如果您的应用程序configuration为仅处理通过生产主机名发送的请求,则可能会发现HTTP运行状况检查总是失败。 负载平衡器向EC2实例的特定URL发送请求,如果您的应用程序响应错误或30xredirect的请求,负载平衡器将认为它不健康。 在这种情况下,您需要为请求过滤添加一个exception,以使运行状况检查请求无论主机名如何都能成功。 例如,向您的应用程序中添加一个静态的,空的elbhealthcheck.html文件(或任何您想要命名的文件),并允许使用任何主机名对该文件进行请求。 然后configuration负载均衡器运行状况检查以在其HTTP ping中使用该URL,并且您将很好。