如何编程获取AWS S3按前缀分组的资源成本报告?
按前缀分组获取AWS S3资源成本的编程方案
核心思路
AWS原生成本工具(成本分配标签、CUR报告)仅支持桶级成本统计,要按前缀拆分成本,需结合S3访问日志与AWS定价API,从存储量、请求次数、数据传输等维度分别统计各前缀的资源消耗,再对应计价得出明细。
具体步骤
1. 开启S3访问日志记录
确保目标业务桶开启访问日志功能,将日志存储到独立的S3桶(避免与业务对象混淆)。日志会记录每个对象的操作类型、时间戳、对象键(含前缀)等关键数据,是统计请求和传输量的基础。
2. 按前缀统计资源消耗
编写脚本(Python/Go等)完成两类统计:
- 存储成本统计:定期调用
list_objects_v2接口,按前缀分页查询对象,累加每个前缀下所有对象的Size字段(已删除对象无需统计)。 - 请求与传输量统计:批量读取S3访问日志,解析每条记录的
operation(操作类型)、bytes_sent(出站流量)、bytes_received(入站流量)字段,按前缀分组统计各类请求次数和数据传输量。
3. 结合定价API计算成本
调用AWS Pricing API获取当前区域的S3定价信息(存储单价、各类请求单价、数据传输单价),将步骤2统计的各项指标乘以对应单价,得到每个前缀的总成本。
注意:调用定价API时需指定产品代码
AmazonS3、目标区域、使用类型等参数,解析返回的JSON格式价格数据匹配对应维度。
4. 汇总输出结果
将每个前缀的日期、总成本整理为目标格式,示例如下:
| Date | Cost, $ | AWS S3 Prefix |
|---|---|---|
| 25-Jan-2024 | 11 | |
| 25-Jan-2024 | 15 |
Python脚本示例片段
import boto3 from collections import defaultdict # 初始化S3客户端 s3_client = boto3.client('s3') target_bucket = 'your-business-bucket' # 按前缀统计存储大小 prefix_storage = defaultdict(int) # 分页获取所有前缀 prefix_paginator = s3_client.get_paginator('list_objects_v2') for page in prefix_paginator.paginate(Bucket=target_bucket, Delimiter='/'): for prefix_item in page.get('CommonPrefixes', []): prefix = prefix_item['Prefix'] # 统计当前前缀下所有对象的总大小 obj_paginator = s3_client.get_paginator('list_objects_v2') for obj_page in obj_paginator.paginate(Bucket=target_bucket, Prefix=prefix): for obj in obj_page.get('Contents', []): prefix_storage[prefix] += obj['Size'] # 后续需结合日志统计请求/传输量,再调用定价API计算最终成本
注意事项
- 日志解析建议采用流式读取,避免大文件占用过多内存。
- 定价API有调用频次限制,建议缓存定价数据,减少重复请求。
- 无版本模式下,已删除对象需从存储统计中排除,避免计算无效成本。
内容的提问来源于stack exchange,提问作者oleksii
相关产品推荐
相关产品推荐

