如何对比S3两个文件夹的CloudWatch指标?子级指标是否付费?
关于AWS S3文件夹级CloudWatch指标的疑问解答
一、S3子文件夹(前缀)级指标是否付费?
首先给你明确清楚:
- AWS S3默认的CloudWatch指标是桶级别的,这部分完全免费,但没法直接获取文件夹(前缀)维度的细分指标。
- 要拿到前缀级的指标,主要有两种路径,费用情况各有不同:
- S3 Storage Lens:
- 有免费基础层,可以提供前缀级的核心指标(包括你需要的
NumberOfObjects和BucketSizeBytes),最多支持10个存储桶,完全能满足你对比两个前缀的需求。 - 如果需要更高级的功能(比如跨账户多桶分析、自定义过滤规则、导出详细报告等),就得用付费的高级层,费用按存储桶数量和分析的数据量计算。
- 有免费基础层,可以提供前缀级的核心指标(包括你需要的
- 自定义CloudWatch指标(通过Lambda实现):
- 这种方式需要你写一段Lambda代码,定期遍历指定前缀下的所有对象,统计数量和大小,再把数据推送到CloudWatch自定义指标里。这里的费用来自Lambda的执行时长/调用次数,以及CloudWatch自定义指标的存储和查询成本。如果你的文件夹对象数量不多,这个成本其实极低,甚至可能落在AWS免费额度范围内。
- S3 Storage Lens:
二、如何绘制两个文件夹的指标对比图表?
针对你的需求,最快上手的方式是用S3 Storage Lens:
- 打开AWS控制台的S3服务,进入Storage Lens页面。
- 新建一个仪表盘(或者直接用默认仪表盘),在筛选条件里指定你的
logs-bucket,然后添加两个前缀过滤项:error/2019/01/和info/2019/01/。 - 在指标列表里勾选
NumberOfObjects和BucketSizeBytes,Storage Lens会自动生成对比图表,你可以调整时间范围、切换图表类型(比如柱状图、折线图)来直观查看两个前缀的指标差异。
如果不想用Storage Lens,用自定义指标的思路大概是这样:
- 编写Lambda函数(Python示例参考):
import boto3 s3_client = boto3.client('s3') cloudwatch_client = boto3.client('cloudwatch') def lambda_handler(event, context): # 定义目标桶和两个前缀 bucket_name = 'logs-bucket' target_prefixes = ['error/2019/01/', 'info/2019/01/'] for prefix in target_prefixes: obj_count = 0 total_size = 0 # 分页遍历前缀下的所有对象 paginator = s3_client.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=bucket_name, Prefix=prefix): if 'Contents' in page: obj_count += len(page['Contents']) total_size += sum(obj['Size'] for obj in page['Contents']) # 推送指标到CloudWatch cloudwatch_client.put_metric_data( Namespace='S3/PrefixMetrics', MetricData=[ { 'MetricName': 'NumberOfObjects', 'Dimensions': [{'Name': 'Bucket', 'Value': bucket_name}, {'Name': 'Prefix', 'Value': prefix}], 'Value': obj_count, 'Unit': 'Count' }, { 'MetricName': 'BucketSizeBytes', 'Dimensions': [{'Name': 'Bucket', 'Value': bucket_name}, {'Name': 'Prefix', 'Value': prefix}], 'Value': total_size, 'Unit': 'Bytes' } ] ) - 给Lambda配置合适的IAM权限(允许读取目标S3桶的对象、写入CloudWatch指标)。
- 设置Lambda的触发规则(比如每天定时运行一次,或者手动按需触发)。
- 等指标推送到CloudWatch后,进入CloudWatch控制台创建图表,添加两个前缀对应的
NumberOfObjects和BucketSizeBytes指标,就能生成对比图表了。
内容的提问来源于stack exchange,提问作者moon
相关产品推荐
相关产品推荐

