はじめに
昨今のAIブームに伴い、当社ではGoogle CloudのAI関連サービスを新たに利用することになりました。これらのサービスは従来のインフラサービスと比べてコストが高くなりやすく、特にVertex AIのモデル学習や推論処理では、想定以上のコストが発生するリスクがあります。そのリスクを軽減するために、社内チャットサーバーを用いた料金通知システムを試験的に考案し、検証を行うことにしました。
料金通知システムに求められる要件は以下の通りです。
- 外部アクセス対応: Google Cloud(社外)からAWSで稼働している社内チャットサーバーへ通知
- セキュリティ確保: 認証機能付きのAPI連携でデータ送信
- 定期実行: 定期的な自動実行による運用負荷軽減
- コスト最適化: サーバーレスアーキテクチャによる運用コスト削減
本記事では、Google CloudとAWSを組み合わせたマルチクラウドアーキテクチャで、これらの課題を解決する方法を紹介します。
システム全体の構成図
Google CloudとAWSを連携し、Google Cloudの料金データを社内チャットサーバー(Mattermost)へ定期的に通知する仕組みです。下記の構成図は、各サービス間の連携や処理の流れを示しています。

この構成では、Google Cloud側で料金データの取得・加工を行い、AWS側でセキュアな受信・通知フォーマット整形・チャット通知を行う役割分担となっています。特に重要なポイントは、外部API連携により、社外のGoogle Cloudから社内のチャットサーバーへ安全にデータを送信できることです。
Google Cloud側のサービスと役割

Google Cloud側では、料金データの取得からJSON整形、外部送信までを一貫して処理します。
-
BigQuery(Cloud Billing)
- Google Cloudの全サービス料金データを自動保管
- Cloud Billingのエクスポート機能によるリアルタイムでのデータ蓄積
- SQLクエリによる柔軟なデータ集計・分析が可能
-
Cloud Run functions
- BigQueryへSQLクエリを実行し、必要な料金データを抽出
- Amazon API Gateway向けの標準JSON形式に料金データを整形・変換
- HTTPリクエストでAWS側へ料金データ送信
-
Cloud Scheduler + Pub/Sub
- Cloud Run functionsを定期実行するトリガーの役割
- 今回は平日の毎朝9:00(UTC基準)に実行
- cron式:
0 0 ? * 1-5 *
- cron式:
- Pub/Subを経由することで、処理の確実性とエラーハンドリングを実現
AWS側のサービスと役割

AWS側では、受信したリクエストの認証から料金データ処理、最終的なチャット通知までを担当します。
-
Amazon API Gateway
- Google CloudからのHTTPリクエストを受信
- Lambdaオーソライザーによる認証
- 受信したJSONデータをLambda関数に転送
-
Lambda関数
- 受信した料金データの妥当性チェック
- チャットサーバーの表示形式に最適化したメッセージ整形
- Markdown形式への変換
- Webhook APIを使用した通知送信
-
Lambdaオーソライザー
- 独自の認証ロジックでAmazon API Gatewayへのリクエストを認証および認可
- Authorizationヘッダにセットしたトークンを検証(認証)
- アクセス可能なIAMポリシーを生成して付与(認可)
- 独自の認証ロジックでAmazon API Gatewayへのリクエストを認証および認可
Lambdaオーソライザーについては過去の記事にも登場しているので、併せてご覧ください。
システムフロー

構成図内の番号に沿って、料金データ取得から通知までの流れを説明します。
- Cloud Schedulerが定期的にPub/Subへイベントを送信
- Pub/Subのイベントを受信してCloud Run functionsが起動
- Cloud Run functionsがBigQueryへクエリを実行して料金データを取得
- BigQueryから取得した料金データをCloud Run functionsが受け取る
- Cloud Run functionsがAmazon API Gatewayへ料金データを送信
- Amazon API GatewayがLambdaオーソライザーへ認証情報を確認
- Lambdaオーソライザーが認証情報を返却
- 認証が通った場合、Amazon API GatewayがLambda関数へ料金データを渡す
- Lambda関数がチャットサーバーへ通知を送信
要件への対応
最初に挙げた4つの要件に対して、今回のシステムがどのように対応しているかを整理します。
外部アクセス対応
- 課題: Google Cloud(社外)から社内チャットサーバーへ通知
- 対応策: Amazon API Gatewayを中継点として活用した外部API連携を実現
セキュリティ確保
- 課題: 認証機能付きのAPI連携でデータ送信
- 対応策: Amazon API GatewayでのLambdaオーソライザーによる独自認証ロジック
定期実行
- 課題: 定期的な自動実行による運用負荷軽減
- 対応策: Cloud Scheduler + Pub/Subによる確実な定期実行機能
コスト最適化
- 課題: サーバーレスアーキテクチャによる運用コスト削減
- 対応策:
- Google Cloud: Cloud Run functions、BigQuery、Cloud Scheduler、Pub/Sub
- AWS: AWS Lambda、Amazon API Gateway
- 従量課金モデルによる最適化
データフォーマットと表示例
実際にシステム間で送信されるデータと、最終的なチャット表示がどのようになるかを具体例で紹介します。
Google Cloud側で送信するJSONデータ例
Cloud Run functionsからAmazon API Gatewayへ送信されるJSONデータの構造例:
{ "period": { "start": "10/01", "last": "10/22" }, "total_cost": 1234.56, "details": [ { "project": "company-web-project", "service": "Compute Engine", "cost": 156.78 }, { "project": "company-web-project", "service": "Cloud Storage", "cost": 23.45 }, { "project": "company-data-project", "service": "BigQuery", "cost": 89.12 }, { "project": "company-data-project", "service": "Cloud Storage", "cost": 12.34 }, { "project": "company-infra-project", "service": "Cloud DNS", "cost": 5.67 }, { "project": "company-infra-project", "service": "Cloud Run", "cost": 34.56 }, { "project": "company-ai-project", "service": "Vertex AI", "cost": 789.01 }, { "project": "company-ai-project", "service": "Custom Search", "cost": 12.89 }, { "project": "company-extra-project", "service": "Compute Engine", "cost": 45.67 }, { "project": "company-extra-project", "service": "Cloud Scheduler", "cost": 65.07 } ]}チャットサーバー(Mattermost)での表示例
Lambda関数で整形された後のMattermost通知メッセージ:
10/01~10/22の利用料金は、1234.56 USDです。
・company-web-project : Compute Engine : 156.78 USD・company-web-project : Cloud Storage : 23.45 USD・company-data-project : BigQuery : 89.12 USD・company-data-project : Cloud Storage : 12.34 USD・company-infra-project : Cloud DNS : 5.67 USD・company-infra-project : Cloud Run : 34.56 USD・company-ai-project : Vertex AI : 789.01 USD・company-ai-project : Custom Search : 12.89 USD・company-extra-project : Compute Engine : 45.67 USD・company-extra-project : Cloud Scheduler : 65.07 USDこのように、JSONデータがLambda関数によってMattermostの表示形式に変換され、プロジェクト名とサービス名、料金が明確に表示されるようになります。
検証中のトラブル
検証中のトラブルとして、同じ内容の通知メッセージがチャットサーバーに複数回投稿されるケースが発生しました。各種ログを確認した結果、Pub/Subの設定に原因があることがわかりました。
Pub/Subではメッセージ配信後、配信先から確認応答(Ack)を受け取ります。この時に用いられる設定項目が「確認応答期限」で、設定した時間内に確認応答を受け取らなかった場合、再配信が行われます。
検証時、確認応答期限の設定は15秒でした。Pub/Subのリクエストレイテンシを確認してみたところ、平均で40秒程度でした。確認応答期限を2回も超過したため、計3回の料金通知が行われたということになります。
この処理時間の長さは、今回のシステム構成における課題の1つです。Google CloudからAWS、そして社内のチャットサーバーまでの複数のネットワーク接続と、各段階での認証・データ変換処理が重なることで、全体の処理時間が延びてしまいます。特に、外部API連携による通信遅延とサーバーレス関数のコールドスタート時間が影響しています。
暫定的な対処法として、確認応答期限を1分に延長したことで、再配信されることはなくなりました。
まとめ
今回は、Google Cloudにおける料金通知の課題について、Google CloudとAWSを組み合わせたマルチクラウドアーキテクチャを検討・試験的に実装し、その動作を確認しました。
検証できたもの
- 外部アクセス対応: 外部API連携による汎用的な料金通知システム
- セキュリティ確保: Lambdaオーソライザーによる認証
- 定期実行: Cloud Schedulerによる自動実行で運用負荷軽減
- コスト最適化: サーバーレスアーキテクチャによるコスト最適化
検証中に見えた課題や今後の改善点
- マルチクラウド連携による処理遅延
- 通知フォーマットの視覚的な改善(料金のグラフ化など)
今回の仕組みは、他のクラウドサービス(OCI、Azureなど)にも応用できると考えています。マルチクラウド環境でのコスト管理は、各サービスの特性に応じた役割分担を行うことで柔軟に設計できることを確認しました。
クラウドサービスの利用が拡大する中で、コスト管理は企業にとって非常に重要な事柄であると考えています。本記事がその一助となれば幸いです。