由于userdata脚本,AWS自动扩展会启动未准备好的实例

时间:2016-02-10 10:33:31

标签: amazon-web-services amazon-ec2

我的自动缩放效果很好,使用启动配置,我定义了一个在新实例启动时执行的用户数据脚本。

用户脚本更新基本代码并生成缓存,这需要几秒钟。但是一旦实例被创建" (而不是"准备好"),自动缩放将其添加到负载均衡器。

这是一个问题,因为在执行userdata脚本时,实例没有响应得很好(基本上会抛出500个错误)。

我想避免这种情况,当然我看到了这个文档:http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/InstallingAdd

  

与独立的EC2实例一样,您可以选择使用用户数据配置启动到Auto Scaling组的实例。例如,您可以使用AWS管理控制台中的用户数据字段或AWS CLI中的--userdata参数指定配置脚本。

     

如果您的软件无法使用配置脚本进行安装,或者您需要在Auto Scaling将实例添加到组之前手动修改软件,请向Auto Scaling组添加生命周期挂钩以通知您Auto Scaling组启动实例时。在您安装和配置其他软件时,此挂钩会将实例保持在Pending:Wait状态。

看起来我并非在这种情况下。此外,修改userdata脚本上的挂起钩子很复杂。必须有一个简单的解决方案来解决我的问题。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

EC2实例Userdata在完成执行之前不会使用生命周期挂钩来停止新启动的实例投入使用。

在用户数据脚本开始时停止使用Web服务器对我来说听起来有点不可靠,因此我建议您使用AutoScaling提供的功能来解决这个问题。

我有两点建议:

选项1:

通过docs阅读后,使用生命周期钩子并不复杂。在您的用户数据中,您可以轻松使用CLI来控制挂钩,检查this。事实上,可以使用任何支持的语言或脚本语言来控制钩子。

选项2:

如果手动处理生命周期钩子对您没有吸引力,那么我建议您删除用户数据脚本并使用AWS CodeDeploy进行解决。您可以让CodeDeploy不进行任何部署(例如,空S3文件夹),但您可以使用部署挂钩脚本来替换您的用户数据脚本。 Code Deploy与AutoScaling无缝集成,并自动处理生命周期挂钩。新推出的实例不会被AutoScaling投入使用,直到部署成功为止。阅读文档herehere以获取更多信息。

但是,我建议您选择1.生命周期钩子旨在解决您遇到的问题。他们强大,强大,令人敬畏和自由。使用它们。

答案 1 :(得分:-2)

@Brooks表示,在ELB服务该实例之前“等待”的最简单方法是处理ELB健康状况。

我通过在userdata脚本开头关闭http服务器解决了我的问题。因此,ELB不能具有绿色健康状态,并且它不会将客户端发送到实例。我在脚本结束时重新启动了http服务器,健康状况良好,所以ELB为它服务。