如何统计Google GCS存储桶文件的访问与下载次数
GCS存储桶文件访问/读取/下载次数统计全流程
1. 配置Logging Sink的日志包含过滤器(inclusion filter)
创建日志导出Sink时,在「包含过滤器」输入框填入以下规则,即可只导出GCS访问相关的审计日志,不会混入其他无关日志:
resource.type="gcs_bucket" logName="projects/替换为你的GCP项目ID/logs/cloudaudit.googleapis.com%2Fdata_access" protoPayload.serviceName="storage.googleapis.com" protoPayload.methodName=("storage.objects.get" OR "storage.objects.list") # 仅统计单个指定存储桶时,取消下一行注释并替换为实际桶名 # resource.labels.bucket_name="your-target-bucket-name" # 需要排除GCP内部服务自动发起的访问请求时,添加下一行规则 # protoPayload.callerSuppliedUserAgent!~"google-internal"
过滤器规则说明
- 所有GCS对象的读取、下载、文件列表查询操作,都会记录在
cloudaudit.googleapis.com/data_access(URL编码后为cloudaudit.googleapis.com%2Fdata_access)数据访问审计日志中,不会和管理员操作、系统事件类日志混淆 storage.objects.get对应单文件的读取、下载行为,storage.objects.list对应目录/文件列表的访问请求,不需要统计列表访问量直接删除OR后面的条件即可- Sink创建完成后仅会同步新产生的日志,不会回溯导出创建时间点之前的历史访问记录,需要统计历史数据请提前部署Sink
- 创建Sink时目标位置选择BigQuery,按需选择已有数据集或新建数据集即可,控制台操作时会自动给Sink的服务账号授予BigQuery写入权限,命令行创建需手动配置权限。
2. BigQuery日志查询统计
Sink创建完成后,GCS访问日志会实时写入BigQuery对应数据集下的审计日志表,默认按日期生成分表,可直接用以下SQL完成不同维度的统计:
场景1:统计指定周期内各文件的总访问/下载次数
SELECT -- 提取文件完整路径 REPLACE(protoPayload.resourceName, "projects/_/buckets/替换为你的桶名/objects/", "") AS file_path, COUNT(*) AS total_access_count, -- 统计访问的独立用户数 COUNT(DISTINCT protoPayload.authenticationInfo.principalEmail) AS distinct_user_count FROM `你的GCP项目ID.你的BigQuery数据集ID.cloudaudit_googleapis_com_data_access_*` WHERE -- 限定统计的日期范围,后缀格式为YYYYMMDD _TABLE_SUFFIX BETWEEN '20240101' AND '20240630' AND protoPayload.methodName = 'storage.objects.get' -- 过滤断点续传的分片请求,避免重复计数 AND protoPayload.request.range IS NULL GROUP BY file_path ORDER BY total_access_count DESC
场景2:按天统计下载量趋势
SELECT DATE(timestamp) AS access_date, COUNT(*) AS daily_download_count FROM `你的GCP项目ID.你的BigQuery数据集ID.cloudaudit_googleapis_com_data_access_*` WHERE _TABLE_SUFFIX BETWEEN '20240101' AND '20240630' AND protoPayload.methodName = 'storage.objects.get' AND protoPayload.request.range IS NULL AND resource.labels.bucket_name = '你的目标桶名' GROUP BY access_date ORDER BY access_date ASC
查询注意事项
- 如果提示表不存在,先到BigQuery控制台确认自动生成的审计日志表实际名称,部分区域的表命名可能存在微小差异,替换为实际表名即可
- 需要区分访问来源(控制台/gsutil/API调用/第三方客户端),可以新增
protoPayload.callerSuppliedUserAgent维度分组统计 - 配置前先确认项目级审计日志设置中,GCS服务的「数据读取」类审计日志处于开启状态,否则不会生成对应访问日志,Sink无法导出数据。
内容的提问来源于stack exchange,提问作者Jared Nedzel
相关产品推荐
相关产品推荐

