このドキュメントでは、Pub/Sub を使用して、プログラムによる予算と費用の異常(プレビュー)通知を設定する方法について説明します。
通常、予算と費用の異常は、メール通知を送信するように構成されます。予算または費用の異常検出を費用管理ツールとして使用している場合、メール通知は、費用をタイムリーに管理する最適な方法でない場合があります。プログラムによる通知を設定して使用すると、費用管理レスポンスを自動化できます。自動化された費用管理レスポンスの例には、次のようなものがあります。
制限事項
- 予算では Cloud Billing の予測データが使用されます。予測請求額は、最終的な請求書が確定するまでは変わる可能性があります。 
- 組織のポリシーをドメインごとにリソース共有を制限するように設定すると(Pub/Sub トピックで - enforceInTransitを有効にするなど)、Pub/Sub トピックの設定や接続の際にエラーが発生する可能性があります。この場合、Pub/Sub トピックを予算に正しく関連付けるには、アカウントへの強制アクセスが必要になることがあります。アカウントへのアクセス権を強制的に付与するには、次の手順を行います。- ドメインの制限を含む組織のポリシーを、次のいずれかの方法で削除します。
- 手順に沿って、Pub/Sub トピックを接続します。
- 組織またはプロジェクトの組織のポリシーを復元します(省略可)。
 
このタスクに必要な権限
予算通知
プログラムによる予算通知を設定するには、予算と Pub/Sub トピックを作成または変更する権限が必要です。必要な権限は、アクセスのレベルに応じて異なります。
| Cloud 請求先アカウントの権限を持つユーザー | プロジェクト レベルの権限のみを持つユーザー(プレビュー) | 
|---|---|
| 組織で認証にカスタムロールを使用する場合は、カスタムロールに次の権限が必要です。 
 既存の Cloud Billing 予算を変更して既存の Pub/Sub トピックに関連付けるカスタムロールには、次の権限が必要です。 
 事前定義ロールを使用して必要な権限を付与するには、Cloud 請求先アカウントに次のいずれかの Cloud Billing IAM 事前定義ロールを付与するように管理者へ依頼してください。 Pub/Sub トピックを含む対象プロジェクトに対して、次のロールを付与するように管理者へ依頼してください。 | 組織で認証にカスタムロールを使用する場合は、カスタムロールに次の権限が必要です。 
 事前定義ロールを使用して必要な権限を付与するには、プロジェクトに対する次のいずれかの Cloud Billing IAM 事前定義ロールを付与するように管理者へ依頼してください。 Pub/Sub トピックを含む対象プロジェクトに対して、次のロールを付与するように管理者へ依頼してください。 | 
異常通知
プログラムによる異常通知を設定するには、異常と Pub/Sub トピックを作成または変更する権限が必要です。Cloud 請求先アカウントの権限が必要です。
| Cloud 請求先アカウントの権限を持つユーザー(プレビュー) | 
|---|
| 事前定義ロールを使用して必要な権限を付与するには、Cloud 請求先アカウントに次のいずれかの 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 請求先アカウントの権限を持つユーザー | プロジェクト レベルの権限のみを持つユーザー(プレビュー) | 
|---|---|
| 
 | 
 | 
異常通知
Pub/Sub トピックを費用の異常と接続するには、次の手順を行います。
| Cloud 請求先アカウントの権限を持つユーザー(プレビュー) | 
|---|
| 
 | 
通知形式
Pub/Sub トピックに送信される通知は、次の 2 つの部分で構成されます。
- 属性: イベントを記述する Key-Value ペア。
- データ: 予算アラートの詳細を記述する JSON オブジェクトを含む文字列。 
予算通知
属性
属性は、Cloud Billing から Pub/Sub トピックに送信されるすべての通知に含まれる Key-Value ペアです。通知ペイロードに関係なく、通知には次の Key-Value ペアのセットが含まれます。
| 属性名 | 例 | 説明 | 
|---|---|---|
| billingAccountId | 
01D4EE-079462-DFD6EC
 | 予算を所有する Cloud 請求先アカウントの ID。 | 
| budgetId | 
de72f49d-779b-4945-a127-4d6ce8def0bb
 | Cloud 請求先アカウント内の予算アラートの ID。 | 
| 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
 | 最大の費用の実値のしきい値。これを超えるとアラートが通知されます。値は 10 進数形式のパーセントです(たとえば、0.9 は 90% です)。費用の実値がしきい値を超えない場合、このキーは存在しません。 | 
| 
forecastThresholdExceeded
 | 
0.2
 | 最大の予測費用アラートのしきい値。これを超えるとアラートが通知されます。値は 10 進数形式のパーセントです(たとえば、0.2 は 20% です)。予測費用がしきい値を超えない場合、このキーは存在しません。 | 
| 
currencyCode
 | 
"USD"
 | 予算アラートの通貨。すべての費用と予算アラートの金額はこの通貨で表示されます。 | 
異常通知
属性
属性は、Cloud Billing から Pub/Sub トピックに送信されるすべての通知に含まれる Key-Value ペアです。通知ペイロードに関係なく、通知には次の Key-Value ペアのセットが含まれます。
| 属性名 | 例 | 説明 | 
|---|---|---|
| scope | 
scope_project
 | 異常の範囲。 | 
| billingAccountName | 
billingAccounts/01D4EE-079462-DFD6EC
 | 異常が発生した Cloud 請求先アカウントの ID。 | 
| resourceDisplayName | 
My project
 | 異常が発生したリソースの表示名。 | 
| resourceName | 
projects/123456
 | 異常が発生したリソースの ID。 | 
| SchemaVersion | 
1.0
 | Pub/Sub スキーマのバージョン。 | 
データ
異常アラートの詳細は、base64 でエンコードされた UTF-8 文字列で返されます。これには、次のプロパティを持つ JSON オブジェクトが含まれています。
| データ | 例 | 説明 | 
|---|---|---|
| 
anomalyName
 | 
billingAccounts/01D4EE-079462-DFD6EC/anomalies/aaa
 | 異常のリソース名。 | 
| 
billingAccountName
 | 
billingAccounts/01D4EE-079462-DFD6EC
 | 請求先アカウントの ID。 | 
| 
resourceName
 | 
"projects/12345"
 | 異常が発生したリソースの ID。 | 
| 
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 トピックに接続すると、プログラムによる通知が次のように届きます。
予算通知
- 予算通知は、予算の現在のステータスとともに 1 日に数回、Pub/Sub トピックに送信されます。この頻度は、予算アラートメールの頻度とは異なります。予算アラートメールは、予算しきい値に達したときにのみ送信されます。
- Pub/Sub 通知は、Cloud 請求先アカウントで使用量がない場合にも送信されます。
- 最初の Pub/Sub 通知を受け取るまで数時間かかる場合があります。
- Pub/Sub は at-least-once(最低 1 回)配信のみを保証します。メッセージが複数回送信されたり、メッセージが順不同で到着したりする場合があります。
- Pub/Sub トピックの構成ミスにより配信に失敗した場合、通知は表示されません。
次のいずれか 1 つの理由により、配信が失敗することがあります。
- Pub/Sub トピックが存在しない。
- Cloud Billing に Pub/Sub トピックへのパブリッシュ権限がない。
- 通知の割り当てを超過した。
- ドメインごとにリソース共有を制限する組織のポリシーが設定されている。
異常通知
- 異常通知は、しきい値に達した場合にのみ Pub/Sub トピックに送信されます。
- Pub/Sub は at-least-once(最低 1 回)配信のみを保証します。メッセージが複数回送信されたり、メッセージが順不同で到着したりする場合があります。
- Pub/Sub トピックの構成ミスにより配信に失敗した場合、通知は表示されません。
次のいずれか 1 つの理由により、配信が失敗することがあります。
- Pub/Sub トピックが存在しない。
- Cloud 請求先アカウントに Pub/Sub トピックへのパブリッシュ権限がない。
- 通知の割り当てを超過した。
- ドメインごとにリソース共有を制限する組織のポリシーが設定されている。
詳細については、Pub/Sub にメッセージをパブリッシュし、受信するをご覧ください。
次のステップ
プログラムによる通知の使用方法についての詳細は、プログラムによる費用管理レスポンスの例をご覧ください。