如何实现AWS EC2自动扩缩容的定期健康上报式自定义健康检查?
实现EC2自动扩缩容组基于心跳上报的健康检查
完全可以实现这种「无心跳即判定不健康」的逻辑,刚好能覆盖实例因严重故障无法主动上报的场景,下面是两种落地性强的实现方案:
方案一:基于自定义心跳+Lambda定期校验
步骤1:配置实例定期发送心跳
在实例的健康检查脚本中,除了故障时上报Unhealthy,每5分钟主动执行一次心跳上报:
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) aws autoscaling set-instance-health --instance-id $INSTANCE_ID --health-status Healthy --region <你的区域>
给实例绑定的IAM角色添加autoscaling:SetInstanceHealth权限,避免硬编码AWS凭证。
步骤2:搭建Lambda校验逻辑
- 创建一个Lambda函数,核心逻辑:
- 调用
aws autoscaling describe-auto-scaling-instances获取目标扩缩容组内所有实例的健康状态更新记录 - 遍历每个实例,计算当前时间与最近一次
Healthy状态更新时间的间隔 - 若间隔超过预设阈值(比如6分钟,留1分钟缓冲避免网络延迟),调用
aws autoscaling set-instance-health将实例标记为Unhealthy
- 调用
- 用EventBridge设置一个5分钟间隔的定时规则,触发这个Lambda函数
- 给Lambda的IAM角色添加
autoscaling:DescribeAutoScalingInstances和autoscaling:SetInstanceHealth权限
方案二:基于CloudWatch自定义指标+告警
步骤1:实例推送心跳指标
在实例内每5分钟推送一个自定义CloudWatch指标:
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) aws cloudwatch put-metric-data --namespace "ASGHeartbeat" --metric-name "InstanceAlive" --value 1 --dimensions InstanceId=$INSTANCE_ID --region <你的区域>
实例IAM角色需添加cloudwatch:PutMetricData权限。
步骤2:配置告警触发不健康标记
- 针对每个实例的
InstanceAlive指标,创建CloudWatch告警:当指标在5分钟内无数据点时触发告警 - 将告警的目标动作设置为调用Lambda函数,Lambda函数收到告警后,提取实例ID并调用
aws autoscaling set-instance-health标记为Unhealthy
注意事项
- 阈值设置要留缓冲:比如心跳间隔5分钟,判定无心跳的阈值设为6分钟,避免临时网络波动导致误判
- 权限最小化:无论是实例还是Lambda的IAM角色,只授予必要的权限,不要过度授权
- 多AZ场景:确保EventBridge、Lambda和自动扩缩容组处于同一区域,避免跨区域延迟问题
内容的提问来源于stack exchange,提问作者Bing Ren
相关产品推荐
相关产品推荐

