如何在AWS EC2/Lambda/DRS中实现网页健康检查与自动化故障转移?
定制化健康检查+DRS自动故障转移方案
针对你的场景(EC2服务器崩溃/冻结仍返回200、无法使用负载均衡、DNS故障转移不可靠),以下是可行的自动化故障转移方案:
一、业务级深度健康检查脚本
常规HTTP 200检查无法识别"服务器活着但业务瘫痪"的情况,必须做深度检查:
- 编写脚本同时验证业务接口有效性和服务器资源状态,示例Shell脚本如下:
#!/bin/bash # 1. 验证业务健康接口的状态和返回内容 HTTP_RESPONSE=$(curl -s -w "%{http_code}" http://localhost/health/check) HTTP_BODY=$(echo "$HTTP_RESPONSE" | sed -e 's/[0-9]\{3\}$//') HTTP_CODE=$(echo "$HTTP_RESPONSE" | grep -Eo '[0-9]{3}$') if [ "$HTTP_CODE" != "200" ] || [[ ! "$HTTP_BODY" =~ "\"status\": \"healthy\"" ]]; then exit 1 fi # 2. 检查15分钟CPU负载阈值(可根据业务调整) CPU_LOAD=$(uptime | awk -F 'load average:' '{print $2}' | awk -F ',' '{print $3}' | xargs) if (( $(echo "$CPU_LOAD > 8.0" | bc -l) )); then exit 1 fi # 3. 检查内存使用率阈值 MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}') if (( $(echo "$MEM_USAGE > 90.0" | bc -l) )); then exit 1 fi # 4. 验证核心业务进程是否存活(以Nginx为例) if ! pgrep nginx > /dev/null; then exit 1 fi exit 0
- 把脚本放在EC2实例上,用cron定时执行(比如每分钟一次),执行结果输出到日志文件(如
/var/log/health_check.log)。
二、CloudWatch监控与告警
- 部署CloudWatch Agent到EC2实例,配置收集上述日志文件,创建自定义指标
HealthCheckStatus(0=健康,1=故障)。 - 创建CloudWatch告警规则:当
HealthCheckStatus连续3次为1时触发告警(可根据业务容忍度调整次数和频率)。
三、Lambda联动DRS自动故障转移
- 创建SNS主题,将CloudWatch告警的触发动作关联到该主题。
- 编写Lambda函数,订阅SNS主题,触发时调用DRS API启动故障转移:
import boto3 def lambda_handler(event, context): drs_client = boto3.client('drs') # 替换为你的DRS恢复计划ID recovery_plan_id = "rp-xxxxxx" try: response = drs_client.start_recovery( recoveryPlanID=recovery_plan_id, isDrill=False, tags={"Trigger": "AutoFailover"} ) print(f"自动故障转移已触发: {response}") return {'statusCode': 200, 'body': '故障转移启动成功'} except Exception as e: print(f"故障转移失败: {str(e)}") raise e
- 给Lambda配置IAM权限:允许调用
drs:StartRecovery、drs:GetRecoveryPlan等DRS相关操作,以及必要的日志权限。
四、优化DNS切换可靠性
如果仍需DNS层面的切换,可结合Route 53+CloudWatch指标健康检查:
- 在Route 53创建健康检查,选择"CloudWatch指标"类型,关联
HealthCheckStatus指标,当指标为1时标记实例不健康。 - 配置主EC2和DRS恢复实例的Route 53加权记录(主记录权重设为100,备记录设为10),当主实例不健康时,Route 53自动将流量导向备实例。
- 提前给DRS恢复实例分配弹性IP,确保备记录的IP固定。
关键注意事项
- 务必做故障演练:模拟服务器崩溃、业务进程挂掉等场景,验证健康检查、告警、故障转移的全流程是否正常。
- 调整阈值:根据业务的资源占用情况,修改脚本中的CPU、内存阈值,避免误触发或漏触发。
- 权限验证:检查Lambda、CloudWatch Agent、DRS的IAM权限是否完整,避免因权限不足导致流程中断。
内容的提问来源于stack exchange,提问作者Lord Beerus
相关产品推荐
相关产品推荐

