如何单次调用API批量获取多台EC2的CloudWatch监控指标
报错原因
GetMetricData接口强制要求MetricDataQueries参数内的所有查询条目Id值全局唯一,你给两台EC2的CPU利用率查询配置了完全相同的Id: 'cpuUtilization',因此触发参数校验错误。
单次调用获取多EC2指标的实现方法
不需要拆分多次调用,只要给每个实例对应的查询配置分配唯一的Id,即可在单次API请求中拉取任意数量(不超过接口配额)的EC2实例监控指标,返回结果会按Id维度拆分,直接对应到不同实例。
建议直接将实例ID拼接进查询Id中,后续解析结果时不需要额外维护映射关系,就能直接把数据和EC2实例对应上。
可运行代码示例
import boto3 from datetime import datetime from dateutil.tz import tzutc session = boto3.Session(profile_name="XXXXXXXXXX") client = session.client('cloudwatch', 'ap-northeast-2') # 替换为你需要查询的EC2实例ID列表 target_instances = ["i-0abc123def456", "i-0def789ghi012", "i-0jkl345mno678"] query_list = [] for ins_id in target_instances: # 生成唯一查询ID,拼接实例ID方便后续匹配结果 # 注意:Id字段仅支持字母、数字、下划线,首字符必须为字母 query_id = f"cpu_avg_{ins_id.replace('-', '_')}" query_list.append({ 'Id': query_id, 'MetricStat': { 'Metric': { 'Namespace': 'AWS/EC2', 'MetricName': 'CPUUtilization', 'Dimensions': [ {'Name': 'InstanceId', 'Value': ins_id} ] }, 'Period': 60, 'Stat': 'Average' } }) resp = client.get_metric_data( MetricDataQueries=query_list, StartTime=datetime(2022, 7, 7, 0, 0, 0, tzinfo=tzutc()), EndTime=datetime(2022, 7, 7, 23, 59, 59, tzinfo=tzutc()) ) # 按实例维度解析结果 for metric_result in resp['MetricDataResults']: # 从查询ID中还原实例ID current_ins = metric_result['Id'].split("_")[-1].replace('_', '-') print(f"===== 实例 {current_ins} 平均CPU利用率数据 =====") print(metric_result['Values'])
相关注意事项
- 单次
GetMetricData请求最多支持传入500个查询条目,只要不超过该配额,不管是跨多实例、跨多指标的查询都可以在单次请求中完成 - 如果需要同时查询网络、磁盘等其他指标,只需要在循环中追加对应指标的查询配置,同样保证每个查询的
Id唯一即可 - 如果返回结果中存在
NextToken字段,说明结果被分页截断,将该字段作为参数传入下一次get_metric_data调用即可拉取剩余数据,不需要拆分实例单独请求 - 不要在
Id字段中使用横杠、空格、特殊符号,否则会触发参数格式错误
内容的提问来源于stack exchange,提问作者JT Kon
相关产品推荐
相关产品推荐

