Google Cloud Storage Bucket Architect:用 Python SDK 将建桶草案落地为可运行代码
2026/9/14 11:10:20 网站建设 项目流程

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_bucketbucket_or_name参数(接受Bucket对象或str
位置 / 放置create_bucketlocationdata_locations=[...]
存储类别bucket.storage_class = "STANDARD"
UBLA / PAPbucket.iam_configuration.uniform_bucket_level_access_enabled/public_access_prevention
Soft Deletebucket.soft_delete_policy.retention_duration_seconds
CMEKbucket.default_kms_key_name
Restrict CSEKbucket.encryption.customer_supplied_encryption_enforcement_config(≥ v3.10.0)
IP Filteringfrom google.cloud.storage.ip_filter import IPFilterbucket.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_bucket

3.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=piiowner=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 FilteringIPFilter()组装公网网段(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
    • 公共访问:需要(allUsersroles/storage.objectViewer
    • CORS:允许任意域发起 GET/HEAD/OPTIONS
    • Versioning:启用

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_bucket

5.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 + Versioningcors允许跨域读取;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_bucket

6.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=regulatoryretention-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 blob

7.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 的功能矩阵一一对应:

  1. 安全基线固定段(每个桶都要有):UBLA 启用、PAPenforced、软删除 604800 秒、EncryptionEnforcementConfig(restriction_mode="FullyRestricted")(≥ v3.10.0)。
  2. 场景可变段:存储类别、data_locations、CMEK 密钥、Autoclass、标签、生命周期规则、CORS、Website、IP Filtering、Retention(桶级或对象级)。
  3. 能力开关必须在创建时开启enable_object_retention=True(Object Lock)、分层命名空间、分区域放置。
  4. 创建后配置:网站公网 IAM 绑定(get_iam_policyset_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询