AWS ASG实例删除后CloudWatch Agent指标分组异常的解决咨询
我正在为AWS自动扩缩容组(ASG)创建监控告警。用Namespace: "AWS/EC2"和MetricName: "CPUUtilization"创建的CPU利用率告警基于内置指标,运行正常。但内存利用率监控是通过启动模板在EC2实例上安装CloudWatch Agent实现的,使用Namespace: "CWAgent"和MetricName: "mem_used_percent"。
ASG终止实例后,CloudWatch Agent采集的指标仍会留在CloudWatch中。由于告警是基于自动扩缩容组维度分组的,告警会尝试包含已删除实例的指标,导致无法获取有效数据。我知道CloudWatch指标无法删除,想问有没有办法让告警仅对当前运行的实例指标分组?或者其他可行的解决方案?
CloudWatch Agent指标

内存告警

CPU利用率告警

amazon-cloudwatch-agent.json配置文件
{ "metrics": { "aggregation_dimensions": { "AutoScalingGroupName": "\${aws:AutoScalingGroupName}" }, "metrics_collected": { "disk":{ "resources":[ "/" ], "measurement":[ "used" ], "metrics_collection_interval": 60 }, "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 } } }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/messages", "log_group_name": "$log_group_name", "log_stream_name": "$log_stream_name", "timezone": "UTC" }, { "file_path": "/var/www/logs/app.log", "log_group_name": "$app_log_group_name", "log_stream_name": "$app_log_stream_name", "timezone": "UTC" } ] } }, "log_stream_name": "cloudwatch-agent", "force_flush_interval": 5 } }
1. 用动态过滤筛选运行中实例
创建告警时,选择CWAgent下的mem_used_percent指标,添加AutoScalingGroupName维度指定目标ASG,再开启动态过滤:设置维度为InstanceId,过滤条件为InstanceState:running。这样CloudWatch会自动忽略已终止实例的指标,只基于运行中的实例做聚合计算。
2. 修改Agent聚合配置保留实例维度
调整CloudWatch Agent的aggregation_dimensions配置,同时保留实例ID和ASG组维度:
"aggregation_dimensions": [ ["AutoScalingGroupName", "InstanceId"], ["AutoScalingGroupName"] ]
配置后,Agent会同时上报单实例的内存指标(带InstanceId)和ASG级别的聚合指标。后续告警直接基于ASG级别的聚合指标即可——实例终止后停止上报数据,ASG聚合会自动排除这些实例。
3. 用Metric Math过滤指标
如果不想修改Agent配置,可通过CloudWatch Metric Math手动筛选运行中实例的数据,再做聚合:
AVG(FILTER(METRICS("CWAgent", "mem_used_percent", "AutoScalingGroupName", "你的ASG名称"), "State", "running"))
将这个表达式作为告警的指标来源,就能仅计算运行中实例的内存利用率。
4. 生命周期钩子辅助(可选)
通过ASG生命周期钩子,在实例终止前触发脚本让CloudWatch Agent停止上报,不过这个方法只能处理即将终止的实例,无法消除已终止实例的历史指标影响,优先级低于前三种方案。
内容的提问来源于stack exchange,提问作者Ali Mohsan

