You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:46:45