費用を重視し、予算に関連して環境を制御する必要がある場合は、プログラムによる予算通知を使用して、予算通知に基づいて費用管理レスポンスを自動化できます。
予算通知では、Pub/Sub トピックを使用して、クラウド向けのエンタープライズ メッセージ指向ミドルウェアが持つスケーラビリティ、柔軟性、信頼性を活用し Cloud Billing の予算のステータスをリアルタイムで示します。
このページでは、Cloud Functions で予算通知を使用して費用管理を自動化する方法の例と詳しい手順を示します。
予算通知を設定する
最初のステップとして、予算の Pub/Sub トピックを有効にします。詳細については、プログラムによる予算アラート通知を管理するをご覧ください。
予算通知を有効にしたら、次の点に注意してください。
- Pub/Sub トピック: これは、予算用に構成された通知エンドポイントです。
- 予算 ID: すべての通知に含まれる予算の一意な ID です。予算の ID は [通知の管理] に表示されます。[Pub/Sub トピックをこの予算に接続する] を選択すると、ID が表示されます。
通知をリッスンする
次に、Pub/Sub トピックに登録して通知をリッスンします。サブスクライバーがない場合、公開されたメッセージは Pub/Sub で削除され、後で取得することはできません。
トピックに登録するにはさまざまな方法がありますが、この例では Cloud Function のトリガーを使用します。
Cloud Functions の関数を作成する
新しい Cloud Functions の関数を作成するには:
Google Cloud コンソールで、[Cloud Functions] ページに移動します。
[
関数を作成] をクリックして、予算に対して意味を持つ名前を付けます。[トリガー] で、[Cloud Pub/Sub] を選択します。
予算に構成したトピックを選択します。
関数を実行するためのソースコードと依存関係を指定します。
[実行する関数] を正しい関数名に設定します。
Cloud Functions の関数を記述する
通知で実行することを Cloud Function に指示するには、インライン エディタを使用してコードを記述するか、ファイルをアップロードします。コードが受け取る通知の詳細については、通知形式をご覧ください。
たとえば、関数は予算通知によってトリガーされると、受信した Pub/Sub 通知、属性、データをログに記録します。詳細については、Pub/Sub トリガーをご覧ください。
Cloud Function イベントを表示する
Cloud Function を保存した後、[ログを表示] をクリックすると、ログに記録された予算通知を表示できます。これには、関数呼び出しからのログが表示されます。
Cloud Functions の関数をテストする
通知が Pub/Sub に送信され、登録者がメッセージを受信します。サンプル通知をテストして、関数が意図したとおりに機能していることを確認するには、このオブジェクトをメッセージ本文として Pub/Sub で次のようなメッセージを発行します。
{ "budgetDisplayName": "name-of-budget", "alertThresholdExceeded": 1.0, "costAmount": 100.01, "costIntervalStart": "2019-01-01T00:00:00Z", "budgetAmount": 100.00, "budgetAmountType": "SPECIFIED_AMOUNT", "currencyCode": "USD" }
請求先アカウント ID などのメッセージ属性を追加することもできます。詳細については、通知形式のドキュメントをご覧ください。
Slack に通知を送信する
特に予算が重要で時間的制約がある場合、必ずしもメールがクラウド費用の状況を把握する最適な方法とは限りません。通知では、予算メッセージを他のメディアに転送できます。
この例では、予算通知を Slack に転送する方法を説明します。この方法では、Cloud Billing で予算通知が発行されるたびに、Cloud Function がボットを使用してボットのワークスペースの Slack チャネルにメッセージを投稿します。
Slack チャネルと権限を設定する
最初に、Slack ワークスペースと、Slack API を呼び出すためのボットユーザー トークンを作成します。API トークンは、https://api.slack.com/apps で管理できます。詳細については、Slack サイトの Bot Users をご覧ください。
Cloud Functions の関数を記述する
Cloud Function を作成するの手順で、新しい関数を作成します。使用する予算と同じ Pub/Sub トピックをトリガーに設定します。
依存関係を追加します。
Node.js
以下のコードを
package.json
にコピーします。Python
以下のコードを
requirements.txt
にコピーします。Slack API を使用して Slack チャット チャネルに予算通知を投稿するコードを記述、または次の例を使用します。
次の Slack API postMessage のパラメータが正しく設定されていることを確認します。
- ボットユーザー OAuth アクセス トークン
- チャネルの名前
コードの例:
Node.js
Python
これで、Cloud Functions の関数をテストして、Slack にメッセージが表示されることを確認できるようになりました。
課金に上限を設定(課金を無効化)して使用を停止する
この例では、費用の上限を設定し、Cloud Billing を無効にしてプロジェクトの使用を停止します。プロジェクトに対する課金を無効にすると、無料枠サービスを含め、プロジェクト内のすべての Google Cloud サービスが停止されます。
課金を無効にする理由
Google Cloud に支出できる金額に厳しい制限があるため、費用に上限を設定したい場合があります。これは、サンドボックス環境で作業する学生、研究者、開発者にとってよくあることです。このような場合、予算の上限に達したら支出を停止し、Google Cloud Platform のすべてのサービスと使用を停止したいと考えるかもしれません。
この例では、Cloud Billing を安全に無効にできる非本番環境プロジェクトとして acme-backend-dev を使用します。
この例の作業を開始する前に、次のことが完了していることを確認してください。
Cloud Billing API を有効にする。Cloud Functions の関数で Cloud Billing API を呼び出し、プロジェクトの Cloud Billing を無効にする必要があります。
プロジェクトの費用をモニタリングする予算を設定し、予算通知を有効にする。
Cloud Functions の関数を記述する
次に、Cloud Billing API を呼び出すように Cloud Function を構成する必要があります。これにより、Cloud Function がサンプル プロジェクト acme-backend-dev の Cloud Billing を無効にできます。
Cloud Function を作成するの手順で、新しい関数を作成します。使用する予算と同じ Pub/Sub トピックをトリガーに設定します。
次の依存関係を追加します。
Node.js
以下のコードを
package.json
にコピーします。Python
以下のコードを
requirements.txt
にコピーします。以下のコードを Cloud Functions の関数にコピーします。
実行する関数を stopBilling(Node)または stop_billing(Python)に設定します。
ランタイムによっては、
GOOGLE_CLOUD_PROJECT
環境変数が自動的に設定される場合があります。自動的に設定される環境変数のリストを確認し、Cloud Billing に上限を設定する(無効にする)対象プロジェクトにGOOGLE_CLOUD_PROJECT
変数を手動で設定する必要があるかどうかを判断します。
Node.js
Python
サービス アカウント権限を構成する
Cloud Function は自動的に作成されたサービス アカウントとして実行されます。サービス アカウントで課金を無効にできるように、課金管理者などの適切な権限を付与する必要があります。
正しいサービス アカウントを特定するには、Cloud Function の詳細を表示します。サービス アカウントはページの下部に表示されます。
課金管理者の権限は、Google Cloud コンソールの [お支払い] ページで管理できます。
サービス アカウントに請求先アカウント管理者の権限を付与するには、サービス アカウント名を選択します。
Cloud Billing が無効であることを確認する
予算による通知が送信されると、指定したプロジェクトから Cloud 請求先アカウントが削除されます。この関数のテストを行うには、上記のテスト メッセージと一緒にサンプル メッセージをパブリッシュします。プロジェクトは Cloud 請求先アカウントに表示されなくなり、同じプロジェクト内にある Cloud Functions の関数を含めプロジェクト内のリソースは無効になります。
Google Cloud コンソールで、プロジェクトの Cloud Billing を手動で有効に戻すことができます。
使用を選択的に制御する
前の例で説明した Cloud Billing の上限設定(無効化)は、二分法的で極端なものです。プロジェクトは有効または無効のいずれかです。無効にすると、すべてのサービスが停止し、すべてのリソースは最終的に削除されます。
よりきめ細かなレスポンスが必要な場合は、リソースを選択的に制御できます。 たとえば、一部の Compute Engine リソースを停止し、Cloud Storage はそのままにする場合は、使用を選択的に制御できます。これにより、環境を完全に無効にすることなく、時間あたりのコストを削減できます。
きめ細かなポリシーを自由に記述できます。ただし、この例のプロジェクトでは、いくつかの Compute Engine 仮想マシンを使って研究を進め、結果を Cloud Storage に保存しています。この Cloud Function の例では、すべての Compute Engine インスタンスがシャットダウンされますが、予算を超えても保存された結果には影響しません。
Cloud Functions の関数を記述する
Cloud Function を作成するの手順で、新しい関数を作成します。使用する予算と同じ Pub/Sub トピックをトリガーに設定します。
課金に上限を設定(課金を無効化)して使用を停止するの依存関係が追加されていることを確認します。
以下のコードを Cloud Functions の関数にコピーします。
実行する関数を limitUse(Node)または limit_use(Python)に設定します。
ランタイムによっては、
GCP_PROJECT
環境変数が自動的に設定される場合があります。自動的に設定される環境変数のリストを確認し、仮想マシンを実行するプロジェクトにGCP_PROJECT
変数を手動で設定する必要があるかどうかを判断します。ZONE パラメータを設定します。これは、このサンプルでインスタンスが停止されるゾーンです。
Node.js
Python
サービス アカウント権限を構成する
- Cloud Function は自動的に作成されたサービス アカウントとして実行されます。使用を制御するには、変更が必要なプロジェクトのサービスにサービス アカウントの権限を付与する必要があります。
- 正しいサービス アカウントを特定するには、Cloud Function の詳細を表示します。サービス アカウントはページの下部に表示されます。
- Google Cloud コンソールで [IAM] ページに移動して、適切な権限を設定します。
[IAM] ページに移動
インスタンスが停止していることを検証する
予算が通知を送信すると、Compute Engine 仮想マシンは停止します。
この関数のテストを行うには、上記のテスト メッセージでサンプル メッセージをパブリッシュします。関数が正常に実行されたことを確認するには、Google Cloud コンソールで Compute Engine 仮想マシンを確認します。