由于用户数据脚本,AWS 自动扩展启动未就绪的实例

Nek*_*Nek 4 amazon-ec2 amazon-web-services

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

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

这是一个问题,因为在执行 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 脚本上的挂起钩子很复杂。必须有一个简单的解决方案来解决我的问题。

感谢您的帮助 !

mic*_*zer 5

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

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

我有两个建议:

  • 选项1:

    阅读完文档后,使用生命周期钩子一点也不复杂。并且在您的用户数据中,您可以轻松地使用 CLI 来控制钩子,看看这个。事实上,可以从任何支持的语言或脚本语言控制一个钩子。

  • 选项 2:

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

但是,我会敦促您选择选项 1。生命周期挂钩旨在解决您遇到的问题。它们强大、健壮、出色且免费。使用它们。


Nek*_*Nek 3

@Brooks 说,在 ELB 为实例提供服务之前“等待”的最简单方法是处理 ELB 健康状态。

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