如何使EC2实例在ELB表示不可用时自动重启?

6

时不时地,弹性负载均衡器(ELB)会因为我的某个服务器不可用而将其踢出。这很好——几乎没有中断。

通常,在AWS控制台上重新启动实例就可以解决问题。

我希望当我的EC2实例不可用时,它能够自动重启。

最佳方法是什么?(它恰巧是一个Windows实例,但理论上这不应该有影响)

6个回答

5

同意 @agmin 的观点,lambda函数是实现这个功能的好方法。您可以通过SNS主题配置CloudWatch警报来触发lambda函数。

我编写了这个实现,它似乎运行良好。可以完全通过命令行设置和配置:

https://github.com/jcowley/elb-instance-reboot


5

使用自动扩展组并将其设置为保持1个活动实例。如果您的实例崩溃,它将从预定义的实例映像中生成一个新实例。这很容易和方便。


虽然如此,通常重新启动有问题的实例可以解决问题,而重新启动比启动一个新实例快得多…… - Jordan Reiter

5
我购买了一台便宜的EC2微型实例,并编写了一个简单的脚本,列出了我在EC2上的所有服务器,并对每个服务器进行GET请求以确保其正常运行。如果某个服务器无法正常运行,我的脚本会重新启动它。我将脚本每10分钟运行一次。
如果有一个服务可以为我完成这项工作,那么这将会更加容易,但是这个系统很容易设置,而且微型实例价格便宜。

5
如果您的微型实例崩溃了,怎么办? - Nathan Binkert
1
目前已经发生了这种情况。现在我收到了Pingdom的警报。然而,理想情况下,我应该让生产服务器检查微服务,而微服务则应该检查生产环境。唉。 - pk1557
1
你想分享这个脚本吗? - Mike
@Mike - 这是一个ColdFusion脚本,我猜对你没什么用处。 - pk1557

3

编写一个Lambda函数!

相比运行微实例,它更便宜,并且您可以将其设置为运行在任何您想要的时间间隔。您还可以使用CloudWatch监控它,因此无需单独检查微实例的健康状况。

我正在使用ElasticBeanstalk,它提供了describeInstancesHealth端点。或者,您可以使用ec2的describeInstanceStatus端点。

然后,如果检测到不良实例,则ec2的rebootInstances允许您重新启动一个或多个实例。


3
一般来说,您应该使用自动扩展组设置负载均衡器。自动扩展组将包含关于服务器配置的信息。例如,它将具有ami和可能的用户数据文件,这使得可以在没有任何用户交互的情况下进行配置。当这两个服务配合使用时,负载均衡器将终止失败的实例并立即启动新实例。
考虑到您正在使用Windows实例,您可以编写powershell脚本来配置服务器,并使用CloudInit.NET在服务器启动时执行该脚本。脚本的最后一部分应启用对负载均衡器的检查。

这是很好的信息,但出于各种原因,我仍然更喜欢简单地重新启动,而不是终止->新实例。 - pk1557
1
你可以尝试使用新的ec2-describe-instance-status命令,并编写一个脚本,在实例宕机时重新启动实例。此脚本还需要将实例添加回负载均衡器。编写这个脚本非常容易。一旦脚本完成,将其放入crontab中,只要运行脚本的机器正常工作,它就会正常工作。http://aws.typepad.com/aws/2012/01/ec2-instance-status-checks.html - bwight

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接