如何使用boto3查询VPC中单价最贵的前X台含EBS费用的EC2实例
实现方案
方案1:直接调用Cost Explorer API(最省力,推荐)
无需自己关联EC2、EBS、定价数据,AWS侧已经完成了资源维度的成本关联
- 调用boto3的
ce客户端的get_cost_and_usage_with_resources接口,直接按实例维度聚合当前小时的未分摊成本,返回结果已经包含EC2实例本身的计算费用 + 挂载的所有EBS卷的费用 - 核心参数配置:
- 时间范围选当前小时的起始到当前时间
Granularity设为HOURLYFilter限定资源类型为AWS::EC2::InstanceMetrics选UnblendedCostSortBy按UnblendedCost降序排列,MaxResults直接设为你需要的X,返回结果就是单价最高的前X台实例
- 前置要求:提前开启Cost Explorer的资源级粒度监控,数据延迟约15分钟,符合绝大多数近实时场景需求
方案2:本地缓存预计算(请求延迟最低,适合高频率调用)
完全避免Web请求时调用AWS接口,接口开销降到最低
- 后台跑定时同步任务(建议15~30分钟一次),全量拉取当前EC2实例、挂载EBS卷的配置信息,预计算每台实例的小时单价存入Redis/关系型数据库
- 优化增量同步:监听CloudTrail的EC2/EBS配置变更事件(实例创建/销毁、卷挂载/卸载、卷规格调整等),触发对应实例的成本重算,无需每次全量拉取所有资源
- 定价数据本地缓存:AWS产品定价数月才会更新,可提前把所有EC2实例规格、EBS类型的单价预存在本地,无需每次请求调用Pricing API,计算完全本地化
注意事项
- 计算单价时需要覆盖所有成本项:EC2的付费模式(按需/预留/Spot)单价差异、EBS的存储容量费用、io1/io2/gp3的额外IOPS/吞吐量费用都需要纳入计算
- 如果是多账户场景,需要在Cost Explorer中开启合并账单的资源级权限,才能拉取所有关联账户的实例成本数据
内容的提问来源于stack exchange,提问作者Michael Robinson
相关产品推荐
相关产品推荐

