2. Google Cloud Billing体系与成本数据基础
在开始做任何成本优化之前,必须先回答一个更基础的问题:钱到底花在哪里、由谁花的、什么时候花的。Google Cloud 的 Billing 体系就是回答这三个问题的数据底座。本节围绕 Cloud Billing 账户、预算、结算导出、BigQuery 计费导出、标签与资源层级五个对象展开,目标是让你能把原始计费数据接入到可分析的位置,并理解每条记录背后的归属逻辑。
一、Cloud Billing 账户:账单的归属主体
Cloud Billing 账户(Billing Account)是 Google Cloud 中支付费用的顶层实体,它绑定一个付款方式(信用卡、发票或采购订单),并决定账单以什么币种、什么结算周期出具。一个 Billing 账户可以关联多个 Project,一个 Project 在任一时刻只能关联一个 Billing 账户,但可以随时改绑——改绑后费用按时间切分,历史账单不会迁移。
这里有一个容易被忽略的细节:Billing 账户是 IAM 权限的边界。查看账单、导出数据、设置预算这些操作,权限都授予在 Billing 账户层级,而不是 Project 层级。常见角色包括 Billing Account Viewer(只读账单)、Billing Account Costs Manager(管理预算和导出)、Billing Account Administrator(全权)。如果团队里有人看不到费用,第一件事不是查数据,而是查他在 Billing 账户上的角色。
另一个关键概念是子账户(Sub-account)。当企业需要按部门、按业务线分别出账时,可以在主 Billing 账户下创建子账户,每个子账户独立关联 Project、独立出账单,但付款仍由主账户统一完成。这为后续按成本中心分摊提供了天然的分组维度。
二、预算与告警:从被动看账到主动预警
预算(Budget)是挂在 Billing 账户上的监控规则,它本身不会阻止消费,只负责在费用或预测费用超过阈值时发出通知。一个预算由三部分组成:范围(Scope)、金额(Amount)、阈值规则(Threshold Rules)。
范围可以限定为整个 Billing 账户,也可以按 Project、Service、SKU、标签等维度过滤。例如只监控 service = Compute Engine 且 label.env = prod 的支出。金额可以设为固定值,也可以基于上一周期的实际支出自动滚动。阈值规则支持按实际支出百分比和预测支出百分比分别触发,常见配置是 50%、90%、100% 三档,预测阈值设为 100% 以便提前发现异常增长。
通知默认发到 Billing 账户管理员的邮箱,也可以配置 Pub/Sub 主题,把告警推给自建的成本监控系统。需要注意的是,预算数据有延迟,通常几小时到一天,因此它适合做趋势预警,不适合做实时熔断。
三、结算导出与 BigQuery 计费导出:把账单变成可查询的数据
控制台里的账单页面只能看汇总,真正做分析必须用导出。Google Cloud 提供两类导出:结算导出到 BigQuery和结算导出到文件(Cloud Storage,CSV/JSON)。前者是成本分析的主力,后者多用于归档或对接外部财务系统。
BigQuery 计费导出需要指定一个数据集,Google 会按天写入 gcp_billing_export_v1_XXXXXX 格式的表。这张表是分析的核心,几个字段必须理解清楚:
cost:以 Billing 账户币种计的实际费用,已包含折扣和信用额度抵扣。credits:数组字段,记录每一笔抵扣的类型(如 COMMITTED_USAGE_DISCOUNT、SUSTAINED_USAGE_DISCOUNT、PROMOTION)和金额。usage_start_time/usage_end_time:资源实际使用的时间窗口,注意它与账单出具时间不同。project.id、service.description、sku.description:归属维度,分别回答“哪个项目”“哪个服务”“哪个计费项”。labels:资源标签,是自定义分摊的唯一入口。resource.name:资源标识,可用于定位具体实例或磁盘。
导出配置时有两个选项值得注意:是否包含信用额度(Include credits)和是否包含价格(Include price)。做净成本分析时两者都应开启,否则会看到虚高的原始费用。导出一旦开启,历史数据不会自动回填,因此建议在项目早期就配置好。
四、标签与资源层级:成本归属的坐标系
Google Cloud 的资源层级是 Organization → Folder → Project → Resource。账单记录天然带有 Project 和 Resource 信息,但 Folder 和 Organization 层级不会直接出现在计费导出里,需要自己维护一张 Project 到 Folder 的映射表来做上卷。
标签(Label)是键值对,可以打在 Project、实例、磁盘、Bucket 等资源上,并会随计费记录一起导出。它是实现“按团队/环境/成本中心分摊”的主要手段。标签治理有三条实践原则:
- 键名统一:例如固定使用
team、env、cost-center,避免出现Team、team_name混用。 - 值域受控:
env只允许 dev/staging/prod,防止出现 “production”“Prod” 等变体。 - 创建即打标:通过组织策略或 Terraform 模板强制新资源带标签,事后补标成本极高。
需要提醒的是,标签是资源级的,不是所有服务都支持全部标签,且标签变更只影响变更之后的计费记录,历史数据不会追溯。因此标签分析要接受“数据有断层”这一现实。
五、成本数据接入实战:从导出到第一张分摊报表
下面给出一个可复现的接入流程,示例参数均为教学假设,实际使用时替换为你的项目信息。
# 1. 创建用于存放计费导出的数据集
bq mk --dataset --location=US my-billing-project:billing_export
# 2. 在 Cloud Console 的 Billing → Billing export 中配置
# BigQuery export,选择上面的数据集
# 勾选 Include credits 和 Include price
# 3. 导出生效后(通常次日),查询最近 7 天按项目汇总的净成本
SELECT
project.id AS project_id,
ROUND(SUM(cost), 2) AS net_cost,
ROUND(SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)), 2) AS credit_total
FROM `my-billing-project.billing_export.gcp_billing_export_v1_XXXXXX`
WHERE usage_start_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY project_id
ORDER BY net_cost DESC;
执行后你会得到一张按项目排序的净成本表。判断接入是否成功的标准有三条:数据行数不为零、cost 与 credit_total 之和能对上控制台账单、labels 字段中能看到你打的标签。如果标签为空,说明资源未打标或导出未包含标签,需要回到标签治理环节。
六、五个对象之间的关系
把本节内容串起来看:Billing 账户是费用归属和权限的根;预算挂在 Billing 账户上做预警;结算导出把账单落成 BigQuery 表;标签和资源层级为每条记录提供归属坐标;最终通过 SQL 把原始记录聚合成可分摊、可对比的成本视图。理解这条链路,后续的容量治理和优化才有可靠的数据基础。