如何在CloudWatch告警ALARM状态下获取当前阈值?求分级告警替代方案
问题描述
现有以下Terraform配置的EC2 CPU利用率CloudWatch告警(阈值80%):
resource "aws_cloudwatch_metric_alarm" "ec2-high-cpu-alarm" { count = length(local.monitor_instance_tags) alarm_name = "ec2-high-cpu-alarm-for-${local.monitor_instance_tags[count.index]}" comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = "1" metric_name = "CPUUtilization" namespace = "AWS/EC2" period = var.alarm_monitor_period statistic = "Average" threshold = "80" alarm_description = "This metric monitors ec2 cpu utilization exceeding 80%" dimensions = { InstanceId = local.monitor_instance_ids[count.index] } alarm_actions = local.alarm_notify_actions ok_actions = local.alarm_notify_actions insufficient_data_actions = [] actions_enabled = true }
需求:当CPU利用率处于80%-90%时接收WARNING通知,超过90%时接收CRITICAL ALARM通知。但CloudWatch仅支持OK、INSUFFICIENT_DATA、ALARM三种状态,无原生WARNING状态。
核心问题:
- 如何在ALARM状态触发时获取当前告警的阈值,从而在通知消息中添加WARNING/CRITICAL标签?
- 如果无法在告警创建阶段实现,有没有不需要为同一指标创建多个告警的替代方案?
解决方案
一、在ALARM状态中获取阈值的方法
CloudWatch告警触发的通知(如SNS消息)会包含告警元数据,其中Trigger字段下的Threshold就是当前告警的阈值。你可以在通知接收端(如Lambda函数)解析该值,结合实际CPU利用率判断通知等级:
- 当实际利用率≥80%且<90%时,标记为WARNING
- 当实际利用率≥90%时,标记为CRITICAL ALARM
示例SNS消息关键字段:
{ "AlarmName": "ec2-high-cpu-alarm-for-instance-xxx", "Trigger": { "Threshold": 80.0, "MetricName": "CPUUtilization", "Namespace": "AWS/EC2" }, "NewStateReason": "Threshold Crossed: 1 datapoint [85.0 (12/01/24 10:00:00)] was greater than or equal to the threshold (80.0)." }
你可以从NewStateReason中提取实际CPU数值,或调用CloudWatch API查询对应时间点的指标数据,再结合阈值完成判断。
二、无需多告警的替代方案
通过单告警+Lambda处理通知的方式实现分级通知,无需创建多个告警:
- 保留原有告警,将阈值设为80%,把
alarm_actions指向Lambda函数(而非直接指向SNS主题) - Lambda函数接收CloudWatch告警事件后,解析实际CPU利用率:
- 用正则从
NewStateReason字段提取数值(如匹配\[(\d+\.\d+)) - 或调用
get-metric-statisticsAPI查询实例对应时间段的CPU数据
- 用正则从
- 根据数值范围发送对应等级的通知:
- 80% ≤ 利用率 <90%:发送带WARNING标签的消息到通知渠道
- 利用率 ≥90%:发送带CRITICAL ALARM标签的消息到通知渠道
- Lambda可配置将不同等级消息发送到同一或不同SNS主题,再推送给用户。
这种方式只需维护一个CloudWatch告警,通过后端处理实现分级通知,避免冗余配置。
内容的提问来源于stack exchange,提问作者mkRuby009
相关产品推荐
相关产品推荐

