示例工程【免费下载链接】python-docs-samplesCode samples used on cloud.google.com项目地址https://gitcode.com/GitHub_Trending/py/python-docs-samples点击查看免费下载导读本文基于python-docs-samples仓库中的 Cap Billing 教程 及其配套的 函数源码 与 测试用例完整讲解如何利用 Cloud Billing 的程序化预算通知Programmatic Budget Notifications自动执行成本控制当项目花费超过预算上限时自动解除该项目的 Cloud Billing 关联从而停止付费服务的使用。读完本文你将掌握创建预算、搭建 Pub/Sub 主题、连接账单账户、部署触发函数、配置服务账号权限并验证账单停用这一整套可复制的自动化成本封顶方案特别适合学生、研究者以及沙箱环境中对 Google Cloud 消费有硬性上限的场景。前置条件你需要一个处于活跃状态、且你拥有账单管理员billing admin权限的 Cloud 账单账户或已被授予完成本教程各步骤所需的相应权限。核心思路程序化预算通知如何实现成本封顶从手动盯预算到自动停账单在 Google Cloud 中预算Budget本身只是通知机制并不会阻止消费。真正实现成本封顶的关键是把预算与自动化动作串联起来创建一个 Cloud Billing 预算设定金额上限预算超过阈值时Cloud Billing 会向指定的 Pub/Sub 主题发布一条包含costAmount当前成本与budgetAmount预算金额的 JSON 消息一个由该 Pub/Sub 主题触发的 Cloud Functions 函数收到消息后解析出金额并比较若costAmount budgetAmount则调用 Cloud Billing API 移除该项目的账单账户实现封顶。在python-docs-samples仓库中这一闭环的落地点正是 billing/main.py 中的stop_billing函数——它是整个方案唯一需要你亲自编写/部署的代码。为什么需要独立的账单管理项目教程特别强调一项最佳实践建议单独准备一个独立的 Google Cloud 项目用于承载所有账单管理需求包括账单相关的 Pub/Sub 主题、Cloud Billing Budget API 访问、Cloud Billing Account API 访问、Cloud Billing 导出数据等。而被封顶的对象函数作用的项目是另一个测试项目。这样即使测试项目因账单停用导致资源被关停账单管理项目本身也不会受到影响后续的预算与通知基础设施仍然完好可用。环境准备项目、API 与环境变量选定测试项目与账单管理项目本教程涉及两个项目角色务必区分清楚测试项目test project函数作用的项目即预算超标后被封顶的项目账单管理项目billing administration project存放 Pub/Sub 主题等账单管理基础设施的项目。选定测试项目后先导出其项目 IDexport GOOGLE_CLOUD_PROJECT{{project_id}}设置默认项目并启用所需 API设置默认项目 ID避免后续命令重复指定gcloud config set project {{project-id}}启用本教程所需的四个 APIBilling Budgets、Cloud Functions、Cloud Billing 与 Cloud Buildgcloud services enable billingbudgets.googleapis.com cloudfunctions.googleapis.com cloudbilling.googleapis.com cloudbuild.googleapis.com这四个 API 各司其职billingbudgets.googleapis.com用于创建和管理预算cloudfunctions.googleapis.com用于托管触发函数cloudbilling.googleapis.com用于查询/更新项目的账单关联cloudbuild.googleapis.com则为 Cloud Functions 部署提供构建能力。设置环境变量为预算、Pub/Sub 主题与函数设置统一的环境变量后续命令全部复用它们export BUDGET_NAMEbilling_cap_budget export TOPIC_NAMEbudget-notification export FUNCTION_NAMEstop_billing搭建程序化通知链路设置程序化预算通知需要三步创建 Pub/Sub 主题 → 找到账单账户 ID → 创建预算并关联主题。第一步创建 Pub/Sub 主题创建主题以便 Cloud Billing 向其中发布预算告警消息gcloud pubsub topics create ${TOPIC_NAME}第二步找到并导出账单账户 ID通过以下命令查询项目关联的账单账户 ID并复制输出中的billingAccountName值gcloud beta billing projects describe {{project-id}} | grep billingAccountName注意如果看不到账单账户 ID请先确认你的项目已关联到某个账单账户。将BILLING_ID替换为你的账单账户 ID 后导出export BILLING_ACCOUNTBILLING_ID第三步创建 $100 测试预算并关联主题创建一个与项目账单账户关联的 100 美元测试预算并通过--all-updates-rule-pubsub-topic指定预算消息的发送目标主题gcloud alpha billing budgets create \ --billing-account${BILLING_ACCOUNT} \ --display-name${BUDGET_NAME} \ --budget-amount100 \ --all-updates-rule-pubsub-topicprojects/${GOOGLE_CLOUD_PROJECT}/topics/${TOPIC_NAME}参数含义拆解--billing-account预算归属的账单账户--display-name预算在控制台中的显示名称即billing_cap_budget--budget-amount预算金额上限此处为 100 美元--all-updates-rule-pubsub-topic通知主题格式为projects/项目ID/topics/主题名Cloud Billing 会在此主题上发布包含预算/成本信息的消息。编写并部署封顶函数函数逻辑解析消息、比较金额、关闭账单main.py 中stop_billing的完整执行链路如下def stop_billing(data: dict, context): pubsub_data base64.b64decode(data[data]).decode(utf-8) pubsub_json json.loads(pubsub_data) cost_amount pubsub_json[costAmount] budget_amount pubsub_json[budgetAmount] if cost_amount budget_amount: print(fNo action necessary. (Current cost: {cost_amount})) return project_name cloud_billing_client.common_project_path(PROJECT_ID) billing_enabled _is_billing_enabled(project_name) if billing_enabled: _disable_billing_for_project(project_name) else: print(Billing already disabled)关键点逐层解读消息解码Pub/Sub 触发的函数收到的消息体中data字段是 Base64 编码的字符串需先base64.b64decode再json.loads还原成 JSON金额比较取出costAmount当前成本与budgetAmount预算金额——注意预算消息的 JSON 结构必须包含这两个字段这正是后续验证步骤中测试消息的由来未超支提前返回cost_amount budget_amount时打印 No action necessary 并直接返回不做任何破坏性操作查询当前账单状态通过_is_billing_enabled调用 Cloud Billing API 的get_project_billing_info检查项目当前是否启用了账单条件停用仅在账单仍处于启用状态时才执行停用否则打印 Billing already disabled避免重复操作。停用账单的核心实现位于_disable_billing_for_project它构造一个UpdateProjectBillingInfoRequest将project_billing_info.billing_account_name显式置为空字符串——这正是 Cloud Billing API 中解除账单关联、停用计费的标准做法request billing.UpdateProjectBillingInfoRequest( nameproject_name, project_billing_infobilling.ProjectBillingInfo( billing_account_name # Disable billing ), ) cloud_billing_client.update_project_billing_info(request)函数顶部还完成了两个关键初始化PROJECT_ID google.auth.default()[1]从默认凭据自动获取当前项目 ID与cloud_billing_client billing.CloudBillingClient()创建 Cloud Billing 客户端。整个函数只需要google-auth与 google-cloud-billing1.14.1 两个依赖。部署函数使用 gcloud 将函数部署到stop_billing名称下指定 Python 运行时、源码目录与触发主题gcloud functions deploy ${FUNCTION_NAME} \ --runtimepython37 \ --source./sample_code \ --trigger-topic${TOPIC_NAME}说明教程原文中的--source./sample_code指向教程配套的代码目录。在当前仓库中这份函数代码位于 billing/main.py因此实际部署时应把--source指向包含main.py的目录例如在billing目录下执行gcloud functions deploy stop_billing --runtimepython37 --source. --trigger-topicbudget-notification。同时建议优先使用当前受支持的 Python 运行时版本如python312仓库的 requirements-test.txt 中pytest9.0.3; python_version 3.10也表明代码面向 Python 3.10 环境测试。--trigger-topic将函数与budget-notification主题绑定主题上每出现一条新消息函数即被触发执行一次。配置服务账号权限在函数的创建、更新或删除过程中Cloud Functions 服务使用的是Google Cloud Functions 服务代理服务账号。你必须为该服务账号授予停用账单所需的权限例如 Ownerroles/owner包含 Billing Admin 等管理能力否则函数执行update_project_billing_info时会因权限不足失败gcloud projects add-iam-policy-binding \ ${GOOGLE_CLOUD_PROJECT} \ --memberserviceAccount:${GOOGLE_CLOUD_PROJECT}appspot.gserviceaccount.com \ --roleroles/owner这条命令把测试项目IDappspot.gserviceaccount.comApp Engine 默认服务账号也是 Cloud Functions 使用的服务代理绑定到项目的 Owner 角色上。验证发布测试消息并确认账单已停用模拟超支场景向主题发布一条测试消息模拟成本 100.01 美元 预算 100.00 美元的超支情形gcloud pubsub topics publish ${TOPIC_NAME} --message{costAmount: 100.01,budgetAmount: 100.00}若函数执行成功测试项目将不再出现在该账单账户下项目中的资源会被禁用。确认真实生效再次查询项目的账单账户若输出为空无billingAccountName行则说明 Cloud Billing 已被成功停用gcloud beta billing projects describe {{project-id}} | grep billingAccountName测试用例如何验证这三条分支仓库中的 test_main.py 用单元测试锁定了stop_billing的三种行为分支与上面的验证逻辑一一对应test_stop_billing_under_budget构造costAmount10 budgetAmount100.1的消息断言输出包含 No action necessary验证未超支时不触发停用test_stop_billing_over_budget用mock.patch拦截update_project_billing_info构造超支消息断言停用 API 被调用且传入的billing_account_name test_stop_billing_already_disabledmockget_project_billing_info返回billing_enabledFalse断言输出 Billing already disabled验证重复触发时的幂等性。测试文件注释还透露了一个实现细节这些用例使用 mock 而非真实开关账单是因为服务账号无法被授予为项目添加账单账户的足够权限参见 Cloud Billing 官方文档中修改项目的说明——这也从侧面印证了权限配置在整个方案中的重要性。风险提示与后续扩展务必知晓的破坏性风险警告使用 Cap Billing 示例会从你的项目中移除 Cloud Billing从而关停全部资源。这可能造成资源被不可恢复地删除且无法保证服务可恢复虽然你可以重新启用 Cloud Billing但可能需要手动重新配置服务。因此该方案应优先用于沙箱、教学与测试项目生产环境请结合业务评估后再决定是否采用。更多自动化成本控制方向完成封顶闭环后可以继续探索将通知发送到 Slack在预算通知的基础上接入 Slack 告警让团队实时感知成本变化选择性控制资源用量按服务或标签维度精细化管控而不是一刀切地停用整个项目。总结本文完整还原了python-docs-samples仓库中 Cap Billing 方案的落地路径预算Budget→ Pub/Sub 主题 → 触发函数 → 解绑账单账户四者环环相扣构成自动成本封顶闭环。配合 main.py 的源码解析与 test_main.py 的测试验证你不仅能照教程跑通流程更能理解每一步背后的 API 调用与权限模型。整个流程约 10 分钟即可完成是控制 Google Cloud 消费上限最直接、最可复用的自动化手段之一。赞分享示例工程【免费下载链接】python-docs-samplesCode samples used on cloud.google.com项目地址https://gitcode.com/GitHub_Trending/py/python-docs-samples点击查看免费下载相关推荐TabPFN 快速上手指南10分钟搞定表格数据的分类与回归TabPFN 快速上手指南10分钟搞定表格数据的分类与回归 手里只有几百行样本、又要在一两天内交付模型这是数据科学里很常见的窘境树模型容易过拟合深度模型人工智能基础模型机器学习微调如何在Windows 10/11上畅玩经典游戏DxWrapper终极兼容性解决方案如何在Windows 10/11上畅玩经典游戏DxWrapper终极兼容性解决方案 还在为那些经典游戏无法在现代Windows系统上运行而烦恼吗 DxWra游戏开发图形学Read the Docs 构建流程实战指南通知、Webhook、自动化规则与构建控制Read the Docs 构建流程实战指南通知、Webhook、自动化规则与构建控制 Read the Docs 的构建流程是整个文档托管平台的核心。当代码后端文档上一篇Flow 成员模式MatchMemberPattern实战用 match 表达式实现基于 HTTP 状态码的重试退避策略下一篇Enzyme 在 React 0.13 中的安装与使用指南enzyme-adapter-react-13 全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考