如何查询GCP项目内近6个月/1年有读写活动的活跃GCS存储桶?
GCS存储桶指定周期活跃状态筛选方案
你可以通过GCP原生的审计日志能力实现筛选,具体操作如下:
前置校验:日志覆盖范围确认
- GCP Cloud Audit Logs默认留存GCS管理员操作日志(桶创建/删除、配置修改、权限变更类操作)400天,完全覆盖6个月/1年的查询周期;但对象读写类操作属于数据访问审计日志范畴,默认不开启,若你此前未开启过该类日志,仅能查询到日志开启时点之后的读写操作记录,开启前的读操作无留存可查。
- 若你已提前开启GCS数据访问审计日志,且日志留存周期覆盖目标查询区间,可直接执行后续筛选步骤。
具体筛选方法
方法1:Cloud Logging控制台直接聚合查询(适合千级桶规模)
- 进入GCP控制台的Logging > Log Explorer页面,顶部选中目标项目A。
- 将查询时间范围调整为你需要的区间(近180天/近365天),在查询编辑框输入以下过滤语句:
resource.type="gcs_bucket" log_id("cloudaudit.googleapis.com/data_access") OR log_id("cloudaudit.googleapis.com/activity") protoPayload.methodName=~("storage\.objects\.(get|list|create|update|delete|patch|copy|rewrite|compose)" OR "storage\.buckets\.(update|patch|setIamPolicy)") protoPayload.authenticationInfo.principalEmail!~("serviceAccount:.*@gs-project-accounts\.iam\.gserviceaccount\.com")
语句逻辑:拉取所有GCS桶相关的审计日志,覆盖对象读写、桶配置/权限修改类操作,排除GCS内置服务账号产生的生命周期管理、内部同步等系统操作,避免误判。
- 等查询结果加载完成后,在页面操作栏选择「分析结果」-「按字段分组」,选择
resource.labels.bucket_name字段做聚合,输出的分组结果就是查询周期内存在任意读写/配置修改操作的活跃桶列表。 - 对比项目下全量桶列表,未出现在聚合结果中的桶即为目标周期内无操作记录的非活跃桶,可结合桶创建时间、对象容量做二次校验。
方法2:BigQuery离线统计(适合桶规模大、查询周期长的场景)
如果直接在日志页面查询加载速度慢,可通过日志导出+BigQuery分析的方式批量统计:
- 在Cloud Logging中创建日志接收器,以上述过滤语句为筛选规则,将匹配的审计日志导出到同项目下的BigQuery数据集中,导出时间范围指定为你需要的6个月/1年区间。
- 导出完成后,在BigQuery中执行以下SQL,即可直接输出带操作时间、操作主体数的活跃桶明细:
SELECT resource.labels.bucket_name AS active_bucket_name, MIN(timestamp) AS period_first_operation_time, MAX(timestamp) AS period_last_operation_time, COUNT(DISTINCT protoPayload.authenticationInfo.principalEmail) AS related_operator_count FROM `替换为你的项目ID.替换为你创建的BigQuery数据集名.替换为导出的日志表名` WHERE timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 365 DAY) -- 调整为180 DAY即为近6个月统计 GROUP BY active_bucket_name ORDER BY period_last_operation_time DESC
注意事项
- 若你此前未开启GCS数据访问审计日志,无法回溯开启前的对象读操作记录,可辅助参考桶元数据中的
updated字段做初步判断,但该字段仅会在桶配置修改、对象新增/覆盖/删除时更新,不会记录对象读操作,仅能作为辅助参考,不能作为判定活跃的唯一依据。 - 筛选出的非活跃桶不要直接删除,建议先将桶存储类调整为最低成本的归档存储类,临时配置拒绝所有访问的IAM规则,观察1-2个月无业务反馈异常后再执行清理,避免误删仍有价值的数据。
内容的提问来源于stack exchange,提问作者analyst045
相关产品推荐
相关产品推荐

