Google Cloud Storage Bucket Architect:用 Python SDK 将建桶草案落地为可运行代码
【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills
导读
本文以 google-cloud-storage-bucket-architect 技能仓库中的 sdk_python.md 为骨架,系统讲解如何把该技能第二阶段(Phase 2)产出的Draft Bucket Creation Plan(建桶草案)翻译为可直接复制运行的 Google Cloud Storage Python SDK 代码。读完本文,你将掌握:Python 客户端库的初始化与版本要求、五个典型业务场景(安全基线、合规敏感数据、静态网站、AI/ML 分区域桶、WORM 归档)的完整代码范式,以及 Bucket Lock / Object Lock、IP Filtering、Encryption Enforcement 等高级特性的底层行为与仓库内可交叉验证的参考资源。
一、定位:这份文档在技能流程中的角色
在 google-cloud-storage-bucket-architect 的三阶段工作流中:
| 阶段 | 职责 | 参考文档 |
|---|---|---|
| Phase 1 | 项目级安全预检(Preflight/Project Checks) | phase_project_checks.md |
| Phase 2 | 生成建桶草案(Draft Bucket Create Plan) | phase_draft_plan.md |
| Phase 3 | 按用户偏好的格式输出(gcloud / REST / Terraform / SDK) | phase_output.md |
sdk_python.md正是 Phase 3 中 "SDK → Python" 分支的翻译规则文档。它假定 Phase 2 已经产出了一份包含桶名、项目、位置、存储类别、安全设置与场景专属参数的草案,本文档负责将这些配置项映射到google.cloud.storage客户端库的字段与构造参数上。
[!IMPORTANT] 版本前提:Encryption Enforcement Config(加密类型强制)需要 Python SDK ≥ 3.10.0。若版本低于 3.10.0,该设置必须改用 REST API、gcloud 或 Terraform 配置(建好的桶仍可由 SDK 管理)。Phase 3 的要求与此一致:一旦参考文档标注了版本支持下限,最终输出必须附带版本警告。
官方参考:Cloud Storage Python Client Library(官方文档链接,具体 API 细节以官方为准)。
二、为什么 Python SDK 版本文档值得深挖:安全默认值的完整映射
仓库在 phase_draft_plan.md 中规定了一套secure-by-default基线,无论何种场景都必须显式配置:
- UBLA(统一桶级访问):启用
- Encryption Enforcement(限制 CSEK):默认限制客户提供的加密密钥
- Soft Delete:启用,默认保留 7 天(604800 秒)
- PAP(公共访问防护):Enforced(仅静态网站、公共媒体托管等明确需要公网访问的场景可例外)
sdk_python.md的每个示例都完整继承了这套基线,这正是它的价值所在——你看到的所有代码都内置了安全默认值,而不是一个裸的create_bucket调用。其字段到属性的映射关系在 sdk.md 的 "SDK Feature Support Matrix" 中有完整的跨语言对照(Python / Go / C++ / Java),例如:
| 草案配置项 | Python SDK 字段 / 属性 |
|---|---|
| 桶名 | create_bucket的bucket_or_name参数(接受Bucket对象或str) |
| 位置 / 放置 | create_bucket的location、data_locations=[...] |
| 存储类别 | bucket.storage_class = "STANDARD" |
| UBLA / PAP | bucket.iam_configuration.uniform_bucket_level_access_enabled/public_access_prevention |
| Soft Delete | bucket.soft_delete_policy.retention_duration_seconds |
| CMEK | bucket.default_kms_key_name |
| Restrict CSEK | bucket.encryption.customer_supplied_encryption_enforcement_config(≥ v3.10.0) |
| IP Filtering | from google.cloud.storage.ip_filter import IPFilter→bucket.ip_filter |
三、示例一:标准安全桶(基线配置)
3.1 输入草案
- 桶名:
my-company-secure-bucket - 项目:
my-security-project - 位置:
us-east1 - 存储类别:
STANDARD - UBLA:启用
- PAP:Enforced
- Soft Delete:启用(7 天)
- Encryption Enforcement:CSEK Restricted
3.2 Python 实现
from google.cloud import storage from google.cloud.storage.bucket import EncryptionEnforcementConfig def create_secure_bucket(project_id, bucket_name): client = storage.Client(project=project_id) bucket = client.bucket(bucket_name) bucket.storage_class = "STANDARD" bucket.iam_configuration.uniform_bucket_level_access_enabled = True bucket.iam_configuration.public_access_prevention = "enforced" bucket.soft_delete_policy.retention_duration_seconds = 604800 # 7 days bucket.encryption.customer_supplied_encryption_enforcement_config = EncryptionEnforcementConfig(restriction_mode="FullyRestricted") new_bucket = client.create_bucket(bucket, location="us-east1") return new_bucket3.3 代码要点剖析
storage.Client(project=project_id):初始化客户端时显式绑定项目,避免误用默认项目(初始化范式同样记录在 sdk.md 的 Client Initialization 一节)。bucket = client.bucket(bucket_name):先在本地构造一个Bucket对象并填充元数据,最后一次性提交,而不是创建后再 patch,减少 API 往返。EncryptionEnforcementConfig(restriction_mode="FullyRestricted"):FullyRestricted表示桶上完全禁止 CSEK(客户提供密钥)访问,这正是phase_draft_plan.md中 "Restrict Customer-Supplied Encryption Keys (CSEK)" 的默认策略。- 软删除 604800 秒 = 7 天:与草案默认保留期完全一致,为误删提供回滚窗口。
四、示例二:敏感数据 / 合规场景(PII、HIPAA、金融)
4.1 输入草案
- 桶名:
my-compliance-pii-bucket - 项目:
my-compliance-project - 位置:
us-central1 - 存储类别:
STANDARD(Autoclass 负责冷热转换) - UBLA:启用;PAP:Enforced
- Encryption Enforcement:Restrict CSEK;Encryption:CMEK
- Soft Delete:启用(7 天)
- Bucket Lock(Retention Policy):启用(90 天,Unlocked)
- 场景专属配置:
- Autoclass:启用
- CMEK Key ID:
projects/my-kms-project/locations/us-central1/keyRings/my-keyring/cryptoKeys/my-key - Labels:
data-class=pii、owner=security-team - Lifecycle:7 天后中止未完成的多段上传(abort incomplete multipart uploads)
- IP Filtering:仅允许
192.0.2.0/24(企业网段)与 VPC 网络10.0.0.0/16(禁止跨组织 VPC)
4.2 Python 实现
from google.cloud import storage from google.cloud.storage.bucket import EncryptionEnforcementConfig from google.cloud.storage.ip_filter import IPFilter, PublicNetworkSource, VpcNetworkSource def create_compliance_bucket(project_id, bucket_name, kms_key_id): client = storage.Client(project=project_id) bucket = client.bucket(bucket_name) bucket.storage_class = "STANDARD" bucket.iam_configuration.uniform_bucket_level_access_enabled = True bucket.iam_configuration.public_access_prevention = "enforced" bucket.default_kms_key_name = kms_key_id bucket.soft_delete_policy.retention_duration_seconds = 604800 # 7 days bucket.retention_period = 7776000 # 90 days bucket.autoclass_enabled = True bucket.labels = { "data-class": "pii", "owner": "security-team" } bucket.lifecycle_rules = [ { "action": {"type": "AbortIncompleteMultipartUpload"}, "condition": {"age": 7} } ] bucket.encryption.customer_supplied_encryption_enforcement_config = EncryptionEnforcementConfig(restriction_mode="FullyRestricted") # Configure IP Filtering (including VPC Network Sources) ip_filter = IPFilter() ip_filter.mode = "Enabled" ip_filter.allow_all_service_agent_access = True ip_filter.allow_cross_org_vpcs = False ip_filter.public_network_source = PublicNetworkSource( allowed_ip_cidr_ranges=["192.0.2.0/24"] ) ip_filter.vpc_network_sources = [ VpcNetworkSource( network="projects/PROJECT_ID/global/networks/NETWORK_NAME", allowed_ip_cidr_ranges=["10.0.0.0/16"] ) ] bucket.ip_filter = ip_filter new_bucket = client.create_bucket(bucket, location="us-central1") return new_bucket(注:如需锁定 retention policy,可调用
bucket.lock_retention_policy()。锁定是永久且不可逆的。)
4.3 代码要点剖析
- CMEK(
default_kms_key_name):敏感数据场景强烈推荐使用 Cloud KMS 客户管理密钥(参考 sensitive_data.md),而非 CSEK。KMS 密钥需按projects/.../locations/.../keyRings/.../cryptoKeys/...全限定格式传入。 bucket.retention_period = 7776000:90 天桶级保留策略(Bucket Lock 的一种形态,Unlocked 状态)。在仓库的 Retention 决策表中,Bucket Lock 作用于桶内全部对象,适合对所有数据有统一保留要求的场景(见 phase_draft_plan.md 的 "Retention Policy Decisions")。AbortIncompleteMultipartUpload+age: 7:自动清理 7 天前未完成的多段上传,避免隐藏的存储成本,这是敏感数据与归档场景的"Highly Recommended"成本优化项。- IP Filtering:
IPFilter()组装公网网段(PublicNetworkSource)与 VPC 网络来源(VpcNetworkSource),并显式关闭跨组织 VPC。仓库同时提醒其边界:每个桶最多 200 个 IP CIDR 块、最多 25 个 VPC 网络,且若桶需要被 BigQuery / App Engine 标准环境 / Cloud Shell 访问,则不要启用 IP filtering(详见 phase_draft_plan.md 的 "IP Filtering Decisions & Limitations")。
五、示例三:静态网站托管
5.1 输入草案
- 桶名:
www.my-company-site.com - 项目:
my-frontend-project - 位置:
US(多区域) - 存储类别:
STANDARD - UBLA:启用
- PAP:Inherited(禁用强制防护,以允许公网访问网站)
- Soft Delete:启用(7 天)
- 场景专属配置:
- Website Config:主页
index.html,错误页404.html - 公共访问:需要(
allUsers→roles/storage.objectViewer) - CORS:允许任意域发起 GET/HEAD/OPTIONS
- Versioning:启用
- Website Config:主页
5.2 Python 实现
from google.cloud import storage def create_static_website_bucket(project_id, bucket_name): client = storage.Client(project=project_id) bucket = client.bucket(bucket_name) bucket.storage_class = "STANDARD" bucket.iam_configuration.uniform_bucket_level_access_enabled = True bucket.iam_configuration.public_access_prevention = "inherited" # allow public bucket.versioning_enabled = True bucket.soft_delete_policy.retention_duration_seconds = 604800 # 7 days bucket.configure_website( main_page_suffix="index.html", not_found_page="404.html" ) bucket.cors = [{ "origin": ["*"], "method": ["GET", "HEAD", "OPTIONS"], "responseHeader": ["Content-Type"], "maxAgeSeconds": 3600 }] new_bucket = client.create_bucket(bucket, location="US") # Grant public access policy = new_bucket.get_iam_policy(requested_policy_version=3) policy.bindings.append({ "role": "roles/storage.objectViewer", "members": {"allUsers"} }) new_bucket.set_iam_policy(policy) return new_bucket5.3 代码要点剖析
public_access_prevention = "inherited":这是唯一的基线例外场景——静态网站必须允许公网访问。仓库 static_website.md 明确要求 PAP 设为 Disabled/Inherited,同时通过 IAM 将roles/storage.objectViewer授予allUsers。configure_website(main_page_suffix=..., not_found_page=...):映射到 Website 配置(mainPageSuffix/notFoundPage),是静态网站场景的 Required 项。requested_policy_version=3:使用 v3 策略以兼容条件绑定;追加绑定后调用set_iam_policy提交。注意:由于 UBLA 启用,统一用 IAM 而非对象 ACL 控制访问,这是 UBLA 的设计目标(防止对象级 ACL 覆盖桶级策略,参考 sensitive_data.md 中对 UBLA 的说明)。- CORS + Versioning:
cors允许跨域读取;versioning_enabled = True配合生命周期规则清理历史版本,可回滚失败的发布("Good to Have"建议项)。
六、示例四:AI/ML 检查点存储(分区域桶 / Zonal Buckets)
6.1 输入草案
- 桶名:
my-training-checkpoints-us-east1-b - 项目:
my-ai-project - 位置:
us-east1(区域) - 放置:
us-east1-b(与计算节点同区,追求高性能) - 存储类别:
RAPID(分区域桶必须显式指定) - UBLA:启用(分层命名空间的硬性前提)
- PAP:Enforced
- 加密:Google 托管密钥
- Soft Delete:禁用(分区域桶不支持)
- 场景专属配置:
- Hierarchical Namespace:启用(分区域桶必需)
- Lifecycle:删除超过 14 天的检查点文件
6.2 Python 实现
from google.cloud import storage def create_checkpoint_bucket(project_id, bucket_name): client = storage.Client(project=project_id) bucket = client.bucket(bucket_name) bucket.storage_class = "RAPID" bucket.iam_configuration.uniform_bucket_level_access_enabled = True bucket.iam_configuration.public_access_prevention = "enforced" bucket.hierarchical_namespace_enabled = True bucket.soft_delete_policy.retention_duration_seconds = 0 bucket.lifecycle_rules = [ { "action": {"type": "Delete"}, "condition": {"age": 14} } ] # location must be the region, and data_locations must contain the zone new_bucket = client.create_bucket(bucket, location="us-east1", data_locations=["us-east1-b"]) return new_bucket6.3 代码要点剖析
storage_class = "RAPID":分区域桶(Rapid Bucket 产品形态)必须显式设为RAPID,不能默认STANDARD(见 phase_draft_plan.md 的 "Zonal Buckets (Rapid Bucket) Constraints")。soft_delete_policy.retention_duration_seconds = 0:分区域桶不支持软删除,必须显式置 0 禁用。hierarchical_namespace_enabled = True:分区域桶强制要求启用分层命名空间,且不可配置关闭。create_bucket(bucket, location="us-east1", data_locations=["us-east1-b"]):location传区域、data_locations传具体可用区,实现存储与 TPU/GPU 计算节点的同区共置。若配合 Rapid Cache 使用,建议在同一可用区创建缓存并开启 ingest-on-write 消除冷启动(见 storage_for_ai.md)。- Lifecycle 14 天清理检查点:AI 场景强烈建议用 OLM 规则清理过期检查点,避免分区域盘上产生巨额存储账单。
七、示例五:WORM 归档 + Object Lock(对象级保留)
7.1 输入草案
- 桶名:
my-legal-archive-bucket - 项目:
my-legal-project - 位置:
us-east1 - UBLA:启用;PAP:Enforced
- Soft Delete:启用(7 天)
- 加密:CMEK(强烈推荐)
- 场景专属配置:
- 存储类别:
ARCHIVE - Object Lock(Per-Object Retention):启用
- CMEK Key ID:
projects/my-kms-project/locations/us-east1/keyRings/my-keyring/cryptoKeys/my-key - Labels:
compliance-type=regulatory、retention-period=7y(强烈推荐标签) - Lifecycle:删除超过 7 年(2555 天)的对象
- 存储类别:
[!CAUTION] 将 per-object retention mode 设为 "Locked" 是不可逆的。一旦设置,模式无法改回,保留日期只能延长。
7.2 Python 实现
import datetime from google.cloud import storage def create_regulatory_worm_bucket(project_id, bucket_name, kms_key_id): client = storage.Client(project=project_id) # 1. Create bucket with Object Retention enabled bucket = client.create_bucket( bucket_or_name=bucket_name, location="us-east1", enable_object_retention=True ) # 2. Configure bucket metadata bucket.storage_class = "ARCHIVE" bucket.iam_configuration.uniform_bucket_level_access_enabled = True bucket.iam_configuration.public_access_prevention = "enforced" bucket.default_kms_key_name = kms_key_id bucket.labels = { "compliance-type": "regulatory", "retention-period": "7y" } bucket.soft_delete_policy.retention_duration_seconds = 604800 bucket.lifecycle_rules = [{ "action": {"type": "Delete"}, "condition": {"age": 2555} }] bucket.patch() return bucket def upload_object_with_retention(bucket_name, source_file, destination_blob): client = storage.Client() bucket = client.bucket(bucket_name) blob = bucket.blob(destination_blob) # Configure retention on upload (Locked mode, retain until Dec 31, 2030) # The date can also be calculated dynamically as 7 years from now. retain_until = datetime.datetime(2030, 12, 31, 23, 59, 59, tzinfo=datetime.timezone.utc) blob.retention.mode = "Locked" blob.retention.retain_until_time = retain_until blob.upload_from_filename(source_file) return blob7.3 代码要点剖析
enable_object_retention=True:Object Lock 与 Bucket Lock 不同,它必须在创建桶时就启用(除非走 Cloud Console),之后对象级保留按对象单独配置。这是 phase_draft_plan.md 中 "Object Lock (Object Retention)" 决策的关键限制。- 分两步建模:先
create_bucket(..., enable_object_retention=True)开启能力,再修改元数据(ARCHIVE 存储类别、CMEK、标签、软删除、生命周期)后bucket.patch()提交。 blob.retention.mode = "Locked"/retain_until_time:在上传对象时设置锁定保留时间(示例硬编码为 2030-12-31,注释建议动态计算为"当前时间 + 7 年")。Locked 模式下保留日期只能延长不能缩短。ARCHIVE+ 2555 天删除:归档类存储每 GB 成本最低,但有检索费与最短保留期(ARCHIVE 最短 365 天)约束;生命周期规则负责到期清理,兼顾合规与成本(参考 archiving_compliance.md)。
八、Putting It All Together:草案 → 代码的翻译规则总结
从五个示例中可以归纳出一套稳定的翻译模板,这套模板与仓库中 sdk.md 的功能矩阵一一对应:
- 安全基线固定段(每个桶都要有):UBLA 启用、PAP
enforced、软删除 604800 秒、EncryptionEnforcementConfig(restriction_mode="FullyRestricted")(≥ v3.10.0)。 - 场景可变段:存储类别、
data_locations、CMEK 密钥、Autoclass、标签、生命周期规则、CORS、Website、IP Filtering、Retention(桶级或对象级)。 - 能力开关必须在创建时开启:
enable_object_retention=True(Object Lock)、分层命名空间、分区域放置。 - 创建后配置:网站公网 IAM 绑定(
get_iam_policy→set_iam_policy)、锁桶保留策略(lock_retention_policy(),不可逆)。
8.1 如何在实际项目中验证与运行
- 参考 phase_output.md:对于 SDK 输出,Agent 只负责展示代码片段供用户集成,不代为执行;gcloud / REST 则需先展示完整命令并取得用户明确确认后才可执行。
- 结合 gcloud.md 与 rest.md 交叉验证:当某特性(例如 Go/C++ 中的 IP Filtering)在目标语言 SDK 中未暴露时,sdk.md 建议采用 "Separate Provisioning from Application Logic"(用 Terraform/gcloud 建桶,应用只用 SDK 做数据面读写)或 "Hybrid SDK + Direct REST API Call" 两种集成模式。
- 版本自检:先执行
pip show google-cloud-storage确认版本 ≥ 3.10.0,再使用EncryptionEnforcementConfig;否则回退到 REST/gcloud/Terraform。
8.2 与其余场景参考的衔接
Python 示例中的每一项"场景专属配置"都对应仓库中的一份用例文档,按需查阅可获取完整推荐矩阵:
- 敏感数据与合规(PII / HIPAA / 金融)
- 静态网站托管
- 长期归档与合规(Bucket Lock / Object Lock / Autoclass)
- AI 与机器学习存储(Rapid Cache 与 Zonal Buckets 二选一决策)
- 备份与容灾、日志存储、媒体托管、UGC 直传
九、常见陷阱与规避建议
| 陷阱 | 现象 | 规避 |
|---|---|---|
| 版本过低 | EncryptionEnforcementConfig导入失败或字段无效 | 升级到 ≥ 3.10.0,或改用 rest.md / gcloud.md / terraform.md |
| 分区域桶未关软删除 | 创建报错或被强制改回 | 显式retention_duration_seconds = 0,存储类别必须RAPID |
| Object Lock 未在创建时开启 | 后续无法为对象设置保留 | 创建时传enable_object_retention=True,除非使用 Cloud Console |
| 静态网站漏配 PAP 例外 | 公网访问被enforced拦截 | 按场景显式设为"inherited"并绑定allUsers+roles/storage.objectViewer |
| 对 Locked 保留的不可逆性认识不足 | 数据被锁定后无法按期删除 | 先在草案阶段与用户确认 Locked / Unlocked 及保留时长(见 phase_draft_plan.md 的警告要求) |
| IP Filtering 与依赖服务冲突 | BigQuery 导入导出、App Engine、Cloud Shell 访问失败 | 仅在确认上述服务无需访问该桶时启用 IP filtering |
十、结语
sdk_python.md是整个 google-cloud-storage-bucket-architect 技能中"配置落地"一环的 Python 语言具体化:它以 Phase 2 的建桶草案为输入,以可复制、可运行的google.cloud.storage代码为输出,并把 secure-by-default 基线、版本约束与不可逆操作警告原样固化进代码范式。配合 sdk.md 的功能矩阵与各用例参考文档,你可以把任意一份草案稳定、安全地翻译为生产可用的 Python 建桶代码。
【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考