求助:Boto3无法输出AWS实例平均CPU利用率的代码问题
排查Boto3获取EC2实例CPU平均利用率的循环问题
我看你现在用Boto3调用CloudWatch API能拿到返回的response,但最后for循环打印不出平均CPU利用率,大概率是几个常见的小问题导致的,咱们一步步来理:
先看你代码里可能缺的关键参数
首先,get_metric_statistics方法有几个关键参数你可能没加,这会导致返回的Datapoints为空或者数据不符合预期:
Period:必须指定统计周期(比如300秒/5分钟,要和CloudWatch的存储粒度匹配)Statistics:明确指定要获取Average,不然默认可能返回其他统计值(比如Sum)- 时间要用UTC:CloudWatch的时间都是UTC时区,如果你用本地时间计算StartTime,会拿不到对应的数据
修正后的完整代码
我把你的代码补全并修正了循环部分,你可以参考:
import boto3 import sys from datetime import datetime, timedelta # 初始化CloudWatch客户端 client = boto3.client('cloudwatch') # 调用API获取指标数据 response = client.get_metric_statistics( Namespace='AWS/EC2', MetricName='CPUUtilization', Dimensions=[ { 'Name': 'InstanceId', 'Value': 'i-1234abcd' # 替换成你的实例ID }, ], StartTime=datetime.utcnow() - timedelta(minutes=60), # 最近60分钟的数据 EndTime=datetime.utcnow(), Period=300, # 5分钟统计周期,和EC2默认的CloudWatch粒度匹配 Statistics=['Average'], # 指定获取平均值 Unit='Percent' # 指定单位,避免返回其他格式 ) # 遍历Datapoints打印平均CPU利用率 # 注意:response里的核心数据在'Datapoints'列表里,不是直接遍历response if 'Datapoints' in response and len(response['Datapoints']) > 0: # 按时间排序,方便查看顺序 sorted_datapoints = sorted(response['Datapoints'], key=lambda x: x['Timestamp']) for point in sorted_datapoints: timestamp = point['Timestamp'].strftime('%Y-%m-%d %H:%M:%S UTC') avg_cpu = point['Average'] print(f"时间: {timestamp} | 平均CPU利用率: {avg_cpu}%") else: print("没有找到匹配的CPU利用率数据,请检查实例ID、时间范围或参数设置")
几个关键的修复点
- 补全了
Period、Statistics和Unit参数,确保API返回正确的平均利用率数据 - 循环时明确遍历
response['Datapoints']列表,而不是整个response字典 - 增加了空数据的判断,避免报错
- 把时间转成了易读的格式,同时保留UTC标识
你可以先检查自己的代码是不是漏了这些参数,或者循环的时候没拿到Datapoints列表。如果还是有问题,可以打印response['Datapoints']看看里面的结构,确认键名是不是正确(比如有没有拼写错误Average)。
内容的提问来源于stack exchange,提问作者jmoorhead
相关产品推荐
相关产品推荐

