如何在AWS CloudWatch中监控Auto Scaling Groups的内存与磁盘利用率
在AWS CloudWatch中收集Auto Scaling Groups的内存与磁盘指标
Auto Scaling Groups(ASG)本身没有原生的内存/磁盘指标——这些指标本质来自组内的EC2实例。要实现ASG层面的聚合监控,你需要基于已收集的EC2实例指标,按ASG维度进行聚合处理,步骤如下:
1. 确认EC2实例的CloudWatch Agent配置
你已经成功收集EC2的内存/磁盘指标,只需确保ASG内所有新启动的实例都会自动继承CloudWatch Agent配置:
- 检查ASG的启动模板/配置,确认CloudWatch Agent已包含在启动脚本或自定义AMI中;
- 验证Agent配置文件(如
amazon-cloudwatch-agent.json)中确实包含内存(mem_used_percent、mem_available等)和磁盘(disk_used_percent、disk_free等)指标的收集规则。
2. 为ASG添加可继承的标签
要按ASG维度聚合指标,需给ASG添加标签并确保实例自动继承:
- 进入Auto Scaling控制台,找到目标ASG,在「标签」页面添加标签(如
Key: AutoScalingGroupName, Value: <你的ASG名称>); - 勾选「Add tag to instances」,确保新加入ASG的实例自动带上该标签。
3. 聚合ASG层面的指标
方法一:使用CloudWatch原生指标聚合
直接在CloudWatch控制台通过指标数学实现ASG维度的聚合:
- 进入CloudWatch → 指标 → 自定义命名空间(通常是
CWAgent); - 筛选出内存/磁盘指标,按
AutoScalingGroupName维度过滤; - 点击「添加数学表达式」,使用聚合函数生成ASG层面的指标,例如:
- 计算ASG平均内存使用率:
AVG(METRICS("CWAgent", "mem_used_percent", "AutoScalingGroupName", "MyASG")) - 计算ASG磁盘使用率最大值:
MAX(METRICS("CWAgent", "disk_used_percent", "AutoScalingGroupName", "MyASG"))
- 计算ASG平均内存使用率:
- 保存表达式为自定义指标,即可在仪表盘或告警中直接使用。
方法二:用Lambda实现自定义聚合(适合复杂场景)
如果需要更灵活的聚合逻辑(比如排除异常实例、按实例类型加权等),可以用Lambda定期计算并发布ASG聚合指标:
import boto3 from datetime import datetime, timedelta cloudwatch = boto3.client('cloudwatch') asg_client = boto3.client('autoscaling') def lambda_handler(event, context): asg_name = "YourASGName" # 获取ASG下的活跃实例 asg_details = asg_client.describe_auto_scaling_groups(AutoScalingGroupNames=[asg_name])['AutoScalingGroups'][0] active_instances = [inst['InstanceId'] for inst in asg_details['Instances'] if inst['LifecycleState'] == 'InService'] if not active_instances: return # 查询最近5分钟的实例内存使用率 metric_stats = cloudwatch.get_metric_statistics( Namespace='CWAgent', MetricName='mem_used_percent', Dimensions=[{'Name': 'InstanceId', 'Value': id} for id in active_instances], StartTime=datetime.utcnow() - timedelta(minutes=5), EndTime=datetime.utcnow(), Period=300, Statistics=['Average'] ) # 计算ASG平均内存使用率 total_avg = sum(dp['Average'] for dp in metric_stats['Datapoints']) asg_avg_mem = total_avg / len(active_instances) # 发布聚合指标到自定义命名空间 cloudwatch.put_metric_data( Namespace='Custom/ASGMetrics', MetricData=[ { 'MetricName': 'AvgMemUsedPercent', 'Dimensions': [{'Name': 'AutoScalingGroupName', 'Value': asg_name}], 'Value': round(asg_avg_mem, 2), 'Unit': 'Percent' } ] )
- 给Lambda配置定时触发(比如每5分钟一次);
- 确保Lambda拥有
cloudwatch:GetMetricStatistics、cloudwatch:PutMetricData和autoscaling:DescribeAutoScalingGroups的IAM权限。
4. 配置ASG监控仪表盘与告警
- 将聚合后的ASG指标添加到CloudWatch仪表盘,直观查看整体资源状态;
- 创建告警规则:当ASG的平均内存/磁盘使用率超过阈值时,通过SNS发送通知或触发ASG扩容动作。
内容的提问来源于stack exchange,提问作者dba qcs
相关产品推荐
相关产品推荐

