×

Google Cloud 課金停止の自動化:予算超過で自動停止する設定方法

| 10 min read

📝 記事について: 筆者がGoogle Cloudの予算超過時に自動的に請求を停止する緊急手段を設定した実体験をまとめたものです。内容の正確性については、必ず公式情報やデータソースをご確認ください。

Google Cloudの予算超過時に自動的に請求を停止する設定方法を解説します。Pub/Sub、Cloud Run、予算アラートを連携させた5ステップの実装手順です。非常に強力で原始的な手段であり、予算超過後のアラート発火にはGoogle側の集計タイミング次第で数時間かかる場合があります。この点を必ず理解した上で導入してください。

💡 読み方について: この記事は設定手順やツールの説明が中心のため、内容が長くなっています。一息入れながら、ご自身のペースでお読みください。

Core Insights

  • 非常に強力で原始的な手段: プロジェクト全体の請求先を物理的に解除するため、請求先アカウントが必要な主要サービス(Cloud Run、Cloud Functions、Compute Engine、Cloud SQL、BigQueryなど)が即座に停止します。Always Free Tierの一部サービスは引き続き利用可能ですが、実用上はほぼすべてのサービスが利用できなくなります。
  • Pub/SubとCloud Runで自動停止: 予算アラートをPub/Sub経由でCloud Run関数に通知し、請求先を自動解除
  • 権限設定が重要: お支払い元管理者(Billing Account Administrator)とプロジェクトの請求費用管理者(Project Billing Manager)の両方の権限が必要。片方だけでは確実に動作しない場合がある
  • タイムラグに注意: 予算を超えてもすぐにアラートが出るわけではなく、Google側の集計タイミング次第で数時間(場合によっては6時間以上)かかることがあります。設定額より10〜20%低く設定することを強く推奨

Google Cloud 自動課金停止の5ステップ

📋 5ステップの全体フロー

1

Pub/Sub トピックの作成

予算アラートのメッセージを受け取るための「連絡路」を作成します。トピックID: stop-billing-topic

2

予算アラートの設定

予算額を設定し、超過時にPub/Subトピックに通知を送信するように設定します。検索バーで「予算とアラート」と入力してアクセスできます。

3

Cloud Run 関数の作成

Pub/SubをトリガーにしたPython関数を作成します。予算超過時に請求先アカウントを切り離す処理を実行します。ランタイム: Python 3.10+、トリガー: Pub/Subトピック

4

Cloud Billing API の有効化

関数から請求先アカウントを操作するために、Cloud Billing APIを有効化します。多くの場合は自動的に有効化されますが、確認が必要です。

5

権限(IAM)の設定 ⚠️ 最重要

Cloud Run関数のサービスアカウントに「お支払い元管理者」(Billing Account Administrator)と「プロジェクトの請求費用管理者」(Project Billing Manager)の両方の権限を付与します。両方の権限がないと確実に動作しません。

🔄 動作の流れ

予算超過 予算アラート発火 Pub/Subへ通知 Cloud Run関数実行 請求先アカウント解除

⚠️ 注意:予算を超えてもすぐにアラートが出るわけではなく、Google側の集計タイミング次第で数時間(場合によっては6時間以上)かかることがあります。

事前準備:プロジェクトIDの確認

まず、Google Cloud コンソールにアクセスして、現在のプロジェクトとプロジェクトIDを確認します。以下の画面が表示されます。

Google Cloud コンソール ウェルカムページ - プロジェクトIDと選択中のプロジェクトを確認
Google Cloud コンソールのウェルカムページ。重要なのは「選択中のプロジェクト」「プロジェクト ID」です。コード内で使用するプロジェクトIDはここで確認できます。

この画面で確認すべき重要なポイント:

  • 選択中のプロジェクト:現在作業しているプロジェクト名(例:Gemini API
  • プロジェクト ID:コード内で使用する一意の識別子(例:gen-lang-client-0302*******

プロジェクトIDは、後述するmain.pyのコード内で使用します。この値をメモしておいてください。

ステップ1:Pub/Sub トピックの作成

予算アラートのメッセージを受け取るための「連絡路」を作成します。

  1. Google Cloud コンソールで [Pub/Sub] > [トピック] を開きます。

    💡 検索バーの活用: 上部の検索バーに pub と入力すると、Pub/Subサービスへのリンクが表示されます。この検索バーはかなり強力で、サービス名や機能名を入力するだけで素早く目的のサービスにアクセスできます。

  2. [トピックを作成] をクリック。
  3. トピック ID に stop-billing-topic と入力。
  4. 「デフォルトのサブスクリプションを追加する」のチェックはついたままでOKです。[作成] をクリック。
Pub/Sub トピック作成画面 - stop-billing-topicの作成
Pub/Sub トピック作成画面。トピックIDに stop-billing-topic を入力し、「デフォルトのサブスクリプションを追加する」にチェックを入れた状態。この画面で[作成]ボタンをクリックすると、トピックが作成されます。

📚 関連記事:Pub/Subのトラブルシューティング

Pub/Subの無限ループ(再配信)対策や、メッセージのパージ方法などの詳細については、📖 Google Cloud 課金停止のトラブルシューティング記事をご覧ください。

⚠️ 重要: 提供しているコード(main.py)では、処理前に既に請求先アカウントが解除されているかチェックし、既に解除されている場合は処理をスキップして正常終了するように実装しています。これにより、Pub/Subの無限ループ(再配信)を防ぐことができます。

ステップ2:予算アラートの設定

「いくらになったら止めるか」のルールを決めます。

  1. [お支払い] > [予算とアラート] を開きます。

    💡 検索バーの活用: 上部の検索バーに 予算とアラート と入力すると、該当するサービスへのリンクが表示されます。メニューを探すより素早くアクセスできます。

  2. [予算を作成] をクリック。
  3. 金額:ターゲットとする予算額(例: 1,000円)を入力。
  4. アクション(通知の管理):ここが最も重要です。

    予算作成画面の「通知の管理」セクションでは、以下の設定を行います:

    • メール通知(デフォルトで有効): 「メール通知アラートを課金管理者とユーザーに送信する」はデフォルトでチェックが入っています。これはそのままで問題ありません。
    • Pub/Subトピックの接続(必須):
      • Pub/Sub トピックをこの予算に接続する」にチェックを入れます。
      • 「Cloud Pub/Sub トピックを選択してください」のドロップダウンメニューから、先ほどステップ1で作成した stop-billing-topic を選択します。
      • 選択すると、projects/gen-lang-client-0302*******/topics/stop-billing-topic のような形式で表示されます。

    これにより、予算アラートがPub/Subトピック経由でCloud Run関数に送信され、自動停止処理が実行されるようになります。

  5. [保存] をクリック。
予算とアラート検索結果画面 - 検索バーで予算とアラートを検索
検索バーに「予算とアラート」と入力すると、該当するサービスへのリンクが表示されます(検索バーが緑色のボックスでハイライトされています)。クリックすると予算とアラート画面が開き、既存の予算が一覧表示されます。画面右上の「+ 予算を作成」ボタンから新しい予算を作成できます。
通知の管理画面 - Pub/Subトピックの接続設定
通知の管理画面(予算の編集画面内)。重要な設定項目:
「Pub/Sub トピックをこの予算に接続する」にチェックを入れ(緑色のボックスでハイライト)、「Cloud Pub/Sub トピックを選択してください」のドロップダウンからステップ1で作成した stop-billing-topic を選択します。選択すると projects/gen-lang-client-0302*******/topics/stop-billing-topic のような形式で表示されます。デフォルトで「メール通知アラートを課金管理者とユーザーに送信する」もチェックされていますが、そのままで問題ありません。これにより、予算アラートがPub/Subトピック経由でCloud Run関数に送信され、自動停止処理が実行されるようになります。

📝 予算設定の注意点

画面下部の説明文に記載されている通り、費用は通常24時間以内に記録されます。費用を報告する時間を考慮して、予算を低めに設定することが推奨されています。これが、実際に止めたい金額より10〜20%低く設定する理由の一つです。

ステップ3:プログラムの作成(Cloud Run)

通知を受け取って実際に停止ボタンを押す役割のプログラムを作成します。注意:サービス名は「Cloud Functions」と表記されることがありますが、実際のサービスはCloud Runです。

🔄 動作の流れ

予算アラート → Pub/Sub通知 → Pub/Subがメッセージ送信 → Cloud Runの関数が実行 → 請求停止処理

つまり、予算アラートが発火すると、Pub/Subトピックに通知が送信され、その通知を受けてCloud Runの関数が自動的に実行され、請求停止処理が行われます。

  1. [Cloud Run]を開きます。

    💡 検索バーの活用: 上部の検索バーに cloud functions または cloud run と入力すると、サービスへのリンクが表示されます。

  2. [関数を作成] ボタンをクリックします。
  3. 構成
    • サービスの名前stop-billing-function と入力
    • ランタイムPython 3.14 を選択します(Python 3.10以降であれば問題ありません)
    • リージョン:お好みのリージョンを選択(例:asia-northeast1 (東京)
  4. トリガーの設定(最重要)
    • [+ トリガーを追加] をクリックします
    • Pub/Sub トリガー を選択します
    • トリガーの設定
      • イベント プロバイダCloud Pub/Sub を選択
      • イベントタイプgoogle.cloud.pubsub.topic.v1.messagePublished が自動的に選択されます
      • Cloud Pub/Sub トピック:先ほどステップ1で作成した stop-billing-topic を選択します
      • リージョン:サービスのリージョンと合わせます(例:asia-northeast1 (東京)

    ⚠️ 重要:このトリガー設定により、Pub/Subトピックにメッセージが送信されると、自動的にこのCloud Run関数が実行されるようになります。

  5. エントリポイント:コードエディタまたは後述するコードを入力する際に、stop_billing と設定します。
  6. [作成] をクリックして関数をデプロイします。
Cloud Run 概要画面 - 関数の作成ボタン
Cloud Run 概要画面。検索バーに「cloud functions」と入力してアクセスできます。「関数を作成」ボタンから新しい関数を作成します。既存の関数がある場合は一覧に表示されます。
Cloud Run 関数作成画面 - トリガーの設定
関数作成画面。ランタイムでPython 3.14を選択し、トリガーセクションで「+ トリガーを追加」からPub/Subトリガーを選択します。Pub/Subトピックに stop-billing-topic を指定することで、予算アラートがPub/Sub経由でこの関数を実行するようになります。

main.py のコード

⚠️ 重要: 以下のコード内の project_id = "gen-lang-client-0302946227" の部分を、ご自身のプロジェクトIDに書き換えてご利用ください。プロジェクトIDは、Google Cloud コンソールのウェルカムページで確認できます。


    import base64
    import json
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    import functions_framework
    
    # 効率化:APIクライアントを関数の外で初期化(再利用されるため高速になります)
    billing_client = discovery.build('cloudbilling', 'v1', cache_discovery=False)
    
    @functions_framework.cloud_event
    def stop_billing(cloud_event):
        # 1. Pub/Sub メッセージの解析
        try:
            if 'message' in cloud_event.data and 'data' in cloud_event.data['message']:
                pubsub_data = base64.b64decode(cloud_event.data['message']['data']).decode('utf-8')
                data = json.loads(pubsub_data)
            else:
                print("データが見つかりません(想定外のイベント形式です)")
                return
        except Exception as e:
            print(f"データの解析中にエラーが発生しました: {e}")
            return
    
        # 2. 予算情報の取得
        cost_amount = data.get('costAmount')
        budget_amount = data.get('budgetAmount')
        
        # プロジェクトIDを直接指定(確実性を優先)
        # ⚠️ 重要:以下のプロジェクトIDを、ご自身のプロジェクトIDに書き換えてください
        project_id = "gen-lang-client-0302946227"  # ← ここを自分のプロジェクトIDに書き換える
    
        print(f"【状況確認】現在のコスト: {cost_amount}, 予算額: {budget_amount} (プロジェクト: {project_id})")
    
        # 3. 判定と実行
        if cost_amount and budget_amount and cost_amount >= budget_amount:
            print(f"コストが予算を超過しました。停止処理を開始します...")
            disable_billing(project_id, cost_amount)
        else:
            print("予算内です。処理を終了します。")
    
    def disable_billing(project_id, current_cost):
        name = f'projects/{project_id}'
        
        try:
            # ① 現在の請求状態を確認(冪等性の確保)
            billing_info = billing_client.projects().getBillingInfo(name=name).execute()
            
            # すでに紐付けがない、または有効でない場合は何もしない
            if not billing_info.get('billingEnabled') or not billing_info.get('billingAccountName'):
                print(f"完了:プロジェクト {project_id} は既に停止されています。追加の操作は不要です。")
                return
    
            # ② 請求先アカウントの解除を実行
            print(f"実行:請求先アカウントの紐付けを解除しています...")
            billing_client.projects().updateBillingInfo(
                name=name,
                body={'billingAccountName': ''} # 空文字で解除
            ).execute()
            print(f"成功:予算 {current_cost}円 にて請求を無効化しました。")
    
        except HttpError as e:
            # すでに権限がない、あるいは停止済みの場合に出る特定エラーを許容する
            error_detail = e.content.decode('utf-8')
            if any(keyword in error_detail for keyword in ['billingEnabled', 'disabled', 'permission']):
                print(f"確認:請求は既に解除されているか、権限により操作できませんでした(正常な停止状態とみなします)。")
            else:
                print(f"APIエラーが発生しました: {e}")
        except Exception as e:
            # 想定外のエラーもログに残すが、関数自体は正常終了させてACKを返す(無限ループ防止)
            print(f"予期せぬエラーが発生しました: {e}")


✅ 改善版コードのポイント

1. 冪等性の確保(重複メッセージ対策):

  • 処理前に既に請求先アカウントが解除されているかチェックします。
  • 既に解除されている場合は、処理をスキップして正常終了します。
  • これにより、同じメッセージが複数回配信されても、安全に処理できます。

2. エラーハンドリングの改善:

  • エラーが発生した場合でも、関数は正常終了させるようにしています。
  • これにより、Cloud Run関数が適切にACKを送信し、再配信を防ぎます。
  • ただし、実際のエラーはログに記録されるため、問題の追跡が可能です。

3. ACKの自動送信: Cloud Run関数でPub/Subトリガーを使用する場合、関数が正常に完了すると自動的にACKが送信されます。エラーが発生しても、例外をキャッチして正常終了させれば、ACKが送信され、再配信を防ぐことができます。

requirements.txt の内容

functions-framework==3.*
google-api-python-client

ステップ4:APIの有効化

Cloud Billing API を有効化します。これがないと、プログラムが請求システムにアクセスできません。

👉 Cloud Billing API を有効にする

自動的に有効化されるサービス

予算超過停止処理を設定する過程で、以下のような複数のサービスが自動的に有効化されます。自動処理を進めていくと、ほぼ半自動でこれらのサービスがONになるか、またはダイアログで「有効化してください」と丁寧に知らせてくれます。

予算超過停止処理のために有効化されたサービス一覧
予算超過停止処理のために有効化されたサービス一覧。Cloud Billing API、Cloud Pub/Sub API、Cloud Run Admin API、Cloud Logging APIなどが自動的に有効化されます。

主に有効化されるサービス:

  • Cloud Billing API:請求管理に必要
  • Cloud Pub/Sub API:予算アラートの通知に必要
  • Cloud Run Admin API:Cloud Run関数の実行に必要
  • Cloud Logging API:ログの記録に必要
  • Cloud Build API:関数のデプロイに必要
  • Eventarc API:イベントトリガーに必要
  • Identity and Access Management (IAM) API:権限管理に必要

💡 自動有効化について

これらのサービスは、設定手順を進めていく過程で自動的に有効化されるか、または必要なタイミングで「このAPIを有効化してください」というダイアログが表示されます。手動で一つずつ有効化する必要は基本的にありません。Google Cloudが適切なタイミングで案内してくれます。

ステップ5:権限(IAM)の設定(※最重要)

🔴 最重要:なぜ権限が必要なのか

この関数は、請求先アカウントとプロジェクトを切り離すという非常に強力な処理を実行します。

請求先アカウントを切り離すと、有料サービスのほとんどが即座に停止します。具体的には、Cloud Run、Cloud Functions、Compute Engine、Cloud SQL、BigQuery、Cloud Storage(有料枠)、Vertex AI、APIサービスなど、請求先アカウントが必要なサービスは全て利用できなくなります。

このような強力な処理を実行するには、関数に「お支払い元管理者」(Billing Account Administrator)「プロジェクトの請求費用管理者」(Project Billing Manager)両方の権限が必要です。権限がないと、関数は実行時に403 ForbiddenPermission Deniedエラーで失敗し、自動停止処理が作動しません。

📚 関連記事:権限設定の詳細解説

2つの権限が必要な理由、各権限の設定手順、よくある設定ミスと解決策などの詳細については、📖 Google Cloud 課金停止の権限設定完全ガイド記事をご覧ください。

⚠️ 重要: Cloud Run関数のサービスアカウントに「お支払い元管理者」(Billing Account Administrator)と「プロジェクトの請求費用管理者」(Project Billing Manager)の両方の権限を付与する必要があります。片方だけでは確実に動作しません。

動作確認(テスト送信)

関数が正しく動作するか、テストで確認しましょう。Cloud Run関数のテスト方法は2つあります:コンソールでのテストCloud Shellでのcurlコマンドです。

方法1:Cloud Runコンソールでのテスト

  1. Cloud Run の画面で、今回作った関数 stop-billing-function を開きます。
  2. 上部のタブから 「テスト」(Test)ボタンをクリックします。
  3. 「オブザーバビリティ」タブを選択し、「ログ」(Logs)を開きます(テスト実行後のログを確認するため)。
  4. 再度「テスト」タブに戻り、「イベント JSON」の入力欄に、以下のテスト用データを貼り付けます。
  5. 「テストを実行」(または「送信」)ボタンをクリックします。

正しいテスト用 JSON データ

Cloud Run functions の「テスト中」タブで、以下の JSON をそのまま貼り付けて実行してください。

{
  "message": {
    "data": "eyJjb3N0QW1vdW50IjogMTAwLCAiYnVkZ2V0QW1vdW50IjogNTB9"
  }
}

data の中身は「コスト100、予算50」という情報をBase64エンコードしたものです。
※ デコードすると {"costAmount": 100, "budgetAmount": 50} になります。

Cloud Run 関数のテスト実行結果とログ - 成功時の表示
Cloud Run 関数のテスト実行後のログ画面。「オブザーバビリティ」タブ > 「ログ」を選択すると、実行結果が表示されます。成功した場合、以下のようなログが表示されます:
  • 【状況確認】現在のコスト: 100, 予算額: 50
  • コストが予算を超過しました。停止処理を開始します...
  • 実行:請求先アカウントの紐付けを解除しています...
  • 成功:予算 100円にて請求を無効化しました。
右上の「テスト」ボタン(再生アイコン付き)から、関数を直接テストできます。

方法2:Cloud Shellでのcurlコマンドでのテスト

Cloud Shellを使用して、curlコマンドで関数をテストすることもできます。

  1. Google Cloud コンソールの上部にある「Cloud Shellを開く」アイコンをクリックします。
  2. Cloud Shellが開いたら、以下のcurlコマンドを実行します。

curlコマンド(Cloud Shell用)

curl -X POST "https://stop-billing-function-umawpkkl2q-an.a.run.app" \
  -H "Authorization: bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -H "ce-id: 1234567890" \
  -H "ce-specversion: 1.0" \
  -H "ce-type: google.cloud.pubsub.topic.v1.messagePublished" \
  -H "ce-time: 2020-08-08T00:11:44" \
  -H "ce-source: //pubsub.googleapis.com/projects/gen-lang-client-0302*******/topics/stop-billing-topic" \
  -d '{
    "message": {
      "data": "eyJjb3N0QW1vdW50IjogMTAwLCAiYnVkZ2V0QW1vdW50IjogNTB9"
    }
  }'

💡 注意:

  • URL部分(https://stop-billing-function-umawpkkl2q-an.a.run.app)は、Cloud Run関数の実際のURLに置き換えてください。URLは関数の詳細画面で確認できます。
  • ce-source ヘッダー内のプロジェクトID(gen-lang-client-0302*******)とトピック名(stop-billing-topic)も、実際の値に置き換えてください。
  • コマンドを実行後、Enterキーを押すとテストが実行されます。
Cloud Shellでのcurlコマンド実行画面
Cloud Shellでのcurlコマンド実行画面。「CLOUD SHELL」ターミナルを開き、上記のcurlコマンドを入力してEnterキーを押すと、関数がテスト実行されます。コマンド内のURL、プロジェクトID、トピック名は、実際の値に置き換えてください。実行後、レスポンスが表示され、ログを確認することでテスト結果を確認できます。

成功した場合の表示

どちらの方法でも、「出力」または「ログ」に以下のようなメッセージが出れば成功です。

  • 【状況確認】現在のコスト: 100, 予算額: 50 (プロジェクト: gen-lang-client-0302*******)
  • コストが予算を超過しました。停止処理を開始します...
  • 実行:請求先アカウントの紐付けを解除しています...
  • 成功:予算 100円にて請求を無効化しました。

⚠️ 注意:実際に課金が止まります

このテストを実行すると、実際にプロジェクトの課金が止まります。テスト環境や本番環境に関係なく、請求先が解除されるため、請求先アカウントが必要な主要サービス(Cloud Run、Cloud Functions、Compute Engine、Cloud SQL、BigQueryなど)が停止します。Always Free Tierの一部サービスは引き続き利用可能ですが、実用上よく使うサービスは請求先アカウントが必要なため、ほぼすべてのサービスが利用できなくなります。

課金が止まった後の「復活」のさせ方(超重要)

課金が止まると、この Cloud Run 関数も含めて、請求先アカウントが必要な主要サービス(Cloud Run、Cloud Functions、Compute Engine、Cloud SQL、BigQueryなど)が動かなくなります。Always Free Tierの一部サービスは引き続き利用可能ですが、実用上よく使うサービスは請求先アカウントが必要なため、ほぼすべてのサービスが利用できなくなります。元に戻したくなった時のために、以下の手順をメモしておいてください。

  1. Google Cloud コンソールの [お支払い] > [アカウント管理] を開きます。
  2. 「請求先アカウントのないプロジェクト」にあなたのプロジェクト(gen-lang-client-0302******* など)があるはずです。
  3. 右側の [︙](三点リーダー)をクリックし、[請求を変更] を選択します。
  4. 自分の請求先アカウントを選び直して [アカウントを設定] をクリックします。
  5. これで復活します。各サービスは自動では再起動しないため、必要に応じて手動で再起動してください。

注意すべき副作用

⚠️ 重要:これは非常に強力で原始的な手段です

この方法は、プロジェクトの請求先アカウントを物理的に解除するという非常に強力で原始的な手段です。設定した予算額に達した時点で、請求先アカウントが必要な主要サービスが即座に停止します。ただし、予算を超えてもすぐにアラートが出るわけではなく、Google側の集計タイミング次第で、数時間(場合によっては6時間以上)かかることがあります。そのため、実際の課金額が設定額を超えてから停止することもあります。以下のリスクを必ず理解した上で導入してください。

停止するサービスと利用可能なサービス: 請求先アカウントを切り離すと、Cloud Run、Cloud Functions、Compute Engine、Cloud SQL、BigQuery、Vertex AIなどの主要サービスは停止します。Always Free Tierの一部サービス(Cloud Storageの月5GBなど)は引き続き利用可能ですが、実用上よく使うサービスは請求先アカウントが必要なため、ほぼすべてのサービスが利用できなくなります。詳細は以下の表を参照してください。

この仕組みを導入する前に、以下のリスクを必ず理解しておいてください。

リスク項目 内容
主要サービスの停止

請求先アカウントが必要なサービスは全て停止します:

  • コンピューティングサービス: Cloud Run、Cloud Functions、Compute Engine(GCE)、App Engine、GKE(Google Kubernetes Engine)
  • データベース: Cloud SQL、Cloud Spanner、Firestore(有料枠)、Bigtable、Memorystore
  • ストレージ: Cloud Storage(有料枠を超過した場合)、Persistent Disk
  • AI/機械学習: Vertex AI、AutoML、Translation API、Vision API、Speech-to-Text API などの有料API
  • ネットワーク: Cloud Load Balancing、Cloud CDN、VPCネットワーク(有料機能)
  • その他: BigQuery(有料枠)、Cloud Pub/Sub(有料枠)、Cloud Monitoring(有料機能)、Cloud Logging(有料枠)

注意: これらのサービスが停止すると、Webサイトやアプリケーションがアクセス不可になり、データベースへの接続もできなくなります。

無料枠(Always Free Tier)サービスの扱い

請求先アカウントを切り離しても、Always Free Tierの範囲内で利用可能なサービスは引き続き利用できます。ただし、これは非常に限定的です:

  • Cloud Storage: 月5GBのストレージ、月5,000回のクラスA操作、月50,000回のクラスB操作(米国、東京、大阪リージョンのStandardストレージクラスのみ)
  • Firebase: 一部のFirebaseサービス(Firebase Authentication、Firebase Hostingなど)の無料枠
  • Cloud Functions: 第1世代のみ、月200万回の無料呼び出し(ただし請求先アカウントが必要な場合あり)
  • Cloud Build: 1日120分の無料ビルド時間(請求先アカウントが必要)

重要: Cloud Run、Cloud Functions(第2世代)、Compute Engine、Cloud SQL、BigQueryなど、実用上よく使う主要サービスは、無料枠であっても請求先アカウントの設定が必須です。そのため、請求先アカウントを切り離すと、これらのサービスは利用できなくなります。

データ消失のリスク 書き込み中に強制停止されるため、まれにデータベースのデータが破損する可能性があります。また、請求先アカウントを切り離すと、停止したサービスに保存されているデータへのアクセスができなくなります(データ自体は削除されませんが、請求先アカウントを再設定するまでアクセスできません)。
復旧が手動 翌月になっても自動では再開しません。手動で請求先を再設定し、各サービスを再起動する必要があります。
タイムラグ(重要) 予算を超えてもすぐにアラートが出るわけではなく、Google側の集計タイミング次第で、数時間(場合によっては6時間以上)かかることがあります。課金データはリアルタイムで反映されるわけではなく、Google側のバッチ処理によって定期的に集計されるため、そのタイミングまで予算アラートは発火しません。そのため、1,000円設定でも実際には1,100円〜1,200円程度課金されてから止まることがあります。予算設定は、実際に止めたい金額より10〜20%低く設定することを強く推奨します。

エントリポイントについて

エントリポイントとは、「プログラムが実行されるときに、一番最初に呼び出される関数名」のことです。コード例では、Pub/Subからの通知を受け取り、中身を解析するメインの関数を def stop_billing(cloud_event): と定義したため、エントリポイントもこれに合わせる必要があります。

Cloud Run の関数作成画面で、エントリポイント: stop_billing と入力してください。ここがデフォルト(例: hello_pubsub など)のままだと、関数を実行しようとした際に「その名前の関数が見つかりません」というエラーになり、自動停止が作動しません。

まとめ

この仕組みの概要

予算超過時に自動的に請求を停止する仕組みは、Pub/Sub、Cloud Run、予算アラートを連携させることで実現できます。これは非常に強力で原始的な手段であり、プロジェクト全体の請求先を物理的に解除します。

重要な注意点

  • タイムラグ: 予算を超えてもすぐにアラートが出るわけではなく、Google側の集計タイミング次第で数時間(場合によっては6時間以上)かかります。実際に止めたい金額より10〜20%低く設定することを強く推奨します。
  • 権限設定: 「お支払い元管理者」(Billing Account Administrator)と「プロジェクトの請求費用管理者」(Project Billing Manager)の両方の権限が必要です。片方だけでは確実に動作しません。詳細は📖 Google Cloud 課金停止の権限設定完全ガイドをご覧ください。
  • Pub/Subの無限ループ対策: Pub/Subは、関数がエラーで終了すると、メッセージを再送し続けます。改善版コードでは、処理前に既に請求先アカウントが解除されているかチェックし、既に解除されている場合は処理をスキップして正常終了するように実装しています。詳細は📖 Google Cloud 課金停止のトラブルシューティングをご覧ください。
  • サービスの停止: 請求先アカウントが必要な主要サービス(Cloud Run、Cloud Functions、Compute Engine、Cloud SQL、BigQueryなど)が即座に停止します。Always Free Tierの一部サービスは利用可能ですが、実用上はほぼすべてのサービスが利用できなくなります。
  • 導入前の確認: 必ずリスクを理解し、テスト環境で動作確認を行った上で、本番環境に適用してください。

📚 関連記事

本記事では基本的な設定手順を解説しましたが、より詳細な情報については以下の記事もご覧ください:

⚠️ 重要: これらの記事を読むことで、より安全で確実な設定が可能になります。特に、Pub/Subの無限ループ対策と権限設定については、必ず確認することをお勧めします。

Artist's Perspective

「サブスクや従量課金という仕組みには、昭和世代である私には抵抗があります。使った分だけ課金される従量課金は、特に予算管理が難しく、常に不安がつきまといます。

そんな中、初めてGoogle Cloud Platformを触ったのが、まさにこの予算超過停止処理の作成でした。使える金額が限られているからこそ、少ない予算に到達する前に強制的に料金が増えないようにする緊急手段が必要だったのです。

試作や実験でクラウドサービスを使う際、予想外の課金に怯える日々から、この自動停止機能によってようやく解放されました。本番環境では慎重に運用する必要がありますが、個人開発者として、これほど心強い機能はありません。」

データソース・参考リンク

本記事は以下の情報源を参考にしています。内容の正確性については、必ず元のデータソースをご確認ください。