如何在不使用ELB的情况下为EC2实例实现自定义健康检查?

13

场景:

  • 我正在运行一个EC2实例,它在自动扩展组中,但我没有使用ELB。
  • 在EC2实例内部,正在运行一个带有Web服务器的Docker容器。

我想添加一个简单的健康检查,以确保Web服务器仍然响应,因此如果Docker容器停止运行,自动缩放组可以替换实例。

从我的观察中得知,只有ELB支持定制健康检查。由于我不需要ELB,所以我想知道是否有意义在EC2实例内部运行一个定时任务来进行健康检查。如果Web服务器(本地)没有响应,那么它可以设置健康状态如下:

export INSTANCE=$(curl http://169.254.169.254/latest/meta-data/instance-id)
export AWS_DEFAULT_REGION=$(curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}')
aws autoscaling set-instance-health --instance-id $INSTANCE --health-status Unhealthy

我认为这应该可以工作,但看起来有点复杂。 是否有更好的方法实现自定义健康检查(而不使用ELB)?


我认为它可以工作,但看起来有点复杂。是否有更好的方法来实现自定义健康检查(而不使用负载均衡器ELB)?

2
看了一下 AWS 文档,这似乎是推荐的方式。-> http://docs.aws.amazon.com/autoscaling/latest/userguide/healthcheck.html#as-configure-healthcheck - Colwin
1
在EC2实例上运行cron的缺点是,如果您的应用程序启动不正确、崩溃等情况发生,那么EC2实例通过实例健康检查,但您的Web服务器无法正确响应。因此,最好在其他地方运行,比如定期的lambda函数(https://docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html)。这里有一个简单的示例,可以进行调整:http://marcelog.github.io/articles/aws_lambda_check_website_http_online.html - Michael Rush
1个回答

17

在2017年,AWS没有直接支持,只有API设置EC2实例的健康状态。因此,本问题所描述的技术是推荐的方法:

  • 实现自定义健康检查(可以是shell脚本或您选择的任何内容),并定期运行它(通过cron或您选择的任何方式)
  • 使用 autoscaling set-instance-health API将结果传达给自动缩放组

AWS关于自定义健康检查的文档:

如果您有自定义健康检查,则可以将健康检查的信息发送到Auto Scaling,以便Auto Scaling可以使用此信息。例如,如果您确定某个实例未按预期运行,则可以将该实例的健康状态设置为Unhealthy。下次Auto Scaling对该实例执行健康检查时,它将确定该实例处于不健康状态,然后启动一个替换实例。

使用以下set-instance-health命令将指定实例的健康状态设置为Unhealthy:

aws autoscaling set-instance-health --instance-id i-123abc45d –-health-status Unhealthy


5
我不太明白的是为什么要将健康状态设置为不健康,而不是直接终止它。后者会节省一些时间。也许是为了追踪,这样您就可以看到实例被终止的原因是因为它不健康。 - Michael Rush
4
据我所知,有两个额外的原因:一是在使用自动缩放组中的其他生命周期钩子时,另一个是在你仍希望具有启动宽限期的情况下。 - Ivo Merchiers

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