本文由『云枢国际/TG @yunshuguoji-亚马逊云代理商 撰写』如需转载请注明!
保障 Amazon Elastic Compute Cloud (Amazon EC2) 的高可用性是运维的核心任务。传统的人工值守模式在面对突发故障时响应滞后,且人力成本较高。通过结合 Amazon CloudWatch 与 AWS Lambda 构建自动化脚本(DevOps Agent),可以实现对 EC2 异常的秒级响应,例如在状态检查失败时自动重启或在资源耗尽时执行隔离。
本文介绍如何配置 CloudWatch 触发 Lambda 脚本的逻辑与部署步骤,适用于云系统管理员和 DevOps 工程师参考。
自动化值守的架构逻辑
1. 传统模式与自动化改进
在传统运维中,EC2 硬件故障或系统无响应通常依赖人工接收告警后手动排障。引入 AWS Lambda 后,系统转变为事件驱动模式:在接收到告警的瞬间执行预设代码,完成实例恢复,从而缩短平均恢复时间 (MTTR)。
2. 核心组件联动
该方案主要依赖以下 AWS 原生服务的协作:
* 数据源: Amazon EC2 产生运行指标。
* 监控层: Amazon CloudWatch 收集指标并在突破阈值时触发告警。
* 路由层: Amazon EventBridge 或 Amazon SNS 捕获告警状态变化并传递事件。
* 执行层: AWS Lambda 接收事件并调用 Python (Boto3) 脚本执行重启、停止或打标签等操作。
表 1:常见 EC2 异常监控指标与处理策略
| 监控指标 (CloudWatch Metric) | 异常场景 | 自动化处理策略 (Lambda Action) |
|---|---|---|
StatusCheckFailed_System | 底层硬件或网络故障 | 停止并启动实例(触发迁移) |
StatusCheckFailed_Instance | 操作系统崩溃或内存耗尽 | 自动重启 (Reboot) |
CPUUtilization | CPU 持续满载 | 触发内存转储或隔离实例 |
NetworkIn / NetworkOut | 流量异常(疑似受攻击) | 修改安全组执行网络隔离 |
前置条件准备
在部署相关配置前,需完成以下准备工作:
1. 开启详细监控
默认的 EC2 基础监控频率为 5 分钟。若需提高响应速度,建议在控制台中为目标实例开启“详细监控”,将指标采集频率提升至 1 分钟。
2. 配置 IAM 权限
AWS Lambda 需具备操作 EC2 和记录日志的权限。请在 IAM 中为 Lambda 执行角色配置以下策略:
* 日志权限: logs:CreateLogGroup, logs:CreateLogStream, logs:PutLogEvents。
* EC2 操作权限: ec2:DescribeInstances, ec2:RebootInstances, ec2:StopInstances, ec2:StartInstances。
注:截至 2026 年 8 月,AWS 控制台界面可能存在微调,请以实际操作路径为准,并遵循最小权限原则。
实操步骤:构建异常处理脚本
以处理 StatusCheckFailed 异常为例,具体步骤如下:
步骤一:编写 Lambda 脚本
在 AWS Lambda 控制台中创建 Python 3.x 函数,并绑定上述 IAM 角色。使用 Boto3 编写如下处理逻辑:
import boto3
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
ec2_client = boto3.client('ec2')
def lambda_handler(event, context):
logger.info(f"Received event: {json.dumps(event)}")
try:
# 解析 EventBridge 传递的告警名称
alarm_name = event['detail']['alarmName']
instance_id = extract_instance_id_from_event(event)
if instance_id:
logger.info(f"Instance {instance_id} 触发告警 {alarm_name},正在重启...")
response = ec2_client.reboot_instances(InstanceIds=[instance_id])
return {
'statusCode': 200,
'body': f'Successfully rebooted {instance_id}'
}
else:
logger.warning("事件载荷中未发现 Instance ID")
except Exception as e:
logger.error(f"处理失败: {str(e)}")
raise e
def extract_instance_id_from_event(event):
# 适配 2026 年 CloudWatch Alarm 载荷结构解析 InstanceId
metrics = event.get('detail', {}).get('configuration', {}).get('metrics', [])
for metric in metrics:
dimensions = metric.get('metricStat', {}).get('metric', {}).get('dimensions', {})
if 'InstanceId' in dimensions:
return dimensions['InstanceId']
return None
步骤二:创建 CloudWatch 告警
- 在 CloudWatch 控制台中进入“每实例指标”。
- 选择目标实例的
StatusCheckFailed_Instance。 - 设置阈值:例如“>= 1”,评估期设为“连续 2 个数据点”。
步骤三:配置事件触发
使用 Amazon EventBridge 路由事件:
1. 创建规则,事件模式选择“CloudWatch Alarm State Change”。
2. 将目标设置为上述 Lambda 函数。
3. 保存后,当告警状态变为 ALARM 时,将自动触发重启逻辑。
常见问题解答 (FAQ)
1. AWS Lambda 是什么,适合哪些场景,选型时要确认什么?
AWS Lambda 是事件驱动的无服务器计算服务,可在无需管理服务器的情况下按事件或请求运行代码。适合自动化运维脚本执行、数据实时处理、API 后端等场景。采购与选型前应核对地域、版本、配额、计费项和开通条件,不能只按产品名称判断。通常按请求次数、执行时长、分配的计算或内存资源及网络用量计费;预置并发、专有实例或高级能力可能另行计费。先明确业务规模、性能、可用性、数据保护、网络和运维要求,再核对当前产品支持矩阵。
2. AWS CloudWatch 是什么,适合哪些场景,选型时要确认什么?
Amazon CloudWatch 是 AWS 的监控与可观测服务,可收集指标、日志和事件,创建告警并观察云资源和应用状态。适合资源利用率监控、应用日志集中分析、异常告警触发等场景。采购前应核对地域、版本、配额、计费项和开通条件。基础指标可能包含免费额度,高级指标、自定义指标、告警、日志、追踪和长期保留可能按用量计费。选型时需结合业务规模、性能、可用性、数据保护、网络与运维要求核对当前支持矩阵。
3. 如何使用 AWS Lambda 自动处理 EC2 告警?
核心流程分为三步:首先,为 Lambda 赋予操作 EC2(如重启、停止)的 IAM 权限并编写 Boto3 处理脚本;其次,在 CloudWatch 中针对 EC2 的关键指标(如状态检查失败、CPU 异常)设置告警阈值;最后,通过 Amazon EventBridge 或 SNS 捕获告警状态变更事件,并将其作为触发器调用 Lambda 函数,从而实现自动化响应。
4. AWS CloudWatch 监控 EC2 异常的最佳实践是什么?
最佳实践包括:根据业务敏感度开启 1 分钟级别的详细监控;针对底层硬件和操作系统分别监控 StatusCheckFailed_System 和 StatusCheckFailed_Instance;合理设置告警评估期(如连续 2-3 个周期异常才触发),以避免网络瞬断导致的误报;同时,将指标监控与日志监控(CloudWatch Logs)结合,实现多维度的可观测性。
5. AWS CloudWatch 触发 Lambda 处理 EC2 告警的延迟通常是多少?
整个触发链路的延迟通常在几秒到一分钟左右,具体取决于监控指标的采集频率和告警评估期。例如,如果开启了 1 分钟详细监控,并设置连续 2 个周期触发告警,那么从异常发生到 Lambda 被触发,大约需要 2 到 3 分钟的时间。EventBridge 路由事件到 Lambda 的过程通常在毫秒到秒级完成。
6. 如果 Lambda 自动处理脚本执行失败,如何设置后备的告警通知机制?
为了防止自动化处理失效(如 IAM 权限不足或 API 节流),应为 Lambda 函数配置死信队列(DLQ,如 SQS 或 SNS)或使用 Lambda 目标(Destinations)功能。当 Lambda 异步调用失败达到最大重试次数后,失败事件会被发送至 DLQ 或 SNS 主题,随后可通过邮件、短信或第三方工具通知人工运维团队介入。
作者:云枢国际/yunshuguoji