Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 由于userdata脚本,AWS自动缩放启动未就绪实例_Amazon Web Services_Amazon Ec2 - Fatal编程技术网

Amazon web services 由于userdata脚本,AWS自动缩放启动未就绪实例

Amazon web services 由于userdata脚本,AWS自动缩放启动未就绪实例,amazon-web-services,amazon-ec2,Amazon Web Services,Amazon Ec2,我有一个很好用的自动缩放功能,在launchconfiguration中我定义了一个userdata脚本,该脚本在新实例启动时执行 用户脚本更新基本代码并生成缓存,这需要几秒钟的时间。但一旦实例被“创建”(而不是“准备就绪”),自动缩放就会将其添加到负载平衡器中 这是一个问题,因为在执行userdata脚本时,实例的响应不是很好(基本上抛出500个错误) 我希望避免,当然,我看到了以下文档: 与独立EC2实例一样,您可以选择使用用户数据配置启动到自动缩放组中的实例。例如,可以使用AWS管理控制台

我有一个很好用的自动缩放功能,在launchconfiguration中我定义了一个userdata脚本,该脚本在新实例启动时执行

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

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

我希望避免,当然,我看到了以下文档:

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

如果您有无法使用配置脚本安装的软件,或者如果您需要在自动缩放将实例添加到组之前手动修改软件,请在自动缩放组中添加一个生命周期挂钩,在自动缩放组启动实例时通知您。在安装和配置附加软件时,此挂钩将实例保持在Pending:Wait状态

看来我不在这个案子里。此外,修改userdata脚本上的挂起钩子也很复杂。一定有一个简单的解决办法来解决我的问题


谢谢你的帮助

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


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

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

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

我有两个建议:

  • 选项1:

    一旦通读了本文,使用生命周期挂钩一点也不复杂。在用户数据中,您可以轻松地使用CLI来控制钩子、签出。事实上,钩子可以通过任何支持的语言或脚本语言进行控制

  • 选项2:

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


然而,我敦促你选择方案1。生命周期挂钩的设计就是为了解决您所面临的问题。它们强大、健壮、令人敬畏且自由。使用它们。

我不确定我是否理解这是一个问题的原因。当实例被“创建”并自动缩放将其添加到ELB时,ELB将测试该实例,并且该实例需要通过您配置的运行状况检查次数,然后ELB才能使其可用。当然,你需要进行健康检查,这样当你的用户数据脚本执行时它会失败。你的意思是当用户数据没有完全执行时,AWS认为这个实例是“健康的”?EC2在VM运行时(例如当OS启动时,AMI已经完全启动等)认为该实例是“健康的”。它不考虑用户数据命令是否已完成。例如,我经常使用SSH连接到一个新实例,跟踪日志文件,并在执行userdata命令时观察其输出。但是,除此之外,ELB不会认为该实例是健康的,并且开始发送流量直到它通过您启动ELB时所配置的健康检查。所以,这就是你需要关注的地方。谢谢。我通过在userdata脚本开始时关闭http服务器解决了问题。因此,loadbalancer不能具有绿色运行状况,并且它不会将客户端发送到实例。我在脚本结束时重新启动http服务器,运行状况良好,因此ELB将为其提供服务。生命周期使用起来很复杂,因为您无法确保从SQS检索到当前实例的良好消息。可能有一种解决方法,比如将当前实例中不关心的消息重新放入队列,但并发性呢?:/所有这些问题都引导我找到另一个解决方案,那就是使用健康状态。正如我在回答中所说,生命周期挂钩并不难使用。请阅读文档并熟悉核心概念。我不知道你在谈论什么关于SQS,你在这篇文章的其他地方没有提到SQS。也许您需要详细说明您的特定用例?使用已经构建和设计的工具来解决您的问题,不要重新发明轮子。我敦促您遵循文档,尝试使用生命周期挂钩测试解决方案。我不想使用代码部署进行部署:我们有一个复杂的部署过程和一个部署脚本(使用fabric和boto),而且代码部署不是免费的,因此改为付费解决方案意味着双重成本(我说的是开发成本)这不是一个真正的好办法。另外,我知道doc(正如我在第一篇文章中所说的),我尝试使用生命周期挂钩,使用SQS(主题订阅看起来像一个笑话,因为它重定向)