はじめに
対象読者
- 個人または小規模で Google Cloud を利用している方
- 月次・日次の請求額を手軽に把握したい方
- BigQuery / Cloud Functions / Cloud Scheduler の基本操作がわかる方
導入背景
最近個人でも Google Cloud を利用することが多くなりました。
そうなると必然的に心配になってくるのは「今月いくら利用しているんだろう?」というコストの部分です。
構築したのはいいが、リソースを残しっぱなしにしていて予想外の金額になってしまったというのは、どこのクラウドでもよく聞く話です。
そこで、毎朝 LINE に請求金額が届く仕組みをGoogle Cloud を利用して構築することにしました。
サービス別の内訳も含めて通知することで、どのサービスにコストがかかっているかを日々把握できるようにしていきます。
完成イメージ
以下のようなメッセージが毎朝6時にLINE通知されます。
本記事で構築するアーキテクチャ
通知システムで発生するコストについて
1日1回の実行であれば、ほぼ無料枠内で運用可能です。
| サービス | 無料枠 | 本構成での使用量 |
|---|---|---|
| Cloud Functions | 200万回/月 | 約30回/月 |
| Cloud Scheduler | 3ジョブ無料 | 1ジョブ |
| BigQuery | 1TB/月のクエリ | 数MB/月 |
事前知識
ここからは、上記アーキテクチャで使用している各サービス・技術について説明する。
Google Cloud の請求データを取得する仕組み
利用する機能「Cloud Billing Export」について
Google Cloud では、請求データを BigQuery に自動エクスポートする「Cloud Billing Export」という機能が提供されている。
本記事では、この機能を使って請求データを BigQuery に蓄積し、Cloud Functions から SQL でクエリして取得する構成を採用している。
Cloud Billing export to BigQuery lets you export detailed Google Cloud billing data (such as usage, cost estimates, and pricing data) automatically throughout the day to a BigQuery dataset that you specify.
― Google Cloud 公式ドキュメント「Export Cloud Billing data to BigQuery」より日本語訳
BigQuery への Cloud Billing のエクスポート機能を使用することで、指定した BigQuery データセットに、詳細な Google Cloud 課金データ(使用量、費用の見積もり、料金データなど)を終日、自動的にエクスポートできます。
エクスポートの種類
Billing Export には2種類のエクスポートタイプが存在します。
本記事では、サービス別のコスト把握が目的のため「標準エクスポート」を使用します。
| 種類 | テーブル名 | 特徴 |
|---|---|---|
| 標準エクスポート | gcp_billing_export_v1_<BILLING_ACCOUNT_ID> |
基本的なコスト情報(サービス、SKU、プロジェクト、ラベル、コスト等) |
| 詳細エクスポート | gcp_billing_export_resource_v1_<BILLING_ACCOUNT_ID> |
標準 + リソースレベルの詳細(VM、SSD 等の個別リソース) |
Google Cloud 公式ドキュメント:
「Cloud Billing データを BigQuery にエクスポートする」より
「標準データのエクスポートの構造」より
「詳細なデータ エクスポートの構造」より
リージョンによる制約
BigQuery データセットを構築するリージョンによっては制約があります。
Cloud Billing data export supports all multi-region locations (EU or US), but only a subset of region locations.
― Google Cloud 公式ドキュメント「Export Cloud Billing data to BigQuery」より
日本語訳
Cloud Billingデータエクスポートは、すべてのマルチリージョンロケーション(EUまたはUS)をサポートしていますが、単一リージョンロケーションについては一部のみサポートしています。
マルチリージョンと単一リージョンの違い
本記事では、バックフィル(過去のデータを遡って埋める処理)が可能な US マルチリージョン を使用します。
| リージョン種別 | バックフィル | 備考 |
|---|---|---|
| マルチリージョン(US / EU) | 前月分からのデータが遡って入る | 初回は最大5日かかる場合あり |
| 単一リージョン | エクスポート有効化後のデータのみ | バックフィルなし |
Cloud Functions 2nd gen について
本記事では Cloud Scheduler から HTTP トリガーで呼び出す構成で使用する。
リージョンによる料金差
Cloud Run(Cloud Functions 2nd gen)の料金はリージョンによって Tier 1 と Tier 2 に分かれています。
Tier 2 は Tier 1 より料金が高く設定されているため、本記事では、コストを抑えるため us-central1(Tier 1) を使用していきます。
| Tier | リージョン例 |
|---|---|
| Tier 1 | us-central1, us-east1, asia-northeast1(東京), europe-west1 など |
| Tier 2 | asia-northeast3(ソウル), australia-southeast1(シドニー), us-west2 など |
Google Cloud 公式ドキュメント:
「Cloud Run pricing - Regional price tiers」より
日本円への変換方法について
BigQuery にエクスポートされる請求データは USD(米ドル)ベースで記録される。
そして日本円で支払う場合は Google が設定する為替レートで変換され、請求がなされる。
Google Cloud prices most services in United States Dollars (USD). When Google charges in local currency, we convert prices pursuant to the conversion rates published by leading financial institutions.
― Google Cloud 公式ドキュメント「Exchange rates」より
日本語訳
Google Cloud はほとんどのサービスを米ドル(USD)で価格設定しています。現地通貨で請求する場合、主要な金融機関が公表する為替レートに基づいて価格を変換します。
The exchange rates are set at the beginning of every month.
― Google Cloud 公式ドキュメント「Currencies available for Cloud Billing」より
日本語訳
為替レートは毎月初めに設定されます。
本記事での扱い
本記事で作成する通知システムは、日々のコスト把握を目的とした 目安 として日本円を表示する。
Google が実際に請求時に使用する為替レートは公開されていないため、本記事では外部の為替 API を利用して概算値を算出する。
そのため本システムで表示される金額は、実際に請求される金額とは異なる場合があります。 正確な請求金額は Google Cloud コンソールの請求書で確認してください。
Billing Export の反映遅延について
Billing Export はリアルタイムではなく、数時間〜半日程度の遅延が発生する場合があります。そのため当日分の金額は目安としてください。
また月初1〜2日は前月分の遅延反映により金額が急増して見える可能性がある点にも注意。
Frankfurter(為替API)について
本記事では無料で利用できる、為替 API「frankfurter.dev」を使用する。
欧州中央銀行(ECB)の為替レートデータを提供しており、認証不要で過去のレートも取得が可能である。
こちらを利用して、前月の平均為替レートを取得し、USD から JPY への変換を行う。
公式サイト: Frankfurter
通知先について
日々のコストを確認するには、普段から使っているツールへの通知が便利である。
本記事では、日常的に利用頻度が高い LINE を通知先として採用する。
LINE Messaging API について
LINE Messaging API は、LINE 公式アカウントを通じてメッセージを送信するための API である。
本記事では LINE アプリの作成手順は省略する。以下の情報が必要となる:
| 必要な情報 | 取得場所 |
|---|---|
| チャネルアクセストークン | LINE Developers Console |
| 送信先のユーザーID | LINE Developers Console(Your user ID) |
構築手順
以下の構成で、Google Cloud の請求金額を毎日 LINE に通知する仕組みを構築します。
| コンポーネント | 設定値 | 選定理由 |
|---|---|---|
| BigQuery Dataset | US(マルチリージョン) | Billing Export でバックフィル可能 |
| Cloud Functions 2nd gen | us-central1 | Tier 1 料金 |
| Cloud Scheduler | us-central1 | Functions と同じリージョン |
| 為替API | frankfurter.dev | 無料、認証不要、ECB公式データ |
| LINE | Messaging API | LINE 通知 |
ステップ1: BigQuery データセット作成
ステップ1: BigQuery データセット作成
Billing Export の出力先となる BigQuery データセットの作成を行う。
設定値
| 項目 | 設定値 |
|---|---|
| データセットID | billing_data |
| リージョン | US(マルチリージョン) |
# プロジェクト設定
gcloud config set project <YOUR_PROJECT_ID>
# プロジェクト設定確認
gcloud config get-value project
# データセット作成
bq --location=US mk --dataset <YOUR_PROJECT_ID>:billing_data
作成確認
# 作成確認
bq show <YOUR_PROJECT_ID>:billing_data
以下レスポンスが返ってくることを確認
Dataset <YOUR_PROJECT_ID>:billing_data
Last modified ACLs Labels Type Max time travel (Hours)
----------------- -------------------------------------------- -------- --------- -------------------------
17 Jan 23:48:11 Owners: DEFAULT 168
<YOUR_EMAIL>,
projectOwners
Writers:
projectWriters
Readers:
projectReaders
ステップ2: Billing Export 有効化
ステップ2: Billing Export 有効化
Billing Export は請求先アカウント(Billing Account)レベルの設定で、プロジェクトレベルの操作でないため gcloud コマンドではサポートされていない。
そのため Google Cloud コンソールから設定を行う。
参考: BigQuery への Cloud Billing データのエクスポートを設定する
BIGQUERY EXPORT ページに移動
Google Cloud コンソールから [BIGQUERY EXPORT] ページに移動する。
請求先アカウントを選択
課金データをエクスポートする Cloud 請求先アカウントを選択する。
課金データをエクスポート ページの確認
選択後、請求先アカウントの [課金データをエクスポート] ページが表示される。
標準の使用料金を設定
「標準の使用料金」にある「設定を編集」をクリックし、以下を設定する。
| 項目 | 設定値 |
|---|---|
| プロジェクト | 対象のプロジェクトを選択 |
| データセット | ステップ1で作成したデータセット(billing_data)を選択 |
エクスポート有効化の確認
テーブル名の確認
Billing Account ID を確認し、テーブル名を特定する。
テーブル名は Billing Account ID のハイフンをアンダースコアに変換したものになる。
| 項目 | 値 |
|---|---|
| Billing Account ID |
<YOUR-BILLING-ACCOUNT-ID>(例: 0149BD-60D6D9-526EA4) |
| テーブル名 |
gcp_billing_export_v1_<YOUR_BILLING_ACCOUNT_ID>(例: gcp_billing_export_v1_0149BD_60D6D9_526EA4) |
コマンドで確認する場合:
# Billing Account ID 確認コマンド
gcloud billing projects describe <YOUR_PROJECT_ID>
Google Cloud コンソールから確認する場合:
BigQuery のページを開き、作成したデータセット(billing_data)を展開すると、gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX という形式のテーブルが表示される。
以下レスポンスが返ってくることを確認
# レスポンス
billingAccountName: billingAccounts/<YOUR-BILLING-ACCOUNT-ID>
billingEnabled: true
name: projects/<YOUR_PROJECT_ID>/billingInfo
projectId: <YOUR_PROJECT_ID>
注意事項
Billing Export を有効化した直後は、BigQuery にテーブルが作成されるまで数時間〜最大24時間程度かかる場合があります。
テーブルが見つからない場合は、時間を置いてから再度確認すること。
ステップ3: Cloud Functions コード作成
ステップ3: Cloud Functions コード作成
LINE 通知を実行する Cloud Functions のコードを作成する。
ディレクトリ構成
billing-line-notifier/
├── main.py # メイン処理
└── requirements.txt # 依存パッケージ
環境変数
| 環境変数名 | 内容 |
|---|---|
| GCP_PROJECT_ID | 対象の GCP プロジェクトID |
| BILLING_TABLE_ID | BigQuery の請求データテーブル ID(フル指定) |
| LINE_CHANNEL_ACCESS_TOKEN | LINE チャネルアクセストークン |
| LINE_USER_ID | 送信先の LINE ユーザー ID |
セキュリティに関する補足
本記事ではシンプルさを優先して環境変数に直接トークンを設定しているが、本番運用では Secret Manager の利用を推奨。
コード
requirements.txt
| パッケージ | 用途 |
|---|---|
| functions-framework | Cloud Functions 2nd gen のエントリーポイント |
| google-cloud-bigquery | BigQuery からのデータ取得 |
| requests | 為替 API・LINE API への HTTP リクエスト |
functions-framework==3.*
google-cloud-bigquery==3.*
requests==2.*
main.py
"""Google Cloud 請求金額 LINE 通知システム"""
import logging
import os
from datetime import datetime, timedelta, timezone
import functions_framework
import requests
from flask import Request
from google.cloud import bigquery
# ロギング設定
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 定数
JST = timezone(timedelta(hours=9))
LINE_API_URL = "https://api.line.me/v2/bot/message/push"
# 環境変数存在のチェック
def get_env_variables() -> dict[str, str]:
"""環境変数を取得し、未設定の場合はエラーを発生させる"""
required_vars = [
"GCP_PROJECT_ID",
"BILLING_TABLE_ID",
"LINE_CHANNEL_ACCESS_TOKEN",
"LINE_USER_ID",
]
env_vars = {}
missing_vars = []
for var in required_vars:
value = os.environ.get(var)
if not value:
missing_vars.append(var)
else:
env_vars[var] = value
if missing_vars:
raise ValueError(f"環境変数が未設定です: {', '.join(missing_vars)}")
return env_vars
# BigQuery から請求データ取得
def get_billing_data(project_id: str, table_id: str) -> list[dict]:
"""BigQuery から当月の請求データを取得する"""
client = bigquery.Client(project=project_id)
# BQ請求データから当月のサービスごとに合計した情報取得のクエリ
query = f"""
SELECT
service.description AS service_name,
SUM(cost) AS total_cost
FROM
`{table_id}`
WHERE
invoice.month = FORMAT_DATE('%Y%m', CURRENT_DATE('Asia/Tokyo'))
GROUP BY
service.description
ORDER BY
total_cost DESC
"""
query_job = client.query(query)
results = query_job.result()
# 取得したRowオブジェクトを辞書に変換してループ後一括でリストで返す
return [
{"service_name": row.service_name, "total_cost": row.total_cost}
for row in results
]
# 為替API処理
def get_exchange_rate() -> float:
"""frankfurter.dev から前月の平均為替レート(USD→JPY)を取得する"""
# 今日の日付け取得(例:2025-01-19)
today = datetime.now(JST)
# dayを1日に変換(例:2025-01-01)
first_day_of_this_month = today.replace(day=1)
# 1日から1日分を引く(=先月末)(例:2024-12-31)
last_day_of_last_month = first_day_of_this_month - timedelta(days=1)
# dayを1日に変換(例:2024-12-01)
first_day_of_last_month = last_day_of_last_month.replace(day=1)
# 日付を文字列に変換
start_date = first_day_of_last_month.strftime("%Y-%m-%d") # 2024-12-01
end_date = last_day_of_last_month.strftime("%Y-%m-%d") # 2024-12-31
# APIのURL作成(USD基準にしたJPYレートの依頼URL)
url = (
f"https://api.frankfurter.dev/v1/{start_date}..{end_date}"
f"?base=USD&symbols=JPY"
)
# API呼び出し
# HTTP GETリクエストでタイムアウト30秒
response = requests.get(url, timeout=30)
# HTTPエラーがあれば例外処理
response.raise_for_status()
# レスポンスをJSONからPythonの辞書に変換
data = response.json()
# 例:"2024-12-01": {"JPY": 149.50} の「149.50」を リストで、ratesに格納
# .values()することで値部分だけを取得
rates = [rate["JPY"] for rate in data["rates"].values()]
if not rates:
raise ValueError("為替レートデータが取得できませんでした")
# 平均を計算して返す
average_rate = sum(rates) / len(rates)
return average_rate
# LINEメッセージ作成
def build_message(
billing_data: list[dict],
exchange_rate: float,
now: datetime
) -> str:
"""LINE 通知メッセージを組み立てる"""
# billing_dataの例: {"service_name": "BigQuery", "total_cost": 1.20}の「total_cost」を合計
total_cost_usd = sum(item["total_cost"] for item in billing_data)
# レート変換計算
total_cost_jpy = round(total_cost_usd * exchange_rate)
# dayを1日に変換(例:2025-01-01)
first_day_of_this_month = now.replace(day=1)
# 1日から1日分を引く(=先月末)(例:2024-12-31)
last_month = first_day_of_this_month - timedelta(days=1)
# 月の数字を文字列に変換(%-mで 0を削除)(例:"02月"→"2月"")
last_month_name = last_month.strftime("%-m月")
# LINEメッセージ
# {total_cost_jpy:,}で 3桁区切りカンマ
# {exchange_rate:.2f}で 小数点2桁まで表示
lines = [
f"【Google Cloud 請求通知】{now.year}年{now.month}月",
f"送付日時: {now.strftime('%Y/%m/%d %H:%M')}",
"━━━━━━━━━━━━",
f"累計: ¥{total_cost_jpy:,}",
f"為替: 1 USD = {exchange_rate:.2f} JPY({last_month_name}平均)",
"━━━━━━━━━━━━",
"■ サービス別内訳",
]
# データがあればサービス行の追加
if billing_data:
for item in billing_data:
cost_jpy = round(item["total_cost"] * exchange_rate)
lines.append(f"・{item['service_name']}: ¥{cost_jpy:,}")
else:
lines.append("利用なし")
# 区切り線の追加して返却
lines.append("━━━━━━━━━━━━")
return "\n".join(lines)
# 各種エラーメッセージ
def build_error_message(error_type: str, now: datetime) -> str:
# LINEメッセージ
lines = [
"【Google Cloud 請求通知 - エラー】",
f"送付日時: {now.strftime('%Y/%m/%d %H:%M')}",
"━━━━━━━━━━━━",
f"エラー: {error_type}",
"━━━━━━━━━━━━",
]
return "\n".join(lines)
# LINEにメッセージ送信
def send_line_message(message: str, token: str, user_id: str) -> None:
"""LINE Messaging API でメッセージを送信する"""
# ヘッダー設定(JSON形式、認証としてアクセストークンを利用)
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}",
}
# リクエストボディ設定(送り先のユーザID、メッセージ内容)
payload = {
"to": user_id,
"messages": [{"type": "text", "text": message}],
}
# リクエスト送信(30秒タイムアウト)
response = requests.post(
LINE_API_URL,
headers=headers,
json=payload,
timeout=30
)
# HTTPエラーがあれば例外処理
response.raise_for_status()
@functions_framework.http
def main(request: Request) -> tuple[str, int]:
"""Cloud Functions エントリーポイント"""
now = datetime.now(JST)
# 環境変数チェック
try:
env = get_env_variables()
except ValueError as e:
logger.error("環境変数エラー: %s", e)
return "Environment Variable Error", 500
try:
# BigQuery から請求データ取得
try:
billing_data = get_billing_data(
env["GCP_PROJECT_ID"],
env["BILLING_TABLE_ID"]
)
except Exception as e:
logger.error("BigQuery エラー: %s", e)
error_message = build_error_message("BigQueryエラー", now)
send_line_message(
error_message,
env["LINE_CHANNEL_ACCESS_TOKEN"],
env["LINE_USER_ID"]
)
return "BigQuery Error", 500
# 為替レート取得
try:
exchange_rate = get_exchange_rate()
except Exception as e:
logger.error("為替API エラー: %s", e)
error_message = build_error_message("為替APIエラー", now)
send_line_message(
error_message,
env["LINE_CHANNEL_ACCESS_TOKEN"],
env["LINE_USER_ID"]
)
return "Exchange Rate API Error", 500
# メッセージ組み立て
message = build_message(billing_data, exchange_rate, now)
# LINE 送信
try:
send_line_message(
message,
env["LINE_CHANNEL_ACCESS_TOKEN"],
env["LINE_USER_ID"]
)
except Exception as e:
logger.error("LINE送信 エラー: %s", e)
return "LINE API Error", 500
logger.info("請求通知を送信しました")
return "OK", 200
except Exception as e:
logger.error("予期しないエラー: %s", e)
try:
error_message = build_error_message("予期しないエラー", now)
send_line_message(
error_message,
env["LINE_CHANNEL_ACCESS_TOKEN"],
env["LINE_USER_ID"]
)
except Exception:
pass
return "Internal Error", 500
クエリの補足
本記事では cost のみを集計している。
クレジット(無料枠・割引)を含めた正味の請求額を確認したい場合は、cost + IFNULL((SELECT SUM(amount) FROM UNNEST(credits)), 0) のような集計が必要となる。
ステップ4: Cloud Functions デプロイ
ステップ4: Cloud Functions デプロイ
作成したコードを Cloud Functions にデプロイをする。
デプロイ設定
| 項目 | 設定値 |
|---|---|
| 関数名 | billing-line-notifier |
| リージョン | us-central1 |
| ランタイム | python312 |
| エントリーポイント | main |
| トリガー | HTTP |
| メモリ | 256MB(デフォルト) |
| タイムアウト | 60秒 |
必要な IAM 権限
Cloud Functions から BigQuery にクエリを実行するため、デフォルトのサービスアカウントに以下の権限が必要となる。
| ロール | 用途 |
|---|---|
| BigQuery データ閲覧者(roles/bigquery.dataViewer) | テーブルデータの読み取り |
| BigQuery ジョブユーザー(roles/bigquery.jobUser) | クエリジョブの実行 |
新規プロジェクトの場合は、以下のコマンドで権限を付与する。
※ステップ1で設定したプロジェクトが引き継がれていない場合は、再度 gcloud config set project <YOUR_PROJECT_ID> を実行すること。
# プロジェクトIDを設定(未設定の場合)
export GCP_PROJECT_ID=$(gcloud config get-value project)
# デフォルトのCompute Engineサービスアカウントに権限付与
PROJECT_NUMBER=$(gcloud projects describe ${GCP_PROJECT_ID} --format="value(projectNumber)")
gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/bigquery.dataViewer"
gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/bigquery.jobUser"
デプロイコマンド
コマンドにて --no-allow-unauthenticated オプションを指定することで、認証なしでの HTTP アクセスを禁止する。これにより Cloud Scheduler からの認証付きリクエストのみを受け付ける構成とする。
# プロジェクトID
export GCP_PROJECT_ID="<YOUR_PROJECT_ID>"
# BigQuery テーブルID(フル指定)
export BILLING_TABLE_ID="${GCP_PROJECT_ID}.billing_data.gcp_billing_export_v1_<YOUR_BILLING_ACCOUNT_ID>"
# LINE チャネルアクセストークン
export LINE_CHANNEL_ACCESS_TOKEN="<YOUR_LINE_CHANNEL_ACCESS_TOKEN>"
# LINE ユーザーID
export LINE_USER_ID="<YOUR_LINE_USER_ID>"
# デプロイコマンド
gcloud functions deploy billing-line-notifier \
--gen2 \
--region=us-central1 \
--runtime=python312 \
--source=. \
--entry-point=main \
--trigger-http \
--no-allow-unauthenticated \
--timeout=60s \
--memory=256MB \
--set-env-vars="GCP_PROJECT_ID=${GCP_PROJECT_ID},BILLING_TABLE_ID=${BILLING_TABLE_ID},LINE_CHANNEL_ACCESS_TOKEN=${LINE_CHANNEL_ACCESS_TOKEN},LINE_USER_ID=${LINE_USER_ID}"
デプロイ確認
gcloud functions describe billing-line-notifier \
--gen2 \
--region=us-central1 \
--format="table(name,state,url)"
以下レスポンスが返ってくることを確認
NAME STATE URL
billing-line-notifier ACTIVE https://us-central1-<YOUR_PROJECT_ID>.cloudfunctions.net/billing-line-notifier
LINEへの通知確認
Cloud Functions を手動実行し、LINE に通知が届くことを確認する。
gcloud functions call billing-line-notifier \
--gen2 \
--region=us-central1
以下のレスポンスが返ってくれば OK:
OK
LINE アプリを確認し、以下のように請求通知メッセージが届いていることを確認する。
ステップ5: Cloud Scheduler の設定
ステップ5: Cloud Scheduler の設定
毎日 JST 6:00 に Cloud Functions を実行するスケジュールジョブを作成する。
Cloud Functions の URL を取得
# Cloud Functions の URL を取得
FUNCTION_URL=$(gcloud functions describe billing-line-notifier \
--gen2 \
--region=us-central1 \
--format="value(url)")
# 取得されていることの確認
echo $FUNCTION_URL
サービスアカウントに Cloud Functions 呼び出し権限を付与
サービスアカウントについて
本記事では簡略化のため Compute Engine デフォルトのサービスアカウントを使用しているが、本番運用では Cloud Scheduler 専用のサービスアカウントを作成することを推奨。
# プロジェクト番号を取得
PROJECT_NUMBER=$(gcloud projects describe ${GCP_PROJECT_ID} --format="value(projectNumber)")
# サービスアカウントに権限付与
gcloud functions add-invoker-policy-binding billing-line-notifier \
--gen2 \
--region=us-central1 \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
Cloud Scheduler ジョブの作成
# ジョブの作成
gcloud scheduler jobs create http daily-billing-notification \
--location=us-central1 \
--schedule="0 6 * * *" \
--time-zone="Asia/Tokyo" \
--uri="${FUNCTION_URL}" \
--http-method=GET \
--oidc-service-account-email="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
ジョブ確認
# ジョブの確認
gcloud scheduler jobs describe daily-billing-notification \
--location=us-central1
ジョブの手動実行
# 手動実行
gcloud scheduler jobs run daily-billing-notification \
--location=us-central1
LINEへの通知確認
LINE アプリを確認し、請求通知メッセージが届いていれば設定完了。
まとめ
本記事では、Google Cloud の請求金額を毎日 LINE に通知する仕組みを構築した。
BigQuery Billing Export で請求データを蓄積し、Cloud Functions で取得・整形、Cloud Scheduler で毎朝自動実行することで、日々のコストを手軽に把握できるようになりました。
1日1回の実行であれば無料枠内で運用できるため、個人利用でも気軽に導入できる構成で、個人開発しているときにも毎日金額が通知されるので安心できるかと思います。
なお、本システムで表示される日本円は外部の為替 API を利用した概算値であり、実際の請求金額とは異なる場合がある点には注意してください。







