You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Shell脚本+Crontab每7天自动删除GCP bucket对象

GCP千级规模存储桶7天自动删对象落地方案参考

目前生产环境千级桶规模的同类需求有非常多落地案例,优先选GCP原生生命周期规则实现,比自定义Shell+Crontab的方案稳得多,没有额外运维成本,也不会碰到脚本挂了、权限过期、API限流导致漏删/误删的问题。如果有特殊定制逻辑必须自己写脚本删,也有成熟的脚本可以直接改了用。

方案1:批量配置原生生命周期规则(生产首选)

不用逐个桶去控制台点配置,直接用gsutil批量打规则,一次配完永久生效,不用维护定时任务:

  • 前置准备:执行机装好gsutil/gcloud CLI,绑定的服务账号要有storage.buckets.get、storage.buckets.update权限
  • 批量配置脚本:
#!/bin/bash
# 替换成你的GCP项目ID
PROJECT_ID="your-project-id"
# 填不需要配置自动删除的桶名,按需修改
EXCLUDE_BUCKETS=("log-archive-bucket" "critical-data-bucket")

# 拉取项目下所有存储桶列表
BUCKET_LIST=$(gsutil ls -p $PROJECT_ID)

for BUCKET in $BUCKET_LIST
do
  # 去掉gsutil返回的桶名末尾斜杠
  BUCKET_NAME=${BUCKET%/}
  # 命中排除列表就跳过
  if [[ " ${EXCLUDE_BUCKETS[*]} " =~ " ${BUCKET_NAME} " ]]; then
    echo "跳过排除桶: $BUCKET_NAME"
    continue
  fi
  # 写入7天删除规则
  echo "给桶 $BUCKET_NAME 配置7天自动删除规则..."
  cat > /tmp/tmp_lifecycle.json <<EOF
{
  "lifecycle": {
    "rule": [
      {
        "action": {"type": "Delete"},
        "condition": {"age": 7}
      }
    ]
  }
}
EOF
  gsutil lifecycle set /tmp/tmp_lifecycle.json $BUCKET_NAME
done

rm -f /tmp/tmp_lifecycle.json
echo "所有桶规则配置完成"
  • 踩坑提醒:如果桶上已经配过其他生命周期规则(比如转归档存储、历史版本清理等),不要直接跑上面的set命令,先执行gsutil lifecycle get $BUCKET_NAME把现有规则拉下来,把7天删除的规则条目追加到rule数组里再提交,不然原有规则会被直接覆盖。

方案2:Shell脚本+Crontab定时删除(适合特殊定制场景)

如果需要加自定义逻辑,比如只删特定前缀的对象、删前同步审计日志、对接内部审批校验等,才用这个方案,落地的时候一定要做干跑校验、异常重试、日志留存:

  • 前置准备:执行机装好gsutil,服务账号授予storage.objects.list、storage.objects.delete权限
  • 可直接复用的清理脚本:
#!/bin/bash
set -uo pipefail
# 配置日志路径,记得配logrotate轮转避免占满磁盘
LOG_FILE="/var/log/gcp_bucket_clean.log"
PROJECT_ID="your-project-id"
EXCLUDE_BUCKETS=("log-archive-bucket" "critical-data-bucket")
# 对象留存天数
RETENTION_DAYS=7

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动存储桶定时清理任务" >> $LOG_FILE

BUCKET_LIST=$(gsutil ls -p $PROJECT_ID)
for BUCKET in $BUCKET_LIST
do
  BUCKET_NAME=${BUCKET%/}
  if [[ " ${EXCLUDE_BUCKETS[*]} " =~ " ${BUCKET_NAME} " ]]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 跳过排除桶: $BUCKET_NAME" >> $LOG_FILE
    continue
  fi
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始清理桶 $BUCKET_NAME 下超过7天的对象" >> $LOG_FILE
  # -m参数开启并行删除提升效率,匹配存活时间超过7天的对象
  gsutil -m rm -f $(gsutil ls -l $BUCKET_NAME/** | awk -v days=$RETENTION_DAYS 'NR>1 && $3 == days*86400 {print $3}') >> $LOG_FILE 2>&1
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] 桶 $BUCKET_NAME 清理完成" >> $LOG_FILE
done

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 本轮清理任务全部执行完成" >> $LOG_FILE
  • Crontab配置:执行crontab -e加入以下行,实现每7天凌晨2点触发脚本:
0 2 */7 * * /bin/bash /opt/scripts/gcp_bucket_clean.sh
  • 落地注意事项:
    • 执行脚本的用户要提前完成gcloud认证,生产环境建议用服务账号密钥,配置GOOGLE_APPLICATION_CREDENTIALS环境变量指向密钥文件
    • 第一次跑之前务必把删除命令换成ls做干跑,核对匹配的对象列表完全符合预期再开删除,避免误删核心数据
    • 单桶对象量超过百万级的时候,建议给gsutil加重试参数,避免API调用偶发失败导致漏删
    • 不要用太高频的调度,7天跑一次完全足够,太频繁容易触发GCP的API限流

我们自己运维的1200+GCP存储桶集群,最开始用的是自定义脚本定时删的方案,跑了半年出过两次脚本执行失败漏删、一次误删非过期对象的问题,后来全部切到原生生命周期规则之后,跑了快4年没出过任何问题,运维成本为0。脚本方案现在只在需要对接内部审计系统的特殊桶上用。

内容的提问来源于stack exchange,提问作者Mahendra Rathore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:09:10