我们有一个自动伸缩组用于我们的一个云形成堆栈,该堆栈具有基于CPU的警报,用于确定何时扩展实例。
这很棒,但是我们最近将它从一个节点扩展到三个节点,其中一个节点无法通过cfn-init引导。一旦工作负载减少并且组缩小到一个节点,它就会杀死两个好实例,并将部分引导的节点作为唯一剩余的实例。这意味着我们停止处理工作,直到有人登录并重新运行引导过程。
显然这是不理想的。当节点不在ELB后面时,通知自动伸缩组节点不健康的最佳方法是什么?
由于这只是初始引导,我真正想要的是与自动伸缩组通信,该节点失败,并终止它,并在其位置上启动一个新节点。
一个同事刚刚给我看了http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-configure-healthcheck.html,看起来很方便。
如果您有自己的健康检查系统,您可以使用健康检查系统的信息来设置Auto Scaling组中实例的健康状态。
UPDATE -我设法在启动时使此工作。
ASG的UserData部分如下:
#!/bin/bash -v
set -x
export AWS_DEFAULT_REGION=us-west-1
cfn-init --region us-west-1 --stack bapi-prod --resource LaunchConfiguration -v
if [[ $? -ne 0 ]]; then
export INSTANCE=`curl http://169.254.169.254/latest/meta-data/instance-id`
aws autoscaling set-instance-health
--instance-id $INSTANCE
--health-status Unhealthy
fi
cfn-init --region us-west-1 --stack bapi-prod --resource LaunchConfiguration -v
if [[ $? -ne 0 ]]; then
export INSTANCE=`curl http://169.254.169.254/latest/meta-data/instance-id`
aws autoscaling set-instance-health
--instance-id $INSTANCE
--health-status Unhealthy
fi
也可以作为一行代码来完成。例如,我在Terraform中使用以下代码:
runcmd:
- /tmp/runcmd-puppet.sh || { export INSTANCE=`curl http://169.254.169.254/latest/meta-data/instance-id`; aws autoscaling --region eu-west-1 set-instance-health --instance-id $INSTANCE --health-status Unhealthy; }