E 会計/ファイナンス・コスト効率 — Cloud Run CPU 97%削減 × GKE CUD+Spot 43%削減 × Cloud Storage Coldline 72%削減(FinOps 3 施策 Bad→Good)

2026-06-26 (Day 81) 金曜 E: 会計/ファイナンス・コスト効率 ★★★★☆ Cloud Run cpu_idle / GKE CUD + Spot Cloud Storage ライフサイクル / FinOps ROI 2,880%

概要

☁️

Cloud Run: cpu_idle=true でアイドル課金を撲滅する

Cloud Run の cpu-always-allocated(Terraform: cpu_idle=false)はアイドル時も vCPU 秒を課金し続ける。cpu_idle=true に変更するだけでリクエスト処理時のみ課金になり、平均 8 サービスで $592/月(97.1%)削減。コード変更不要・Terraform 1 行修正・ゼロリスク。コスト最適化で最初に確認すべき設定。

⚙️

GKE: 安定ワークロードに CUD、バッチに Spot の 2 段構え

GKE ノードプールは「本番(安定)= CUD 30% 割引」「バッチ(中断可)= Spot 75% 割引」に分離するのが定石。7 ノード CUD + 3 ノード Spot で月次 $658(43.4%)削減。CUD は 1 年契約(解約不可)なため「このノード数は確実に 1 年必要か」の確認が必須。

🗄️

Cloud Storage: アクセス頻度に合わせたライフサイクル移行

全データを Standard に置き続けるのは「使わない貴金属を貸金庫に預け続ける」のと同じ。直近 1 ヶ月(5 TB)= Standard、3 ヶ月以上前(45 TB)= Coldline($0.004/GB)に自動移行で $737/月(72%)削減。Terraform の lifecycle_rule 設定のみで自動化可能。

📊

FinOps 三原則: 可視化→最適化→ガバナンスのサイクル

コスト削減は一回限りのイベントではなくサイクル。Cloud Billing を BigQuery エクスポートし Looker Studio で可視化→施策実施→前後比較でトラッキング→次の最適化機会の発見を繰り返す。3 施策合計で月次 $1,987 削減・年間 ROI 2,880%・ペイバック 12 日

問題

ECサイト MOps チームは GCP を主要インフラとして利用している。月次インフラコストレビューで CFO から「コスト最適化の余地を定量的に示してほしい」と依頼があった。以下の現状構成をもとに:

  1. 各サービス(Cloud Run / GKE / Cloud Storage)の Bad→Good コスト試算を行い、施策別削減額を算出せよ
  2. 施策を ROI × リスク で優先順位付けし、4 人日以内の実施計画を示せよ
  3. CFO 向け提案サマリー(投資額・月次削減・ペイバック・年間 ROI・リスク)を作成せよ
  4. FinOps ダッシュボードで継続的なコスト監視の設計を示せよ

与件(GCP インフラ構成)

サービス現状問題点
Cloud Run v2 × 8CPU always-on(全 8 本)
1 vCPU / 2 GB / 500K req/月
アイドル時も vCPU 秒課金
夜間・週末 2 本はほぼゼロ
GKE n2-standard-4 × 10全ノードオンデマンドCUD / Spot 未使用
7 本=本番 / 3 本=バッチ
Cloud Storage 50 TB全て Standard クラス45 TB は 3 ヶ月以上前のアーカイブ
月 1 回バッチアクセスのみ

GCP 料金表(asia-northeast1)

リソース料金
Cloud Run CPU(always-on)$0.000024/vCPU秒
Cloud Run Memory$0.0000025/GB秒
n2-standard-4 オンデマンド$0.208/時間
n2-standard-4 1年CUD$0.146/時間(30%割引)
n2-standard-4 Spot$0.052/時間(75%割引)
Cloud Storage Standard$0.020/GB/月
Cloud Storage Coldline$0.004/GB/月(最低 90 日)

追加条件

項目
エンジニア単価6,000 円/時間
為替レート1 USD = 150 円
工数上限4 人日
平均リクエスト時間200 ms/req
夜間・週末 2 本のリクエスト数50,000 req/月(通常の 1/10)
期待する回答形式: 施策別 Bad→Good コスト試算 + 優先順位(ROI × リスク)+ CFO 向けサマリー + FinOps ダッシュボード設計

Bad コスト構造 — 最適化前の 3 つの問題

このコスト構造には 3 つの最適化機会 が見落とされています。
Bad コスト構造(最適化前)
infra_costs = {
    # ❌ Cloud Run: CPU always-on(アイドル時も課金)
    "cloud_run": {
        "cpu_always_allocated": True,   # ← 問題
        "services": 8,
        "avg_vcpu": 1.0,
        "avg_memory_gb": 2.0,
        # 月次コスト:
        # 8svc × 1vCPU × 2,628,000sec × $0.000024 = $504.96
        # 8svc × 2GB  × 2,628,000sec × $0.0000025 = $105.12
        # 合計: $610.08/月
    },
    # ❌ GKE: 全ノードオンデマンド(CUD/Spot 未使用)
    "gke": {
        "node_type": "n2-standard-4",
        "on_demand": True,              # ← 問題
        "node_count": 10,
        # 月次コスト: 10 × $0.208 × 730h = $1,518.40/月
    },
    # ❌ Cloud Storage: 全て Standard(アーカイブ含む)
    "cloud_storage": {
        "total_tb": 50,
        "storage_class": "STANDARD",   # ← 問題
        "archive_tb": 45,              # 3ヶ月以上前 = 月1回アクセスのみ
        # 月次コスト: 51,200 GB × $0.020 = $1,024.00/月
    },
}
# ───────────────────────────────────
# Bad 合計コスト: $3,152.48/月
# ───────────────────────────────────
問題点サマリー(3点)
1Cloud Run CPU always-on: アイドル時も $504/月 の CPU 課金 — 8 サービス × 1 vCPU × 730 時間分のアイドル課金が発生。cpu_idle=true に変更するだけで処理時のみ課金になり、97% 削減可能。コード変更・デプロイ不要。
2GKE 全ノードオンデマンド: CUD と Spot が未使用 — 本番 7 ノードは長期安定稼働(CUD 30%割引の対象)、バッチ 3 ノードは中断可能(Spot 75%割引の対象)。両方を適用すれば月次 $658 削減。GKE CUD は 1 年契約なためノード数の確認が必要。
3Cloud Storage 全 Standard: 45 TB のアーカイブに高い料金を払い続け — 3 ヶ月以上アクセスのない 45 TB が Standard($0.020/GB)に置き続けられている。Coldline($0.004/GB)に移行すれば 80% 削減($737/月)。Terraform lifecycle_rule 設定のみで自動化可能。

ヒント(段階的開示)

ヒント1 — 方向性
コスト最適化には「設定変更のみで即効」「契約変更が必要」「アーキテクチャ変更が必要」の 3 段階がある。リスクが低く ROI が高い施策から着手するのが鉄則。Cloud Run の CPU 設定はコード変更ゼロ・ゼロリスク・97% 削減という「最も ROI が高い施策」。まずここから始める。
ヒント2 — アプローチ
  • Cloud Run コスト式: サービス数 × vCPU × 秒数 × $0.000024(always-on の場合は 2,628,000 秒/月、処理時のみは実リクエスト処理秒数)
  • GKE CUD/Spot 式: 7 × $0.146 × 730 + 3 × $0.052 × 730
  • Cloud Storage 式: 5,120 GB × $0.020 + 46,080 GB × $0.004
  • ROI 式: (月次削減額 × 12 - 実施コスト)÷ 実施コスト × 100
ヒント3 — 試算の骨格
VCPU_PRICE  = 0.000024
SECONDS_MON = 730 * 3600   # 2,628,000

# Cloud Run Bad
bad_cr = 8 * 1.0 * SECONDS_MON * VCPU_PRICE  # $504.96 CPU

# Cloud Run Good(処理時のみ)
active_sec = 0.200 * 500_000   # 100,000 秒
good_cr = 6 * 1.0 * active_sec * VCPU_PRICE + 2 * 1.0 * 0.200 * 50_000 * VCPU_PRICE
# ≈ $14.88

# GKE Bad / Good
bad_gke  = 10 * 0.208 * 730             # $1,518.40
good_gke = (7 * 0.146 + 3 * 0.052) * 730  # $859.94

# GCS Bad / Good
bad_gcs  = 51_200 * 0.020                # $1,024.00
good_gcs = 5_120 * 0.020 + 46_080 * 0.004  # $286.72

問題点分析(3点)

#問題点分類改善方法削減額リスク
1Cloud Run CPU always-on(アイドル時課金)コスト/設定cpu_idle=true(Terraform 1 行)$592/月低(コード変更不要)
2GKE 全ノードオンデマンド(CUD/Spot 未使用)コスト/契約7 ノード CUD + 3 ノード Spot$658/月中(1 年契約拘束)
3Cloud Storage 全 Standard(アーカイブ含む)コスト/設定lifecycle_rule Coldline 自動移行$737/月低(読み取りコスト注意)

コスト構造図 — Bad vs Good(3 施策)

Bad — 最適化前 合計 $3,152/月 Cloud Run × 8 — CPU always-on 8 svc × 1 vCPU × 2,628,000 sec × $0.000024 $504.96 8 svc × 2 GB × 2,628,000 sec × $0.0000025 $105.12 Cloud Run 小計 $610.08/月 問題: アイドル時 (730h) もフル課金。夜間・週末 2 本はほぼゼロリクエスト cpu_idle=true に変更するだけで 97.1% 削減可能 GKE n2-standard-4 × 10 — 全てオンデマンド 10 nodes × $0.208/h × 730 h/月 $1,518.40/月 問題: 本番 7 ノード(CUD 対象)・バッチ 3 ノード(Spot 対象)の分離なし CUD 30% + Spot 75% 適用で $658/月 削減可能 CUD 1 年コミット: $8,954/年(解約不可リスクあり) Cloud Storage 50 TB — 全て Standard 51,200 GB × $0.020/GB/月 $1,024.00/月 問題: 45 TB(90%)は 3 ヶ月以上前のアーカイブ。月 1 回バッチのみアクセス Coldline ($0.004/GB) への移行で 72% 削減可能 Coldline 読み取りコスト $0.05/GB に注意(大量読み取り前に試算要) Bad 合計コスト Cloud Run: $610/月 GKE: $1,518/月 Cloud Storage: $1,024/月 合計: $3,152/月 Good — 最適化後 合計 $1,165/月(63%削減) Cloud Run × 8 — cpu_idle=true(処理時のみ) 6 svc × 1 vCPU × (0.2s × 500,000) sec × $0.000024 $14.40 2 svc × 1 vCPU × (0.2s × 50,000) sec × $0.000024 $0.48 Memory(同条件) $3.10 Cloud Run 小計 $17.98/月 削減: $592.10/月(97.1%)| 工数: 0.5 人日 | リスク: 低 Terraform: cpu_idle=true + startup_cpu_boost=true GKE: 7 ノード CUD + 3 ノード Spot 7 nodes × $0.146/h × 730 h $746.06 3 nodes × $0.052/h × 730 h(Spot) $113.88 GKE 小計 $859.94/月 削減: $658.46/月(43.4%)| 工数: 1 人日 | CUD 1 年拘束あり Cloud Storage: Standard 5 TB + Coldline 45 TB 5,120 GB × $0.020/GB(直近 1 ヶ月・Standard 維持) $102.40 46,080 GB × $0.004/GB(3 ヶ月以上・Coldline) $184.32 GCS 小計 $286.72/月 削減: $737.28/月(72.0%)| 工数: 1 人日 | lifecycle_rule 自動化 Good 合計コスト & ROI Cloud Run + GKE + GCS: $1,164.64/月 月次削減額 ($1,987/月 × 150 円): ¥298,050/月 実施コスト (2.5 人日): ¥120,000 ペイバック: 12 日 / 年間 ROI 2,880% 最適化

施策別 ROI 比較 — リスク × 削減額マトリクス

月次削減額 $800 $600 $400 $200 $0 $592/月 Cloud Run cpu_idle=true ROI 7,021% リスク: 低 0.5 人日 $737/月 Cloud Storage Coldline 移行 ROI 3,661% リスク: 低 1 人日 $658/月 GKE CUD + Spot ROI 3,267% リスク: 中 1 人日 + 1年拘束 推奨実施順: ① Cloud Run(即日) ② Cloud Storage(同週) ③ GKE CUD(月末判断) 合計: 2.5 人日 月次削減: $1,987 ペイバック: 12 日

模範解答

Cloud Run: cpu_idle=true でアイドル課金を撲滅

Bad — CPU always-on
# 問題: cpu_idle=false(デフォルト)= アイドル時も課金
# terraform
resource "google_cloud_run_v2_service" "campaign_api" {
  template {
    containers {
      resources {
        # ❌ 未設定 or cpu_idle=false
        # → 730h/月のアイドル時も vCPU 秒課金
        limits = {
          cpu    = "1"
          memory = "2Gi"
        }
      }
    }
    # ❌ min_instance_count=1 も設定なしでコールドスタート頻発
  }
}

# コスト計算
VCPU_PRICE  = 0.000024
MEM_PRICE   = 0.0000025
SECONDS_MON = 730 * 3600  # 2,628,000秒

# 8サービス全てアイドル課金
bad_cpu = 8 * 1.0 * SECONDS_MON * VCPU_PRICE
# = 8 × 2,628,000 × $0.000024 = $504.96/月

bad_mem = 8 * 2.0 * SECONDS_MON * MEM_PRICE
# = 8 × 2 × 2,628,000 × $0.0000025 = $105.12/月

bad_total = bad_cpu + bad_mem  # $610.08/月
Good — リクエスト処理時のみ課金
# ✅ cpu_idle=true = リクエスト処理時のみ課金
resource "google_cloud_run_v2_service" "campaign_api" {
  template {
    containers {
      resources {
        limits = {
          cpu    = "1"
          memory = "2Gi"
        }
        # ✅ アイドル時は CPU をスロットリング(課金なし)
        cpu_idle = true
        # ✅ コールドスタート時だけ CPU を一時的に増強
        startup_cpu_boost = true
      }
    }
    # ✅ スケールゼロで未使用時はインスタンス代もゼロ
    scaling {
      min_instance_count = 0
      max_instance_count = 10
    }
  }
}

# コスト再計算
# アクティブ 6 本: 200ms × 500,000 req/月 = 100,000 秒
active_sec = 0.200 * 500_000   # 100,000 秒
good_cpu_active = 6 * 1.0 * active_sec * VCPU_PRICE
# = 6 × 100,000 × $0.000024 = $14.40/月

# 夜間低負荷 2 本: 200ms × 50,000 req/月 = 10,000 秒
low_sec = 0.200 * 50_000       # 10,000 秒
good_cpu_low = 2 * 1.0 * low_sec * VCPU_PRICE
# = 2 × 10,000 × $0.000024 = $0.48/月

good_mem_active = 6 * 2.0 * active_sec * MEM_PRICE
# = $3.00/月
good_mem_low = 2 * 2.0 * low_sec * MEM_PRICE
# = $0.10/月

good_total = 14.40 + 0.48 + 3.00 + 0.10  # $17.98/月

reduction = 610.08 - 17.98  # $592.10/月(97.1%削減)

# ⚠️ 注意: バックグラウンド処理(OTel スパン送信など)が
# リクエスト終了後に実行される場合、スロットリングで遅延。
# DataDog で 1 週間モニタリング後に本番適用を推奨

GKE: 本番 CUD + バッチ Spot の 2 段構え

Bad — 全ノードオンデマンド
# ❌ 全ノードオンデマンド(CUD/Spot 未使用)
resource "google_container_cluster" "main" {
  # ❌ 単一ノードプール: CUD/Spot の分離なし
  node_pool {
    name          = "default"
    node_count    = 10
    node_config {
      machine_type = "n2-standard-4"
      # spot = false(デフォルト = オンデマンド)
    }
  }
}

# コスト試算
ON_DEMAND = 0.208   # $/h
HOURS_MON = 730

bad_gke = 10 * ON_DEMAND * HOURS_MON
# = 10 × $0.208 × 730 = $1,518.40/月
Good — 7 ノード CUD + 3 ノード Spot
# ✅ 本番 7 ノード: 1 年 CUD(30%割引)
resource "google_container_node_pool" "prod_cud" {
  name    = "prod-cud"
  cluster = google_container_cluster.main.name

  node_count = 7
  node_config {
    machine_type = "n2-standard-4"
    # CUD は GCP Console または gcloud で契約
    # Terraform では通常ノードとして定義し、
    # 別途 CUD コミットメントを gcloud で設定
  }
}

# ✅ バッチ 3 ノード: Spot(75%割引・中断可)
resource "google_container_node_pool" "batch_spot" {
  name    = "batch-spot"
  cluster = google_container_cluster.main.name

  node_config {
    machine_type = "n2-standard-4"
    spot         = true  # ✅ Spot インスタンス

    # 中断時にバッチ Pod が安全にスケジュールされないよう taint
    taint {
      key    = "cloud.google.com/gke-spot"
      value  = "true"
      effect = "NO_SCHEDULE"
    }
  }
  # バーストに対応するためオートスケール設定
  autoscaling {
    min_node_count = 0
    max_node_count = 5
  }
}

# Spot ノードへの Argo Workflows バッチ Job 配置
# workflow spec:
#   nodeSelector:
#     cloud.google.com/gke-spot: "true"
#   tolerations:
#   - key: "cloud.google.com/gke-spot"
#     operator: "Equal"
#     value: "true"
#     effect: "NoSchedule"

# コスト試算
CUD_HOURLY  = 0.146   # 1年CUD(30%割引)
SPOT_HOURLY = 0.052   # Spot(75%割引)

good_gke = (7 * CUD_HOURLY + 3 * SPOT_HOURLY) * 730
# = (1.022 + 0.156) × 730 = $859.94/月

reduction = 1518.40 - 859.94  # $658.46/月(43.4%削減)

# ⚠️ CUD 注意事項:
# 1. 1 年契約・解約不可(ペナルティあり)
# 2. ノード数は減らせるが CUD 費は発生し続ける
# 3. GKE Autopilot では CUD 概念が異なる
# → 7 ノードを 1 年確実に使うか事前確認必須

# CUD コミット金額(年額)
cud_commitment = 7 * CUD_HOURLY * 8760  # 年間8,760h
# = 7 × $0.146 × 8,760 = $8,953.92/年

Cloud Storage: ライフサイクルルールで自動 Coldline 移行

Bad — 全て Standard
# ❌ ライフサイクルルールなし(全データ Standard)
resource "google_storage_bucket" "mops_data" {
  name     = "mops-data-bucket"
  location = "asia-northeast1"
  # ❌ lifecycle_rule なし
}

# コスト試算
STANDARD = 0.020  # $/GB/月

total_gb = 50 * 1024   # 51,200 GB

bad_gcs = total_gb * STANDARD
# = 51,200 × $0.020 = $1,024.00/月

# 45 TB のアーカイブが Standard に眠っている
archive_gb = 45 * 1024  # 46,080 GB
archive_waste = archive_gb * (STANDARD - 0.004)
# = 46,080 × $0.016 = $737.28/月 のムダ
Good — ライフサイクル自動移行
# ✅ ライフサイクルルール: 自動クラス移行
resource "google_storage_bucket" "mops_data" {
  name     = "mops-data-bucket"
  location = "asia-northeast1"

  # ✅ 30 日後: Nearline(月1回以上アクセスする中間層)
  lifecycle_rule {
    condition { age = 30 }
    action {
      type          = "SetStorageClass"
      storage_class = "NEARLINE"
    }
  }

  # ✅ 90 日後: Coldline(ほぼアクセスなし)
  lifecycle_rule {
    condition { age = 90 }
    action {
      type          = "SetStorageClass"
      storage_class = "COLDLINE"
    }
  }

  # ✅ オプション: 365 日後は Archive(さらに安価)
  # lifecycle_rule {
  #   condition { age = 365 }
  #   action { type = "SetStorageClass"; storage_class = "ARCHIVE" }
  # }
}

# コスト試算
STANDARD = 0.020   # $/GB/月
COLDLINE = 0.004   # $/GB/月(最低 90 日保存)

recent_gb  = 5  * 1024   # 5,120 GB(直近 1 ヶ月)
archive_gb = 45 * 1024   # 46,080 GB(3 ヶ月以上前)

good_gcs = recent_gb * STANDARD + archive_gb * COLDLINE
# = 5,120 × $0.020 + 46,080 × $0.004
# = $102.40 + $184.32
# = $286.72/月

reduction = 1024.00 - 286.72  # $737.28/月(72.0%削減)

# ⚠️ Coldline の注意事項:
# 1. 最低保存 90 日: 早期削除時に残り日数分を課金
#    例: 30 日で削除 → 60 日分の Coldline 料金が別途発生
# 2. 読み取りコスト: $0.05/GB(Standard は $0.01/GB)
#    大量バッチ読み取り前にコスト試算必須
#    45 TB を一括読み取り: 46,080 × $0.05 = $2,304(1 回の読み取りコスト)
# 3. 移行後 7 日間は既存オブジェクトがルール適用待ち

施策別 ROI & CFO 提案サマリー

============================================================
施策別コスト試算サマリー
============================================================

| 施策                     | 削減前      | 削減後    | 月次削減額  | 工数    | ROI/年    | リスク |
|--------------------------|------------|----------|------------|---------|---------|-------|
| Cloud Run cpu_idle=true  | $610/月    | $18/月   | $592/月    | 0.5 人日 | 7,021%  | 低    |
| Cloud Storage Coldline   | $1,024/月  | $287/月  | $737/月    | 1.0 人日 | 3,661%  | 低    |
| GKE CUD + Spot           | $1,518/月  | $860/月  | $658/月    | 1.0 人日 | 3,267%  | 中    |
| 合計(今回 3 施策)       | $3,152/月  | $1,165/月 | $1,987/月  | 2.5 人日 | 2,880%  | —     |
| BigQuery(先週対応済み)  | $900/月    | $38/月   | $862/月    | 3.0 人日 | —       | 済    |

============================================================
CFO 向け提案サマリー(2026-06-26 版)
============================================================

【投資概要】
  投資対象: GCP インフラコスト最適化(3 施策)
  投資額  : ¥120,000(2.5 人日 × 8h × ¥6,000/h)
  月次削減: $1,987/月 × 150 円 = ¥298,050/月
  年間削減: $23,844/年 = ¥3,576,600/年
  ペイバック: 12 日
  年間 ROI: ($23,844 - $800) / $800 ≒ 2,880%

【先週の BigQuery 最適化と合算】
  月次削減合計: ($1,987 + $862) = $2,849/月
  年間削減合計: $34,188 = ¥5,128,200/年

【実施優先順位】
  Week 1 (優先度 最高・リスク 低):
    ① Cloud Run cpu_idle=true → Terraform 1 行変更
       工数 0.5 人日 / ペイバック 4 日
    ② Cloud Storage lifecycle_rule 追加
       工数 1.0 人日 / ペイバック 8 日
  Week 2 (優先度 高・要判断):
    ③ GKE 1 年 CUD 契約(月末締め)+ Spot ノードプール追加
       工数 1.0 人日 + CUD 1 年コミット確認

【リスクと対策】
  Cloud Run: バックグラウンド処理の遅延リスク
    → DataDog で 1 週間 CPU 使用率モニタリングのうえ適用
  GKE CUD: 1 年契約解約不可
    → 7 ノードを 1 年確実に使用するか事業計画で確認
  GKE Spot: 中断リスク(バッチジョブのみ)
    → Argo Workflows の retry + checkpoint で対策済み
  Cloud Storage Coldline: 読み取りコスト高
    → 大量バッチ読み取り前にコスト試算(45 TB ≈ $2,304/回)

FinOps ダッシュボード設計

============================================================
FinOps ダッシュボード構成(Cloud Billing → BigQuery → Looker Studio)
============================================================

【セットアップ: Cloud Billing エクスポート】
  1. GCP Console > Billing > Export to BigQuery
  2. データセット: `project.billing_dataset`
  3. テーブル形式: `gcp_billing_export_v1_XXXXXX`

【ウィジェット構成】

  ① 月次コスト推移(サービス別・折れ線グラフ)
     - Cloud Run / GKE / BigQuery / Cloud Storage 各系列
     - 予算上限ライン(例: $5,000/月)をオーバーレイ

  ② 施策別削減効果トラッキング
     - 施策実施日を縦線でマーク
     - 実施前後 30 日の平均コストで Before/After 自動比較

  ③ コスト異常検知(前日比 / 前週比)
     - 前週比 20% 増加 → Slack #infra-alert 自動通知
     - Cloud Run CPU 課金 $50/日 超過 → 即時アラート

【集計 SQL(月次サービス別コスト)】
SELECT
  DATE_TRUNC(usage_start_time, MONTH)  AS month,
  service.description                  AS service,
  SUM(cost)                            AS total_cost,
  SUM(cost) - LAG(SUM(cost)) OVER (
    PARTITION BY service.description
    ORDER BY DATE_TRUNC(usage_start_time, MONTH)
  )                                    AS mom_diff  -- 前月差
FROM `project.billing_dataset.gcp_billing_export_v1_*`
WHERE DATE(usage_start_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH)
GROUP BY month, service
ORDER BY month DESC, total_cost DESC

【アラート SQL(前日比異常検知)】
WITH daily AS (
  SELECT
    DATE(usage_start_time)  AS usage_date,
    service.description     AS service,
    SUM(cost)               AS daily_cost
  FROM `project.billing_dataset.gcp_billing_export_v1_*`
  WHERE DATE(usage_start_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 14 DAY)
  GROUP BY usage_date, service
)
SELECT
  usage_date,
  service,
  daily_cost,
  LAG(daily_cost) OVER (PARTITION BY service ORDER BY usage_date) AS prev_day,
  ROUND((daily_cost - LAG(daily_cost) OVER (PARTITION BY service ORDER BY usage_date))
    / NULLIF(LAG(daily_cost) OVER (PARTITION BY service ORDER BY usage_date), 0) * 100, 1)
    AS pct_change
FROM daily
WHERE usage_date = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
HAVING ABS(pct_change) > 20   -- 20%以上の変化でアラート
ORDER BY ABS(pct_change) DESC

【Argo Workflows 日次コスト監視 CronWorkflow】
# schedule: "0 9 * * *"(毎朝 9:00 JST)
# 実行内容:
#   1. 上記アラート SQL を実行
#   2. 異常があれば Slack #infra-alert に投稿
#   3. 月次サマリーを月初に自動生成
#   4. CFO レポート(月次 PDF)を Cloud Storage に保存

ポイント解説

1 Cloud Run の cpu_idle はデフォルトが罠
google_cloud_run_v2_servicecpu_idle を指定しない場合、デフォルトは「CPU always-on」(= アイドル時も課金)になるバージョンが存在する。第 2 世代 Cloud Run は cpu_idle=true がデフォルトになりつつあるが、Terraform プロバイダや既存サービスの設定を明示的に確認すること。startup_cpu_boost=true との組み合わせでコールドスタートを短縮しながらコストを削減できる。
2 GKE Spot の taint 設定は安全装置
Spot ノードに taint: cloud.google.com/gke-spot=true:NoSchedule を設定することで、Spot を明示的に許容した Pod(toleration 設定済み)のみがスケジュールされる。本番 API が誤って Spot に乗り中断されるリスクを排除できる。Argo Workflows のバッチ Step に tolerations を設定することで、中断可能なジョブだけを Spot に誘導する設計が安全。
3 Cloud Storage Coldline の読み取りコストに注意
Coldline は保存コスト($0.004/GB/月)が安い代わりに、読み取り(データ取得)コストが $0.05/GB と Standard の 5 倍。45 TB を一括読み取りする場合は 46,080 × $0.05 = $2,304 の追加コストが発生する。月次バッチで全件読み取りが必要な場合は、Nearline($0.01/GB 読み取り)の方がトータルで安くなるケースもある。事前にアクセスパターンとコスト試算を行ってからクラスを選択すること。
4 FinOps は「見える化→最適化→ガバナンス」のサイクル
コスト削減は 1 回の施策で終わりではない。Cloud Billing を BigQuery にエクスポートし Looker Studio で可視化することで、施策効果のトラッキングと次の最適化機会の発見が自動化できる。前日比 20% 増加アラートで早期検知し、月次 CFO レポートで信頼を蓄積するサイクルを作ることが、継続的なコスト最適化文化の基盤となる。
5 証券マン視点: ペイバック 12 日・ROI 2,880% = 拒否できない投資
3 施策合計で 2.5 人日($800)の投資で年間 $23,844 のリターン。ROI 2,880% は S&P 500 長期期待リターン(約 10%)の 288 倍。「コスト削減」ではなく「$800 の投資で年間 $23,844 のキャッシュフロー改善、ペイバック 12 日」という投資案件として提案することで、CFO の承認を 1 回の会議で得られる。先週の BigQuery 最適化と合算すれば年間 ¥512 万円の効果で、これはエンジニア 1.5 人分の人件費相当。

実務への応用

  • Cloud Run 設定の即日確認コマンド: gcloud run services describe [SERVICE] --region asia-northeast1 --format='value(spec.template.metadata.annotations)'run.googleapis.com/cpu-throttling の現在値を確認。false なら即日 Terraform 修正推奨。PR を作り DataDog の CPU / レイテンシをモニタリングしながら段階的にロールアウト
  • GKE CUD の事前確認: gcloud compute commitments list --project=[PROJECT] で既存コミットメントを確認。新規 CUD 前に「向こう 12 ヶ月でこのノード構成を維持するか」をサービス責任者に確認し、念書(Slack スレッド)を残しておく。GKE Autopilot を使っている場合は CUD の概念が異なるため要確認
  • Cloud Storage 移行の段階確認: ライフサイクルルール適用後 7 日間は既存オブジェクトへの適用待ち。gsutil ls -L gs://[BUCKET]/[PATH] でストレージクラスの変更を確認。Coldline に移行後に大量バッチ読み取りが発生する場合は、前述の読み取りコスト試算を必ず実施
  • CFO レポートの自動化: 月次 Cloud Billing エクスポートから集計 SQL を実行 → Looker Studio のスケジュール配信で PDF を自動生成 → 月初 CFO に自動メール送付。「エンジニアが毎月手作業で作っている」という状況を脱し、データドリブンな意思決定文化を築く

今日のまとめ

Cloud Run cpu_idle=true でアイドル課金を 97% 削減($592/月)、GKE 本番ノード CUD 30% + バッチ Spot 75% 割引で $658/月削減、Cloud Storage アーカイブを Coldline に自動移行で $737/月削減——3 施策合計 $1,987/月・ペイバック 12 日・年間 ROI 2,880% を 2.5 人日で実現する。

FinOps の鉄則: リスク最小×ROI 最大の施策から着手(Cloud Run → GCS → GKE の順)、Cloud Billing を BigQuery に流して可視化・ガバナンスを自動化、CFO にはペイバック+年間 ROI+リスク対策の 3 点セットで「投資案件」として提案する

自己評価

自分の回答

気づき・メモ