1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Cloud 請求額を毎日LINE通知(個人利用)

1
Last updated at Posted at 2026-01-18

はじめに

対象読者

  • 個人または小規模で Google Cloud を利用している方
  • 月次・日次の請求額を手軽に把握したい方
  • BigQuery / Cloud Functions / Cloud Scheduler の基本操作がわかる方

導入背景

最近個人でも Google Cloud を利用することが多くなりました。
そうなると必然的に心配になってくるのは「今月いくら利用しているんだろう?」というコストの部分です。
構築したのはいいが、リソースを残しっぱなしにしていて予想外の金額になってしまったというのは、どこのクラウドでもよく聞く話です。

そこで、毎朝 LINE に請求金額が届く仕組みをGoogle Cloud を利用して構築することにしました。
サービス別の内訳も含めて通知することで、どのサービスにコストがかかっているかを日々把握できるようにしていきます。

完成イメージ

以下のようなメッセージが毎朝6時にLINE通知されます。

image.png

本記事で構築するアーキテクチャ

image.png

通知システムで発生するコストについて

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] ページに移動する。

image.png

請求先アカウントを選択

課金データをエクスポートする Cloud 請求先アカウントを選択する。

image.png

課金データをエクスポート ページの確認

選択後、請求先アカウントの [課金データをエクスポート] ページが表示される。

image.png

標準の使用料金を設定

「標準の使用料金」にある「設定を編集」をクリックし、以下を設定する。

項目 設定値
プロジェクト 対象のプロジェクトを選択
データセット ステップ1で作成したデータセット(billing_data)を選択

image.png

エクスポート有効化の確認

画面遷移し、エクスポートが有効化されたことを確認する。
image.png

テーブル名の確認

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 アプリを確認し、以下のように請求通知メッセージが届いていることを確認する。

image.png

ステップ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 アプリを確認し、請求通知メッセージが届いていれば設定完了。

image.png

まとめ

本記事では、Google Cloud の請求金額を毎日 LINE に通知する仕組みを構築した。

BigQuery Billing Export で請求データを蓄積し、Cloud Functions で取得・整形、Cloud Scheduler で毎朝自動実行することで、日々のコストを手軽に把握できるようになりました。

1日1回の実行であれば無料枠内で運用できるため、個人利用でも気軽に導入できる構成で、個人開発しているときにも毎日金額が通知されるので安心できるかと思います。

なお、本システムで表示される日本円は外部の為替 API を利用した概算値であり、実際の請求金額とは異なる場合がある点には注意してください。

参考ドキュメント

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?