Google Cloud 課金停止の権限設定完全ガイド:2つの権限が必要な理由と設定手順

| 5 min read

📝 記事について: 本記事は、50近辺のくたびれた貧乏なおっさんの筆者が、「新しい技術」「このサービスおもしろいな~~」「このアプリおもしろいな~~」「ほしいな~~」「かいたいな~~」と思った製品・サービスについて、公開情報を調べてまとめたものです。実際に製品やサービスを使用・体験したわけではありません。内容の正確性については、必ず公式情報やデータソースをご確認ください。

Google Cloud課金停止の自動化に必要な2つの権限(請求先アカウント管理者・プロジェクトの請求費用管理者)の設定手順と、なぜ両方が必要なのかを詳しく解説します。

Core Insights

  • 2つの権限が必要: Google Cloudでは、プロジェクトと請求先アカウントの紐付け解除には、「お支払い元管理者」(Billing Account Administrator)と「プロジェクトの請求費用管理者」(Project Billing Manager)の両方の権限が必要です。
  • なぜ両方が必要なのか: Google Cloudは、セキュリティを強化するため、紐付け解除処理を複数段階で検証しています。最初の段階では請求先アカウント側の権限のみをチェックする場合がありますが、その後の検証段階や再実行時には、プロジェクト側の権限も厳密にチェックするため、両方の権限が必要になります。
  • 片方だけでは失敗する:「請求先アカウント管理者」のみでも一時的に成功することがありますが、その後の自動処理(Pub/Subからの再送信やリトライ)でエラーになるため、最初から両方の権限を設定することが推奨されます。

本記事は、Google Cloud 課金停止の自動化:予算超過で自動停止する設定方法で解説した設定手順のうち、特に権限設定(IAM)の詳細をまとめたものです。

なぜ権限が必要なのか

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

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

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

無料枠(Always Free Tier)について: Google CloudにはAlways Free Tierという無料枠があり、請求先アカウントなしでも利用できるサービスが一部存在します。しかし、これらは非常に限定的で(例:Cloud Storageの月5GB、Firebaseの一部など)、実用上はほぼすべてのサービスが利用できなくなります。また、Cloud Run、Cloud Functions、Compute Engineなどの主要サービスは、無料枠であっても請求先アカウントの設定が必須です。

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

2つの権限が必要な理由

🔑 重要:2つの権限が必要な理由

Google Cloudでは、プロジェクトと請求先アカウントの紐付け解除には、2つの権限が両方必要です。

  • 請求先アカウント側の権限:「お支払い元管理者」(Billing Account Administrator)
    → 「お財布(請求先アカウント)を開ける権限」
  • プロジェクト側の権限:「プロジェクトの請求費用管理者」(Project Billing Manager)
    → 「プロジェクトとお財布の間の鎖を切り離す権限」(resourcemanager.projects.deleteBillingAssignment

なぜ両方必要なのか? Google Cloudでは、他人のプロジェクトに勝手に自分の請求先を紐付けられたり、逆に勝手に外されたりしないよう、「お財布側の許可」と「プロジェクト側の許可」が両方そろわないと紐付け解除ができないセキュリティルールになっています。

🔍 重要な発見:なぜ「請求先アカウント管理者」のみでも一時的に成功するのか?

実際の運用では、「請求先アカウント管理者」の権限のみでも、紐付け解除自体は成功することがあります。しかし、その後の自動処理で問題が発生します。

発生する問題の流れ:

  1. 最初の紐付け解除は成功:「請求先アカウント管理者」のみでも、API呼び出し自体は成功し、紐付け解除が実行されます。ログには 請求の無効化に成功しました と表示されます。
  2. Cloud Run関数は動作し続ける: 請求先アカウントが解除されても、Cloud Run関数自体は即座には停止しません。通常、しばらくの間は動作し続けます。そのため、Pub/Subからのメッセージが複数回配信されたり、同じメッセージが再処理されたりすることがあります。
  3. 2回目の実行でエラー発生: 同じ関数が再度実行されると(Pub/Subからの再送信やリトライにより)、この時点でGoogle Cloudがプロジェクト側の権限も厳密にチェックします。既に請求先アカウントが解除されている状態で再度解除を試みるか、または検証段階でプロジェクト側の権限が求められ、User does not have permission on project to disable billingresourcemanager.projects.deleteBillingAssignment というエラー(403 Forbidden)が発生します。

📋 実際のログ例(「請求先アカウント管理者」のみの場合):

13:55:11 - 請求の無効化に成功しました: {'billingEnabled': False}
13:55:15 - 予算超過のため、請求を無効化します...(再実行)
13:55:16 - エラーが発生しました: HttpError 403 
      "User does not have permission on project to disable billing"
      permission: 'resourcemanager.projects.deleteBillingAssignment'
13:55:28 - 予算超過のため、請求を無効化します...(3回目の実行)

このログから分かること:最初の実行(13:55:11)では成功しましたが、2回目の実行(13:55:15)、3回目の実行(13:55:28)でエラーが発生しています。

💡 重要なポイント:なぜ複数回実行されるのか?

予算アラート自体は複数回発火していません。 Google Cloudの予算アラートは、予算のしきい値を超えた時点で一度だけ通知を送信するのが一般的です。

問題はPub/Subのメッセージ配信特性にあります:

  • Pub/Subは「at-least-once」(少なくとも1回)配信モデルを採用しており、同じメッセージが複数回配信される可能性があります。
  • メッセージの確認応答(ACK)が適切に行われなかった場合、一定時間後に自動的に再配信されます。
  • Cloud Run関数がメッセージ処理後にエラーが発生したり、ACKがタイムアウトしたりすると、Pub/Subはメッセージが処理されなかったと判断し、再配信します。
  • 最初の実行で紐付け解除は成功しましたが、その後の処理で何らかの理由でACKが適切に行われなかった可能性があります。

結論: 予算アラートが複数回発火しているのではなく、Pub/Subからの同じメッセージが複数回配信されていることが原因です。そのため、2回目・3回目の実行時に、既に請求先アカウントが解除されている状態で再度解除を試みるか、または権限チェックが厳密になり、エラーが発生しています。ACK応答の詳細については、📖 トラブルシューティング記事をご覧ください。

🔧 メッセージ確認応答(ACK)を適切に行う方法

Cloud Run関数でPub/Subトリガーを使用する場合、関数が正常に完了すると自動的にACKが送信されます。ただし、以下の点に注意が必要です:

  1. 関数は必ず正常終了させる: エラーが発生した場合でも、例外をキャッチして関数を正常終了させると、ACKが送信され、再配信を防げます。
  2. 冪等性の確保(重複処理対策): 同じメッセージが複数回配信されても安全に処理できるように、処理前に状態をチェックします。改善版コードでは、請求先アカウントが既に解除されているかチェックしています。
  3. 処理時間を短縮する: Pub/Subの確認応答期限(デフォルト10秒)内に処理を完了させることが推奨されます。
  4. エラーはログに記録する: エラーが発生しても関数を正常終了させることでACKを送信しつつ、エラー内容はログに記録して問題を追跡できるようにします。

ACK応答の詳細については、📖 トラブルシューティング記事をご覧ください。

なぜこのような2段階のチェックがあるのか? Google Cloudは、セキュリティを強化するため、紐付け解除処理を複数段階で検証しています。最初の段階では請求先アカウント側の権限のみをチェックする場合がありますが、その後の検証段階や再実行時には、プロジェクト側の権限も厳密にチェックするため、両方の権限が必要になります。また、Pub/Subからのメッセージが複数回配信されたり、リトライが発生したりすることもあるため、確実に動作させるには両方の権限が必要です。

⚠️ 結論:「請求先アカウント管理者」のみでも一時的に成功することがありますが、その後の自動処理でエラーになるため、最初から両方の権限を設定することが推奨されます。特に、請求先アカウントを手動で紐付け直した後は、Google Cloud側が厳密にチェックするようになり、プロジェクト側の権限がないと確実にエラーで失敗します。

権限設定手順

以下の手順で、Cloud Run関数のサービスアカウントに両方の権限を付与します。

ステップ1:サービスアカウントの確認

  1. Cloud Run の画面で、作成した関数 stop-billing-function を開きます。
  2. 「セキュリティ」タブまたは「設定」タブから、サービスアカウントのメールアドレスを確認します。
  3. 例:stop-billing-function@プロジェクトID.iam.gserviceaccount.com
  4. このメールアドレスをコピーしておきます。
Cloud Run サービス一覧画面 - stop-billing-function の確認
Cloud Run のサービス一覧画面。作成した関数 stop-billing-function をクリックして開きます。
Cloud Run 関数のサービスアカウント情報 - セキュリティタブ
関数の詳細画面で「リビジョン」タブを選択し、リビジョンを選択した後、「セキュリティ」タブを開きます。「サービス アカウント」の欄に表示されているメールアドレス(例:999880815400-compute@developer.gserviceaccount.com)をコピーします。

ステップ2:請求先アカウント側の権限設定

  1. [お支払い] > [アカウント管理] を開きます。
  2. 画面右側の [権限] パネルで、[プリンシパルを追加] をクリックします。
  3. 新しいプリンシパル:コピーしておいた Cloud Run 関数のサービスアカウントのメールアドレスを貼り付けます。
  4. ロールを選択
    • [お支払い] カテゴリを選択します。
    • 表示されるロール一覧から、[お支払い元管理者]Billing Account Administrator)を選択します。
    • ⚠️ 注意:「お支払い元閲覧者」「お支払い元ユーザー」「お支払い元コスト マネージャー」などと間違えないよう注意してください。これらでは請求先の切り離しはできません。
  5. [保存] をクリックします。
請求先アカウントの権限設定画面 - プリンシパルの追加とロールの選択
請求先アカウントの権限設定画面。「新しいプリンシパル」にサービスアカウントのメールアドレスを入力し、「ロールを選択」で「お支払い」カテゴリから「請求先アカウント管理者」(Billing Account Administrator)を選択します。この権限により、関数は請求先アカウント側の操作を実行できるようになります。

💡 補足:請求先アカウント側で両方の権限を設定することも可能

請求先アカウント側の権限設定画面では、「請求先アカウント管理者」だけでなく、「プロジェクトの請求費用管理者」も同時に設定できます。「+ 別のロールを追加」をクリックして、追加のロールとして「プロジェクトの請求費用管理者」(Project Billing Manager)を選択し、一度に両方の権限を設定することも可能です。以下の画像は、両方の権限が設定された状態です。

⚠️ 注意: 通常は請求先アカウント側で「請求先アカウント管理者」を設定し、プロジェクト側のIAMで「プロジェクトの請求費用管理者」を設定する方法が一般的です。ただし、請求先アカウント側で両方の権限を一度に設定することも可能です。

請求先アカウントの権限設定画面 - 2つの権限が設定された状態
請求先アカウントの権限設定画面で、サービスアカウント(999880815400-compute@developer.gserviceaccount.com)に2つの権限が設定されている状態です。
1. 請求先アカウント管理者(Billing Account Administrator):請求先アカウントを全面的に表示および管理できる権限
2. プロジェクトの請求費用管理者(Project Billing Manager):ユーザーが費用にアクセスできるプロジェクトに限定された請求情報を操作できる権限
右側の「Summary of changes」パネルに「プロジェクトの請求費用管理者」が追加されたことが表示されています。

ステップ3:プロジェクト側の権限設定(必須)

次に、プロジェクト側の権限を設定します。これがないと、請求先アカウントを紐付け直した後などにエラーで失敗する可能性があります。

  1. [IAM と管理] > [IAM] を開きます。
  2. リストから stop-billing-function@... のサービスアカウントを探します。
  3. 右側の鉛筆アイコン(編集)をクリックします。
  4. [別のロールを追加] をクリックします。
  5. ロールを選択
    • 検索バーに 請求 または billing と入力します。
    • 表示されるロール一覧から、「プロジェクトの請求費用管理者」(英語名: Project Billing Manager)を選択します。
    • ⚠️ 注意:「プロジェクトの請求費用閲覧者」(Project Billing Viewer)などと間違えないよう注意してください。これでは請求先の切り離しはできません。
  6. [保存] をクリックします。

✅ 完成:2つの権限が設定されました

これで、Cloud Run関数のサービスアカウントに以下の2つの権限が付与されました:

  • 請求先アカウント管理者(Billing Account Administrator)
  • プロジェクトの請求費用管理者(Project Billing Manager)

この状態が、最も安全で確実な「完成形」です。今後、どんなタイミングでも失敗することなく、確実に課金を止めてくれるようになります。「請求先アカウント管理者」のみでも一時的に成功することがありますが、その後の自動処理でエラーになるため、最初から両方の権限を設定することが推奨されます

⚠️ 注意:非常に強力な権限

この権限は非常に強力なので、この関数専用のサービスアカウントであることを必ず確認してください。誤って他のサービスアカウントに付与すると、セキュリティリスクになります。

「お支払い元閲覧者」(Billing Account Viewer)や「お支払い元ユーザー」(Billing Account User)などと間違えないよう注意してください。これらでは請求先の切り離し処理は実行できません。

💡 権限設定後の確認

権限設定後、Cloud Run関数のログを確認してください。テスト実行時に403 ForbiddenPermission Deniedエラーが出ていなければ、権限設定は成功しています。テスト方法については、📖 メイン記事の「動作確認(テスト送信)」セクションをご覧ください。

請求先アカウントの権限設定画面 - 2つの権限が設定された状態
請求先アカウントの権限設定画面で、サービスアカウント(999880815400-compute@developer.gserviceaccount.com)に2つの権限が設定されている状態です。
1. 請求先アカウント管理者(Billing Account Administrator):請求先アカウントを全面的に表示および管理できる権限
2. プロジェクトの請求費用管理者(Project Billing Manager):ユーザーが費用にアクセスできるプロジェクトに限定された請求情報を操作できる権限
右側の「Summary of changes」パネルに「プロジェクトの請求費用管理者」が追加されたことが表示されています。請求先アカウント側で両方の権限を一度に設定することも可能です。

📚 関連記事

📖 Google Cloud 課金停止の自動化:予算超過で自動停止する設定方法では、5ステップの基本手順を解説しています。
📖 Google Cloud 課金停止のトラブルシューティングでは、Pub/Subの無限ループ対策を詳しく解説しています。

Artist's Perspective

「Google Cloudの権限設定は、最初は複雑に感じるかもしれません。特に「請求先アカウント管理者」と「プロジェクトの請求費用管理者」の2つの権限が必要だということは、最初は気づきにくいポイントです。

筆者が実際に遭遇したのは、最初の実行では成功したものの、その後のログを確認するとエラーが繰り返し発生していたという状況でした。これは、片方の権限しか設定していなかったことが原因でした。

この問題を解決するために、両方の権限を設定し、さらに権限設定後の確認を徹底するようにしました。これにより、どんなタイミングでも確実に課金を止めてくれるようになりました。権限設定は、セキュリティの観点からも非常に重要で、適切に設定することで、より安全に運用できるようになります。」

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

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