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

Phi*_*ßen 4 health-monitoring amazon-ec2 amazon-web-services docker

场景:

  • 我在自动缩放组后面运行EC2实例,但我没有使用ELB.
  • 在EC2实例内部,正在运行具有Web服务器的docker容器.

我想添加一个Web服务器仍然响应的简单运行状况检查,因此如果docker容器关闭,自动扩展组可以替换该实例.

从我看来,只有ELB支持自定义健康检查.由于我不需要ELB,我想知道使用cron作业在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
Run Code Online (Sandbox Code Playgroud)

我认为它应该可行,但看起来有点复杂.有没有更好的方法来实现自定义健康检查(不使用ELB)?

Phi*_*ßen 9

2017年,AWS没有直接支持,只有用于设置EC2实例运行状况的API.因此,问题中描述的技术是推荐的方式:

  • 实现自定义运行状况检查(可以是shell脚本或您选择的任何内容)并定期运行(通过cron或您选择的任何内容)
  • 使用autoscaling set-instance-healthAPI将结果传递给自动缩放组

AWS自定义运行状况检查文档:

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

使用以下set-instance-health命令将指定实例的运行状况设置为Unhealthy:

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

  • 我不太了解的是,为什么要直接将健康状况设置为不健康,而不是直接将其终止。后者将节省一些时间。也许是为了跟踪,所以您可以看到实例被终止的原因是因为它不健康。 (2认同)
  • 据我所知,@ MichaelRush有两个额外的原因:在[自动缩放组中使用其他生命周期挂钩]时,都可以使用(https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html ),或者在您仍需要[启动宽限期](https://docs.aws.amazon.com/autoscaling/ec2/userguide/healthcheck.html)的情况下。 (2认同)