如何按文件名统计S3中JSON文件的月度PUT/GET请求量?
如何统计S3单个JSON文件的月度PUT/GET请求次数
首先明确:AWS原生服务(CloudWatch、账单控制台)目前不支持直接按单个对象维度统计请求次数。CloudWatch的S3指标是桶级别的,账单也是按桶或服务维度计费,没法细化到单个文件。不过有两种可行的替代方案,给你详细说明:
方案一:Lambda+CloudWatch自定义指标(实时统计)
这是最直接的实时统计方案,通过监听S3对象操作事件,用Lambda上报自定义指标,之后就能在CloudWatch里查询和导出数据:
1. 配置Lambda函数与S3事件触发
- 创建一个Python Lambda函数,逻辑是解析S3的PUT/GET事件,提取对象键和操作类型,然后向CloudWatch上报带维度的自定义指标。
- 给你的S3桶配置事件通知:选择
All object create events(对应PUT)和GetObject事件,把这些事件发送到刚才创建的Lambda函数。
示例Lambda代码:
import boto3 from datetime import datetime cloudwatch = boto3.client('cloudwatch') # 自定义指标命名空间,可自行命名 METRIC_NAMESPACE = 'S3ObjectRequestMetrics' def lambda_handler(event, context): for record in event['Records']: event_name = record['eventName'] object_key = record['s3']['object']['key'] # 过滤出PUT和GET操作 if 'PutObject' in event_name: op_type = 'PUT' elif 'GetObject' in event_name: op_type = 'GET' else: continue # 按年月生成维度值,格式如"2024-05" current_month = datetime.utcnow().strftime('%Y-%m') # 上报CloudWatch自定义指标 cloudwatch.put_metric_data( Namespace=METRIC_NAMESPACE, MetricData=[ { 'MetricName': f'{op_type}Count', 'Dimensions': [ {'Name': 'ObjectKey', 'Value': object_key}, {'Name': 'Month', 'Value': current_month} ], 'Value': 1, 'Unit': 'Count' } ] ) return {'statusCode': 200, 'body': 'Metrics reported successfully'}
2. 查询与导出数据
- 在CloudWatch控制台的「指标」页面,找到你自定义的命名空间,就能按
ObjectKey(文件名)和Month维度筛选,查看每个JSON文件每月的PUT/GET次数。 - 导出CSV:在指标图表页面点击「导出数据」,选择CSV格式即可;如果需要批量获取,也可以调用CloudWatch的
get_metric_statisticsAPI来拉取数据,再自行处理成CSV。
注意事项
- 给Lambda配置IAM权限:需要允许
cloudwatch:PutMetricData权限,以及S3事件触发的基础权限。 - 并发与配额:如果请求量很大,要注意Lambda的并发限制,以及CloudWatch自定义指标的配额(默认每个账号最多10000个自定义指标,超出可申请提升)。
- 历史数据:这个方案只能统计配置之后的请求,之前的请求无法回溯。
方案二:分析S3访问日志(回溯历史数据)
如果你之前已经开启了S3访问日志,可以通过Athena来分析日志,统计历史的对象级请求:
- 确保S3桶已开启访问日志,日志存储到另一个S3桶中。
- 在Athena中创建一个表,映射S3日志的结构(Athena有现成的S3日志表模板)。
- 编写SQL查询,按月份、对象键、请求类型统计次数,示例:
SELECT date_format(date_parse(substring(requestdatetime, 1, 10), '%d/%b/%Y'), '%Y-%m') AS month, uri AS object_key, CASE WHEN operation = 'REST.PUT.OBJECT' THEN 'PUT' WHEN operation = 'REST.GET.OBJECT' THEN 'GET' END AS request_type, count(*) AS request_count FROM your_s3_log_table WHERE uri LIKE '%.json' -- 仅统计JSON文件 GROUP BY month, object_key, request_type ORDER BY month, object_key
- 查询结果可直接导出为CSV,或通过Athena API获取数据。
内容的提问来源于stack exchange,提问作者sigur7
相关产品推荐
相关产品推荐

