本文档介绍如何使用 Pub/Sub 设置程序化预算和费用异常通知(预览版功能)。
预算和费用异常通常会配置为通过邮件发送通知。如果您将预算或费用异常检测功能作为一项费用控制工具来使用,那么邮件通知可能不是最佳方法,不一定能确保您及时采取措施来控制您的费用。您可以设置并使用程序化通知,以自动做出费用控制响应。自动做出费用控制响应的示例包括:
限制
- 预算所用的 Cloud Billing 数据为估算值,这些数据在账单最终确定前可能会发生变化。 
- 如果您将组织政策设置为按网域限制资源共享(例如,在 Pub/Sub 主题上启用 - enforceInTransit),则您在尝试设置或关联 Pub/Sub 主题时可能会遇到错误。在这种情况下,您可能需要强制账号访问才能成功地将 Pub/Sub 主题关联到预算。如需强制账号访问,请完成以下步骤:- 使用以下方法之一移除包含网域限制条件的组织政策:
- 暂时移除组织政策。
- 替换项目的组织政策,该项目包含 Pub/Sub 主题。
 
- 按照关联 Pub/Sub 主题中的步骤操作。
- 恢复组织或项目的组织政策(可选)。
 
- 使用以下方法之一移除包含网域限制条件的组织政策:
执行此任务所需的权限
预算通知
如需设置程序化预算通知,您需要拥有创建或修改预算和 Pub/Sub 主题的权限。您需要的一组权限因您的访问权限级别而异。
| 拥有 Cloud Billing 账号权限的用户 | 仅拥有项目级权限的用户(预览版) | 
|---|---|
| 如果您的组织使用自定义角色进行身份验证,则这些自定义角色需要拥有以下权限: 
 若要使自定义角色能够修改现有的 Cloud Billing 预算并将其关联到现有的 Pub/Sub 主题,您需要拥有以下权限: 
 如需使用预定义角色获得必要权限,请让您的管理员为您授予 Cloud Billing 账号的以下预定义 Cloud Billing IAM 角色之一: 此外,让您的管理员为您授予包含 Pub/Sub 主题的目标项目的以下角色: | 如果您的组织使用自定义角色进行身份验证,则这些自定义角色需要拥有以下权限: 
 如需使用预定义角色获得必要权限,请让您的管理员为您授予项目的以下预定义 Cloud Billing IAM 角色之一: 此外,让您的管理员为您授予包含 Pub/Sub 主题的目标项目的以下角色: | 
异常通知
如需设置程序化异常通知,您需要拥有创建或修改异常和 Pub/Sub 主题的权限。您必须拥有 Cloud Billing 账号权限。
| 拥有 Cloud Billing 账号权限的用户(预览版) | 
|---|
| 如需使用预定义角色获得必要权限,请让您的管理员为您授予 Cloud Billing 账号的以下预定义 Cloud Billing IAM 角色之一: 此外,让您的管理员为您授予包含 Pub/Sub 主题的目标项目的以下角色: | 
创建 Pub/Sub 主题
如需设置程序化预算或异常通知,您必须先创建 Pub/Sub 主题。如果您已针对预算或异常费用配置 Pub/Sub 主题,则可以跳过此步骤。
- 前往 Google Cloud 控制台的 Pub/Sub 页面。 
- 选择要包含 Pub/Sub 主题的项目。 - 为结算通知配置 Pub/Sub 主题时,我们建议您使用 FinOps 管理项目来包含与结算相关的 Pub/Sub 主题。 
- 点击 创建主题。 
- 在主题 ID 字段中,提供一个主题名称。 
- 保留默认的订阅和加密设置,然后点击创建。 
关联 Pub/Sub 主题
要使程序化通知能够接收与预算或异常的当前状态相关的 Pub/Sub 消息,您必须将预算或异常与 Pub/Sub 主题相关联。
预算通知
如需将 Pub/Sub 主题关联到 Cloud Billing 预算,请完成以下步骤:
| 拥有 Cloud Billing 账号权限的用户 | 仅拥有项目级权限的用户(预览版) | 
|---|---|
| 
 | 
 | 
异常通知
如需将 Pub/Sub 主题与费用异常相关联,请完成以下步骤:
| 拥有 Cloud Billing 账号权限的用户(预览版) | 
|---|
| 
 | 
通知格式
发送到 Pub/Sub 主题的通知由以下两部分组成:
- 特性:描述事件的一组键值对。
- 数据:一个字符串,包含了描述预算提醒详细信息的 JSON 对象。 
预算通知
属性
特性是指 Cloud Billing 发送到 Pub/Sub 主题的所有通知中包含的键值对。无论通知载荷为何,通知始终包含下列键值对。
| 属性名称 | 示例 | 说明 | 
|---|---|---|
| billingAccountId | 
01D4EE-079462-DFD6EC
 | 预算所属 Cloud Billing 账号的标识符。 | 
| budgetId | 
de72f49d-779b-4945-a127-4d6ce8def0bb
 | Cloud Billing 账号中预算提醒的标识符。 | 
| schemaVersion | 
1.0
 | 通知架构版本。 | 
数据
预算提醒详细信息会以采用 base64 编码的 UTF-8 字符串的形式返回,该字符串包含具有以下属性的 JSON 对象:
| 数据 | 示例 | 说明 | 
|---|---|---|
| 
budgetDisplayName
 | 
"My Personal Budget"
 | 为预算指定的简明易懂的名称。 | 
| 
costAmount
 | 
140.321
 | 所产生的费用金额。跟踪的费用类型取决于预算过滤条件和设置。 | 
| 
costIntervalStart
 | 
"2021-02-01T08:00:00Z"
 | 预算提醒期限的开始时间。`costAmount` 包括从此时间开始的使用费用。这是预算时间段(月份、季度、年份或自定义日期范围)发生预算使用的第一天。 | 
| 
budgetAmount
 | 
152.557
 | 预算中分配的金额。 | 
| 
budgetAmountType
 | 
"SPECIFIED_AMOUNT"
 | 预算金额类型。可以是下列值之一: 
 | 
| 
alertThresholdExceeded
 | 
0.9
 | 超出的最高实际费用提醒阈值配置。值是十进制数格式的百分比(例如 0.9 即 90%)。如果实际费用没有超过任何阈值,则此键不存在。 | 
| 
forecastThresholdExceeded
 | 
0.2
 | 超出的预测费用最高提醒阈值。值是十进制数格式的百分比(例如 0.2 即 20%)。如果预测费用没有超过任何阈值,则此键不存在。 | 
| 
currencyCode
 | 
"USD"
 | 预算提醒货币。所有费用和预算提醒金额均以此货币计算。 | 
异常通知
属性
属性是指 Cloud Billing 发送到 Pub/Sub 主题的所有通知中包含的键值对。无论通知载荷为何,通知始终包含下列键值对。
| 属性名称 | 示例 | 说明 | 
|---|---|---|
| 范围 | 
scope_project
 | 异常范围。 | 
| billingAccountName | 
billingAccounts/01D4EE-079462-DFD6EC
 | 发生异常的 Cloud Billing 账号的标识符。 | 
| resourceDisplayName | 
My project
 | 发生异常的资源的显示名称。 | 
| resourceName | 
projects/123456
 | 发生异常的资源的标识符。 | 
| SchemaVersion | 
1.0
 | Pub/Sub 架构版本。 | 
数据
异常提醒详细信息会以采用 base64 编码的 UTF-8 字符串的形式返回,该字符串包含具有以下属性的 JSON 对象:
| 数据 | 示例 | 说明 | 
|---|---|---|
| 
anomalyName
 | 
billingAccounts/01D4EE-079462-DFD6EC/anomalies/aaa
 | 异常的资源名称。 | 
| 
billingAccountName
 | 
billingAccounts/01D4EE-079462-DFD6EC
 | 结算账号的标识符。 | 
| 
resourceName
 | 
"projects/12345"
 | 发生异常的资源的标识符。 | 
| 
resourceDisplayName
 | 
"My project"
 | 发生异常的资源的显示名称。 | 
| 
detectionDate
 | 
"2024-02-01T08:00:00Z"
 | 检测到费用异常的日期。 | 
| 
Scope
 | 
SCOPE_PROJECT
 | 指示异常的范围。 | 
| 
expectedSpendAmount
 | 
{ | 资源的预计支出。 | 
| 
actualSpendAmount
 | 
196.22
 | 资源的实际支出。 | 
| 
deviationAmount
 | 
31.01
 | 实际支出与预计支出之间的差额。 | 
| 
deviationPercentage
 | 
18.77
 | 与预计支出相比的偏差金额所占的百分比。 | 
| 
Root cause
 | 
root_causes {
resource: "services/XXX-XXXX-XXX"
display_name: "BigQuery"
cause_type: CAUSE_TYPE_SERVICE
deviation {
  expected_spend {
    currency_code: "USD"
    units: "5000"
  }
  actual_spend {
    currency_code: "USD"
    units: "5000"
  }
  deviation_amount {
    currency_code: "USD"
    units: "5000"
  }
  deviation_percentage: "Infinity"
}
sub_causes {
  resource: "locations/us-west1",
  display_name: "us-west1",
  cause_type: CAUSE_TYPE_LOCATION,
  deviation {
    expected_spend {
      currency_code: "USD",
    }
    actual_spend {
      currency_code: "USD",
      units:"5000"
    }
    deviation_amount {
      currency_code: "USD",
      units: "5000"
    }
    deviation_percentage: "Infinity"
  }
  sub_causes {
    resource: "services/XXXX-XXXX-XXXX/skus/XXXX-XXXX-XXXX"
    display_name: "Some display name"
    cause_type: CAUSE_TYPE_SKU
    deviation {
      expected_spend {
        currency_code: "USD"
      }
      actual_spend {
        currency_code: "USD"
        units: 5000
      }
      deviation_amount {
        currency_code: "USD"
        units: 5000
      }
      deviation_percentage: "Infinity"
    }
  }
  sub_causes {
    resource: "services/XXXX-XXXX-XXXX/skus/XXXX-XXXX-XXXX"
    display_name: "Some display name"
    cause_type: CAUSE_TYPE_SKU
    deviation {
      expected_spend {
        currency_code: "USD"
        units: "1"
        nanos: 5413077
      }
      actual_spend {
        currency_code: "USD"
        units: "1",
        nanos: 122606000
      }
      deviation_amount {
        currency_code: "USD"
        nanos: 117192923
      }
      deviation_percentage:11.656196419841217
    }
  }
}
}
 | 一个重复字段,其中包含导致异常的根本原因的相关信息。 | 
向 Pub/Sub 发送通知的送达保证
将预算或异常关联到 Pub/Sub 主题后,您会按如下方式收到程序化通知:
预算通知
- 系统会每天向您的 Pub/Sub 主题多次发送预算通知,其中会包含您的当前预算状态。此频率与预算提醒邮件的频率不同,后者仅在达到预算阈值时才会发送。
- 即使 Cloud Billing 账号没有用量,系统也会发送 Pub/Sub 通知。
- 您可能需要等几个小时才能收到第一则 Pub/Sub 通知。
- Pub/Sub 仅保证至少传送一次。您可能会多次收到消息,并且消息的到达顺序可能与发送顺序不一致。
- 如果由于 Pub/Sub 主题配置错误而导致送达失败,您将不会收到通知。
传送可能会因以下原因之一而失败:
异常通知
- 只有在达到阈值时,系统才会向 Pub/Sub 主题发送异常通知。
- Pub/Sub 仅保证至少送达一次。您可能会多次收到消息,并且消息的到达顺序可能与发送顺序不一致。
- 如果由于 Pub/Sub 主题配置错误而导致送达失败,您将不会收到通知。
传送可能会因以下原因之一而失败:
如需了解详情,请参阅在 Pub/Sub 中发布和接收消息。
后续步骤
如需详细了解如何使用程序化通知,请查看下列有关程序化费用控制响应的示例: