【问题标题】:How to implement custom health checks for EC2 instances without using an ELB?如何在不使用 ELB 的情况下为 EC2 实例实施自定义健康检查?
【发布时间】:2017-10-14 00:00:33
【问题描述】:

场景:

  • 我在自动扩展组后面运行 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

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

【问题讨论】:

标签: amazon-web-services docker amazon-ec2 health-monitoring


【解决方案1】:

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

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

AWS documentation on custom health checks:

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

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

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

【讨论】:

  • 我不太明白的是为什么要将健康状态设置为不健康而不是直接终止它。后者会节省一点时间。也许是为了跟踪,所以您可以看到实例被终止的原因是因为它不健康。
  • @MichaelRush 据我所知,还有两个额外的原因:在使用additional lifecycle hooks in the autoscaling group 时,或者在您仍然想要startup grace period 的情况下。
猜你喜欢
  • 2013-09-25
  • 2017-07-16
  • 2014-10-02
  • 2013-01-13
  • 2012-10-06
  • 2012-04-24
  • 2017-09-21
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多