Cloud Storage:权限、版本与生命周期
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
对象存储;Console:Cloud Storage → Buckets。
推荐做法#
- 优先 Uniform bucket-level access;非公开内容启用 Public access prevention。
- 按 Bucket 授权;需要公众读取时才授 allUsers,并确认允许对象列举。
- 分别规划 Object Versioning、soft delete 和 Lifecycle,定期确认保留版本及删除成本。
常用操作#
替换为实际资源;本段不依赖 lab.env。
BUCKET='REPLACE_BUCKET'
gcloud storage buckets describe "gs://$BUCKET"
gcloud storage buckets get-iam-policy "gs://$BUCKET"
gcloud storage ls --all-versions "gs://$BUCKET"容易踩的坑#
关闭 Public access prevention 不等于已公开;Uniform bucket-level access 也不等于禁止公开。 是否匿名可读还取决于 IAM/ACL 的实际授权及有效 Organization Policy。
- 删除当前对象不等于所有版本与 soft-deleted 数据已清除。
配置说明与完整示例(按需展开)
前置:环境篇。Bucket 存对象,不是可直接当数据库磁盘使用的文件系统。对象访问优先通过 IAM 和 Uniform bucket-level access 管理。
source lab.env
gcloud services enable storage.googleapis.com
gcloud storage buckets create "gs://$BUCKET" --location="$REGION" --uniform-bucket-level-access --public-access-prevention
gcloud storage buckets update "gs://$BUCKET" --versioning
printf 'version 1\n' > object.txt
gcloud storage cp object.txt "gs://$BUCKET/object.txt"
printf 'version 2\n' > object.txt
gcloud storage cp object.txt "gs://$BUCKET/object.txt"
gcloud storage ls --all-versions "gs://$BUCKET/object.txt"从输出复制第一版的 generation,替换下方值:
export OLD_GENERATION='替换为第一版generation'
gcloud storage cp "gs://$BUCKET/object.txt#$OLD_GENERATION" "gs://$BUCKET/recovered.txt"
gcloud storage cat "gs://$BUCKET/recovered.txt"验收:当前对象是 v2,恢复对象是 v1;匿名访问应被拒绝。最小权限读写实验见 IAM Bucket 授权与撤权实验。
上传整个目录#
将已有的本地目录 ./my-dir 连同子目录中的文件递归上传到 Bucket:
gcloud storage cp --recursive ./my-dir "gs://$BUCKET/"
gcloud storage ls --recursive "gs://$BUCKET/my-dir/"--recursive(简写 -r)表示递归复制;例如 ./my-dir/images/logo.png 上传后是 gs://$BUCKET/my-dir/images/logo.png,保留顶层目录名和内部路径。将 ./my-dir 替换为实际目录,路径包含空格时加引号。同名对象默认会被覆盖;如需跳过已存在的对象,在 cp 命令中加 --no-clobber。上传不会自动赋予公共访问权限。cp 命令说明
公共访问与 Uniform / Fine-grained#
未勾选 Prevent public access,不等于已经允许匿名访问。 以下是两个独立设置:
| 设置 | 作用 |
|---|---|
| Public access prevention(阻止公共访问) | 启用后阻止通过 IAM 或 ACL 向公众授权;Bucket 也可能继承上级限制 |
| Uniform bucket-level access | 使用 IAM 管理访问,禁用 Bucket 和对象的 ACL(访问控制列表);本身不禁止公开访问 |
| Fine-grained(细粒度访问) | 同时支持 IAM 和 ACL,可通过对象 ACL 单独授权 |
如果 Fine-grained 不可选,并提示 Your organization requires buckets to use the Uniform Bucket Level Access option,说明生效的 Organization Policy constraints/storage.uniformBucketLevelAccess 要求使用 Uniform。这与是否允许公开访问是两回事。Uniform bucket-level access
本篇创建命令显式启用了 --public-access-prevention。如果另做公开访问实验,先在 Bucket 的 Permissions 中解除 Bucket 自身的公共访问阻止;若上级 constraints/storage.publicAccessPrevention 仍强制限制,则无法仅在 Bucket 上解除。公共访问阻止与继承
只有确实需要公开整个 Bucket 的对象且 Organization Policy 允许时,才在 Permissions → Grant access中给 allUsers(所有人,包括未登录用户)授予 Storage Object Viewer(roles/storage.objectViewer)。这允许公众读取和列出对象;随后使用对象的Public URL 验证。若添加 allUsers 被 Organization Policy 拒绝,还需检查域限制共享策略。公开访问操作
生命周期与清理#
cat > lifecycle.json <<'EOF'
{"rule":[{"action":{"type":"Delete"},"condition":{"age":7,"isLive":false}}]}
EOF
gcloud storage buckets update "gs://$BUCKET" --lifecycle-file=lifecycle.json生命周期异步执行,不保证提交后立即删除。Versioning 保存非当前版本;soft delete 则在删除后保留可恢复数据,两者都可能产生存储费。软删除
纯合成数据沙箱可在最终清理前关闭后续软删除保留;已软删除的数据仍受原保留期约束。生产不要照抄此操作。
gcloud storage buckets update "gs://$BUCKET" --clear-soft-delete
gcloud storage rm --all-versions --recursive "gs://$BUCKET"
rm object.txt lifecycle.json