E 会計/ファイナンス・コスト効率 — GKE Autopilot × Argo Workflows GCPコスト 48%削減設計

2026-06-05 (Day 60) 金曜 E: ファイナンス/コスト ★★★★☆ Spot Node / scale-to-zero / BQ パーティション剪定 $7,680 → $4,000 以下

概要

🎯

コストは「大きい順に攻める」が鉄則

Compute (42%) → BigQuery (33%) の2つで全体の75%。この2つを先に潰せば、残り施策は小粒でも目標達成できる。細かい最適化より大玉の順序が重要。

アイドル90%が最大の無駄

バッチ実行率9.4%のクラスターに常時2ノード課金。scale-to-zero + Spot Node で「使った時だけ払う」設計に変えると Compute コストが 97%削減できる。

📊

BigQuery は「スキャン量を削減する」が本質

クエリを速くするのではなく、読み取るデータ量を減らすことが重要。パーティション剪定で 500GB → 15GB(97%削減)。設計変更1つで月額 $2,483削減。

📈

8人日・ペイバック即日・年間ROI 6,900%

工数コスト 144,000円($960)で月額 $5,662削減。年間 $67K(約1,005万円)の節約。「投資した翌月から回収完了」という異例の高ROI施策。

問題

ECサイト MOps チームで運用している GKE Autopilot クラスター上の Argo Workflows(バッチ処理基盤)の月次 GCP コストが、過去3ヶ月で2.4倍($3,200 → $7,680/月)に膨張した。あなたはエンジニアとしてコスト構造を分析し、3ヶ月以内に月額を $4,000 以下(48%削減)に抑える施策を立案・試算せよ。

追加調査で判明した課題

  1. Argo Workflows: バッチジョブは1日3回(06:00 / 12:00 / 22:00 JST)のスケジュール実行。非実行時(21時間/日)もノードが2台スタンバイ
  2. BigQuery: dbt ジョブがパーティション剪定なし・FULL_TABLE_SCAN を多用。1ジョブあたり平均スキャン量 500GB($2.50/回 × 1,024回/月)
  3. Cloud Storage: ライフサイクルルールが未設定。90日超のログ/アーティファクトが計 3.2TB 蓄積(Nearline 以下に落とせる)
  4. Artifact Registry: イメージ世代管理なし。過去12ヶ月の全ビルドが Standard ストレージに残存
制約: エンジニア2名・工数上限 8人日、単価 6,000円/h、1 USD = 150円、GKE Autopilot 現状維持、本番バッチへの影響ゼロが必須
期待する回答形式: 施策別コスト試算(削減額)+ 優先順位付き実施計画(フェーズ)+ ROI試算 + リスクと対策

コスト内訳 (Before) — $7,680/月の構造

2.4倍膨張の原因は Compute のアイドル課金 + BigQuery フルスキャン の2点。この75%を先に潰す。
現状コスト内訳 — 問題だらけの設計
# GKE Autopilot ノード(Compute): $3,200/月 (42%)
#   バッチ実行中も常時2〜4ノード稼働
#   実行率: 2.25h/日 ÷ 24h = 9.4% ⚠️
#   アイドル課金: 90.6% = $2,899/月が無駄

# BigQuery オンデマンド: $2,560/月 (33%)
#   dbt ジョブ: FULL_TABLE_SCAN 500GB/回
#   $5/TB × 500GB × 1,024回/月 = $2,560 ⚠️
#   パーティション剪定なし

# Cloud Storage: $720/月 (9%)
#   削除ポリシーなし
#   90日超オブジェクト 3.2TB 蓄積 ⚠️

# Artifact Registry: $640/月 (8%)
#   古いイメージタグ削除されず
#   12ヶ月分のビルドが Standard 課金 ⚠️

# Pub/Sub + その他: $560/月 (7%)
#   不要メッセージ滞留・再配信

# ── 合計: $7,680/月 ──
# 3ヶ月前の2.4倍に膨張
目標コスト — 施策実施後
# GKE Autopilot(Spot Node + scale-to-zero): $90/月 ✅
#   アイドルコスト $0(ゼロスケール)
#   実行中のみ Spot Node 70%割引
#   $3,200 → $90(97%削減)

# BigQuery(パーティション剪定): $76.8/月 ✅
#   500GB/回 → 15GB/回(97%削減)
#   $5/TB × 15GB × 1,024回 = $76.8/月

# Cloud Storage(ライフサイクルポリシー): $700.8/月 ✅
#   90日超 → Nearline 移行で $19.2削減
#   TTL で将来の青天井防止

# Artifact Registry(クリーンアップポリシー): $590/月 ✅
#   最新5世代のみ保持 → $50削減
#   未タグ 7日削除で蓄積防止

# ── 施策後合計: ~$1,930/月 ──
# 目標: $4,000 以下 → ✅ 達成
# 削減額: $5,750/月(74.9%削減)
課題サマリー(4点)
1GKE Autopilot: アイドル90.6%でも常時課金 — 実行率9.4%のバッチに2ノード常時スタンバイ。scale-to-zero + Spot Node に変えれば $3,200 → $90(97%削減)の最大インパクト施策
2BigQuery: FULL_TABLE_SCAN で毎回500GB課金 — パーティション条件なし。WHERE 句にパーティションキーを追加するだけで 97%削減。dbt incremental + insert_overwrite で将来も防止
3Cloud Storage: ライフサイクルルール未設定で青天井 — 90日超オブジェクトを Nearline に移行 + TTL で蓄積防止。Coldline は最小保存期間 90日の早期削除料金に注意
4Artifact Registry: 12ヶ月分のイメージが Standard 課金 — クリーンアップポリシーで最新5世代のみ保持。初回一括削除 + 自動ポリシーで今後は蓄積しない設計

ヒント(段階的開示)

ヒント1 — 方向性
コスト削減は「大きい順に攻める」が鉄則。今回の内訳を見ると Compute (42%) → BigQuery (33%) → Storage (9%) の順にインパクトが大きい。最初にここに集中することで、少ない工数で目標削減額を達成できる。GKE Autopilot のノード代は「使っていない時間に払っている費用」が問題。Argo Workflows のスケジュール実行ならscale-to-zero + Spot Node が有効。
ヒント2 — 各施策の計算方針
  • Compute 削減: バッチ実行時間(3回 × 平均45分 = 2.25h/日)÷ 24h ≈ 9.4%が実作業。残り90.6%はアイドル。アイドル2台分を scale-to-zero で $0 に、実行中は Spot Node 70%割引
  • BigQuery 削減: 1ジョブ平均 500GB → パーティション剪定後 15GB(97%削減実績)。スキャン量削減 = $2.50/回 × 削減率 × 1,024回/月
  • Cloud Storage: 90日超オブジェクトを Nearline ($0.010/GB/月) に移行。Coldline ($0.004/GB/月) は90日未満アクセスで削除料金発生するため 90日超の安定データのみ
  • Artifact Registry: google_artifact_registry_cleanup_policy で最新5世代のみ保持。未タグ(ダングリング)は7日後自動削除
ヒント3 — 試算の骨格(ほぼ答え)
【Compute: scale-to-zero + Spot 試算】
現状: 2ノード常時稼働 = $3,200/月
実行中: 2.25h/日 × 30日 = 67.5h/月(実稼働率 9.4%)
アイドル: 722.5h/月 × 2ノード = 1,445h 無駄

Spot Node(バッチ用): 通常比 70%割引(控えめ想定)
scale-to-zero: アイドルコスト $0

改善後月額: $3,200 × 9.4% × 30% = $90
削減額: $3,200 - $90 = $3,110/月 ✅

【BigQuery: パーティション剪定試算】
現状: $5/TB × 500GB/回 × 1,024回/月 = $2,560/月
改善後: $5/TB × 15GB/回 × 1,024回 = $76.8/月
削減: $2,483.2/月(97%削減)✅

【Cloud Storage ライフサイクル移行】
対象: 3,200 GB × 0.6(90日超率)= 1,920 GB
移行前(Standard $0.020): $38.4/月
移行後(Nearline $0.010): $19.2/月
削減: $19.2/月 ✅

【Artifact Registry 削除】
削除対象: 500 GB(古世代イメージ)× $0.10/GB
削減: $50/月 ✅

合計削減: $3,110 + $2,483 + $19.2 + $50 = $5,662/月
削減後月額: $7,680 - $5,662 = $2,018/月
→ 目標 $4,000 以下 ✅ 達成(約74%削減)

BigQuery dbt 設計 — Bad vs Good(パーティション剪定)

FULL_TABLE_SCAN は BigQuery コスト最大の爆弾。WHERE 句でパーティションキーを絞るだけで97%削減できる。
Bad — パーティション条件なし FULL_TABLE_SCAN(500GB/回)
-- models/mart/mart_campaign_result.sql
-- 問題点:
-- 1. WHERE 句にパーティションキーなし
--    → 毎回 FULL_TABLE_SCAN: 500GB
--    → $5/TB × 500GB × 1,024回 = $2,560/月
-- 2. materialized='table' でフルリビルド
--    → インクリメンタル最適化なし
-- 3. SUM(revenue) に NULL ガードなし
--    → NULL が混入すると結果が NULL に

SELECT
    campaign_id,
    SUM(revenue) AS total_revenue  -- NULLリスク
FROM `project.dataset.orders`      -- パーティション条件なし!
WHERE campaign_id IS NOT NULL
GROUP BY 1
Good — incremental + パーティション剪定(15GB/回、97%削減)
-- models/mart/mart_campaign_result.sql
-- 改善点:
-- 1. incremental + insert_overwrite で差分のみ処理
-- 2. LOOKBACK_DAYS=3 でパーティション剪定
--    → 500GB → 15GB(97%削減)
-- 3. COALESCE で NULL 安全に集計
-- 4. cluster_by で GROUP BY 対象を最適化

{{ config(
    materialized='incremental',
    incremental_strategy='insert_overwrite',
    partition_by={
        'field': 'order_date',
        'data_type': 'date',
        'granularity': 'day'
    },
    cluster_by=['campaign_id']  -- GROUP BY 対象
) }}

{% set LOOKBACK_DAYS = 3 %}  {# 定数化: 変更容易 #}

SELECT
    DATE(created_at)            AS order_date,   -- パーティションキー
    campaign_id,
    COUNT(*)                    AS order_count,
    COALESCE(SUM(revenue), 0.0) AS total_revenue  -- NULL安全
FROM {{ ref('stg_orders') }}
{% if is_incremental() %}
-- パーティション剪定: 直近3日のみスキャン
WHERE DATE(created_at) >= DATE_SUB(
    CURRENT_DATE(), INTERVAL {{ LOOKBACK_DAYS }} DAY
)
{% endif %}
GROUP BY 1, 2
改善効果: スキャン量 500GB → 15GB(97%削減)。月額 $2,560 → $76.8(削減額 $2,483/月)。
dbt 1.8 Unit Tests を CI に組み込むことで、パーティション条件の抜けを自動検知できる。

コスト削減フロー図 — 施策別インパクト(SVG)

現状月額: $7,680/月 3ヶ月で2.4倍に膨張(Compute 42% + BQ 33% が主因) 施策1: GKE Autopilot Spot Node + scale-to-zero(工数: 2人日) バッチ実行率9.4%のクラスター → アイドルコスト$0、実行中のみ Spot 70%割引 tolerations: cloud.google.com/gke-spot × WorkflowTemplate Spot affinity ▼ $3,110 施策2: BigQuery パーティション剪定(dbt incremental insert_overwrite)(工数: 3人日) FULL_TABLE_SCAN 500GB/回 → WHERE 句でパーティションキー絞り → 15GB/回(97%削減) LOOKBACK_DAYS=3 + cluster_by=['campaign_id'] + COALESCE NULL安全 ▼ $2,483 施策3: Cloud Storage ライフサイクル(0.5人日) 90日超 → Nearline($0.020 → $0.010/GB) TTL 365日 → Coldline → 3年 → Delete ▼ $19.2 施策4: Artifact Registry クリーンアップ(0.5人日) 最新5世代 KEEP + 未タグ 7日自動削除 google_artifact_registry_cleanup_policy (Terraform) ▼ $50 施策1〜4後: $7,680 - $5,662 = $2,018/月 目標 $4,000 以下 ✅ 達成(削減率 73.7%) 工数合計 6人日(上限8人日以内) ROI 試算 — 「投資した翌月から回収完了」 工数コスト: 6日 × 8h × 6,000円 = 288,000円($1,920) 月次削減額: $5,662 × 150円 = 849,300円/月 ペイバック: 288,000 ÷ 849,300 ≈ 0.34ヶ月(≒ 10日) 年間削減額: $5,662 × 12 = $67,944(≒ 1,019万円) 年間ROI: 約 6,900%(288,000円投資で年間1,019万円削減)

模範解答

# argo-workflows/batch-workflow-template.yaml
# Argo WorkflowTemplate: Spot Node + 最小リソース要求
# GKE Autopilot は request 単位で課金されるため、最小化が重要

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: mops-batch-template
spec:
  # ── Spot Node を優先使用(バッチに最適) ──
  # Spot Node は24時間以内停止の可能性あり
  # → Argo は retryStrategy で自動再試行 → バッチと相性◎
  tolerations:
    - key: cloud.google.com/gke-spot
      operator: Equal
      value: "true"
      effect: NoSchedule

  affinity:
    nodeAffinity:
      # Spot を優先するが、なければ通常ノードでも起動
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 80
          preference:
            matchExpressions:
              - key: cloud.google.com/gke-spot
                operator: In
                values: ["true"]

  # Spot 停止時の自動再試行(最大3回)
  retryStrategy:
    limit: "3"
    retryPolicy: OnError  # エラー(Spot停止含む)時に再試行

  templates:
    - name: dbt-run
      resource:
        requests:
          # Autopilot は request 単位で課金 → 最小化が直接コスト削減
          cpu: "500m"
          memory: "1Gi"
        limits:
          cpu: "2"
          memory: "4Gi"
# 削減試算 — Compute
現状: 2ノード常時稼働 = $3,200/月
  アイドル時間: 21h/日 × 30日 × 2ノード = 1,260h
  実行時間: 2.25h/日 × 30日 = 67.5h(全体の9.4%)

改善後:
  scale-to-zero:  アイドルコスト $0(Autopilot のデフォルト動作)
  Spot Node 割引: 70%(控えめ想定)
  実行コスト: $3,200 × 9.4% × 30% = $90/月

削減額: $3,200 - $90 = $3,110/月 ✅(97%削減)
-- models/mart/mart_campaign_result.sql
-- パーティション剪定 + incremental で 97%コスト削減
{{ config(
    materialized='incremental',
    incremental_strategy='insert_overwrite',
    partition_by={
        'field': 'order_date',
        'data_type': 'date',
        'granularity': 'day'
    },
    cluster_by=['campaign_id']  -- GROUP BY 対象カラムでクラスタリング
) }}

{% set LOOKBACK_DAYS = 3 %}  {# 遅延データ考慮: 3日窓 #}

SELECT
    DATE(created_at)            AS order_date,   -- パーティションキー
    campaign_id,
    COUNT(*)                    AS order_count,
    COALESCE(SUM(revenue), 0.0) AS total_revenue  -- NULL安全: SUM(NULL)=NULL を防ぐ
FROM {{ ref('stg_orders') }}
{% if is_incremental() %}
-- パーティション剪定: 直近3日のみスキャン(500GB → 15GB)
WHERE DATE(created_at) >= DATE_SUB(
    CURRENT_DATE(), INTERVAL {{ LOOKBACK_DAYS }} DAY
)
{% endif %}
GROUP BY 1, 2
-- INFORMATION_SCHEMA でジョブ別スキャン量監視
-- 「コスト爆弾ジョブ」を早期に特定するための日次クエリ
SELECT
  job_id,
  user_email,
  query,
  ROUND(total_bytes_processed / POW(1024, 4), 3) AS scanned_tb,
  ROUND(total_bytes_processed / POW(1024, 4) * 5, 2) AS cost_usd,
  creation_time
FROM `project.region-asia-northeast1`.INFORMATION_SCHEMA.JOBS
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND job_type = 'QUERY'
ORDER BY total_bytes_processed DESC
LIMIT 20;
# 削減試算 — BigQuery
現状: $5/TB × 500GB/回 × 1,024回/月 = $2,560/月

改善後:
  スキャン量: 500GB → 15GB(97%削減)
  月額: $5/TB × 15GB/回 × 1,024回 = $76.8/月

削減額: $2,560 - $76.8 = $2,483.2/月 ✅(97%削減)
// terraform/storage_lifecycle.tf
resource "google_storage_bucket" "argo_artifacts" {
  name     = "mops-argo-artifacts"
  location = "ASIA-NORTHEAST1"

  // 90日超 → Nearline に移行(アクセス頻度低下後)
  lifecycle_rule {
    action {
      type          = "SetStorageClass"
      storage_class = "NEARLINE"
    }
    condition {
      age                   = 90  # 日数
      matches_storage_class = ["STANDARD"]
    }
  }

  // 365日超 → Coldline へ(ほぼアクセスなし)
  // 注意: Coldline は最小保存期間 90日。90日未満で削除すると
  //       早期削除料金が発生するため、長期保存データにのみ適用
  lifecycle_rule {
    action {
      type          = "SetStorageClass"
      storage_class = "COLDLINE"
    }
    condition {
      age                   = 365
      matches_storage_class = ["NEARLINE"]
    }
  }

  // 3年超は削除(監査ログは別途 GCS Audit Log へ)
  lifecycle_rule {
    action { type = "Delete" }
    condition {
      age = 1095  # 3年 = 365 × 3
    }
  }
}
# 削減試算 — Cloud Storage
対象オブジェクト: 3,200 GB × 0.6(90日超率)= 1,920 GB

移行前(Standard $0.020/GB): 1,920 × $0.020 = $38.4/月
移行後(Nearline $0.010/GB): 1,920 × $0.010 = $19.2/月
削減: $19.2/月 ✅

TTL 1095日設定: 3年後に削除 → 長期的な青天井蓄積防止
将来月次削減(TTL効果): 毎月追加される90日超分が順次削減
// terraform/artifact_registry.tf
// クリーンアップポリシー: 最新5世代 KEEP + 残りは DELETE
resource "google_artifact_registry_cleanup_policy" "keep_latest_5" {
  project    = var.project_id
  location   = "asia-northeast1"
  repository = "mops-images"
  policy_id  = "keep-latest-5"

  action = "DELETE"

  // 最新5件を KEEP し、残りを削除
  most_recent_versions {
    keep_count = 5  # 最新5世代を保持
  }
}

// 未タグ(ダングリング)イメージは7日後に削除
resource "google_artifact_registry_cleanup_policy" "delete_untagged" {
  project    = var.project_id
  location   = "asia-northeast1"
  repository = "mops-images"
  policy_id  = "delete-untagged-7d"

  action = "DELETE"

  condition {
    tag_state  = "UNTAGGED"
    older_than = "604800s"  # 7日 = 7 × 24 × 3600
  }
}
# 既存の古いイメージを即時一括削除(初回クリーンアップ)
# 30日以上前のイメージを全削除
gcloud artifacts docker images list \
  asia-northeast1-docker.pkg.dev/${PROJECT_ID}/mops-images \
  --format="get(version)" \
  --filter="createTime < $(date -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ)" \
  | xargs -I{} gcloud artifacts docker images delete {} --quiet
# 削減試算 — Artifact Registry
削除対象: 500 GB(古世代イメージ)
Standard ストレージ単価: $0.10/GB/月

削減: 500 × $0.10 = $50/月 ✅
クリーンアップポリシーで今後の蓄積も自動防止
━━ リスクマトリクス(発生確率 × 影響度)━━

【高優先度: 即対応】

リスク①: Spot Node 停止でバッチが中断する
  発生確率: 中(Spot は24時間以内停止の可能性)
  影響: 大(本番バッチ失敗 → ビジネス影響)
  対策:
    - retryStrategy: limit=3, retryPolicy=OnError を全テンプレートに設定
    - バッチ完了チェック: Argo のアラート設定(DataDog で失敗通知 5分以内)
    - フォールバック: 朝06:00バッチは通常ノードで実行(重要度最大)
    - 段階展開: 最初は夜間 22:00 バッチのみ Spot に移行して検証

リスク②: BigQuery パーティション設計変更でジョブが失敗する
  発生確率: 中(dbt model の変更は既存ダウンストリームへの影響)
  影響: 大(mart テーブルが空になると Looker Studio がエラー)
  対策:
    - dbt test を CI(GitHub Actions)に追加
    - --full-refresh を staging 環境で先行実行・確認
    - ダウンストリーム依存 (ref()) を一覧化してから変更開始

【中優先度: Phase 2 以降で対応】

リスク③: Cloud Storage ライフサイクル移行後にデータ取り出し料金
  Nearline は 30日以内の削除で早期削除料金発生
  対策: 90日超データのみ移行条件に設定(条件を厳しくして確実に防ぐ)

リスク④: Artifact Registry クリーンアップで本番イメージが削除される
  対策: prod タグを別リポジトリに分離、または keep_count=10 で保守的に開始

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ROI試算 & フェーズ計画

施策まとめ

施策削減額/月工数優先度
1. Spot Node + scale-to-zero$3,1102人日最優先
2. BQ パーティション剪定$2,4833人日最優先
3. Cloud Storage ライフサイクル$19.20.5人日
4. Artifact Registry クリーンアップ$500.5人日
合計$5,662.2/月6人日(上限8人日以内)
削減後月額: $7,680 - $5,662 = $2,018/月(目標 $4,000 以下 ✅ 達成)
余力: 工数 6人日消化(上限8人日の75%)。残り2人日で Pub/Sub 最適化・Cloud Logging フィルタリングに充当可能

ROI試算

初期工数コスト:
  6日 × 8時間 × 6,000円 = 288,000円(= $1,920)

月次削減額:
  $5,662 × 150円 = 849,300円/月(= $5,662)

ペイバック期間:
  288,000 ÷ 849,300 ≈ 0.34ヶ月(≒ 10日)

年間削減額:
  $5,662 × 12 = $67,944(≒ 1,019万円)

年間ROI:
  (849,300 × 12 - 288,000) / 288,000 × 100 ≈ 6,900%

フェーズ計画(3ヶ月)

Phase 1(Week 1〜2, 2人日): Spot Node 移行 — 即効性・リスク最小
  Day 1-2:
    - 夜間22:00バッチのみ Spot 移行(最低影響のバッチで検証)
    - retryStrategy: limit=3 を全テンプレートに設定
    - DataDog アラート: バッチ失敗を5分以内に通知
    - 効果確認: 翌週のコスト請求書で $2,000+ 削減を確認
  Week 2末:
    - 問題なければ 06:00, 12:00 バッチも Spot 移行
    - 効果: 月額 $3,110 削減

Phase 2(Week 2〜4, 3人日): BigQuery dbt 設計変更
  Day 1: INFORMATION_SCHEMA でスキャン量 TOP 10 ジョブ特定
  Day 2-3: dbt モデルに partition_by + incremental 追加
          CI で dbt test 実行確認(GitHub Actions)
  Day 4: staging 環境で --full-refresh 実行・結果検証
  Day 5(予備): 本番適用 → コスト確認
  効果: 月額 $2,483 削減

Phase 3(Week 4, 1人日): Storage / Registry 整備
  Cloud Storage: terraform apply でライフサイクルルール追加
  Artifact Registry: クリーンアップポリシー + 初回一括削除
  効果: 月額 $69.2 削減

合計: 6人日 / ペイバック10日 / 年間ROI 6,900%

ポイント解説

1 「コストは大きい順に攻める」が鉄則
今回は Compute (42%) + BigQuery (33%) = 75%がターゲット。この2つで $5,593削減(全体削減の99%)を達成できる。Storage ($19) や Registry ($50) は重要だが、先に大玉を潰してから取り掛かることで、工数対効果が最大化できる。細かい最適化より優先順位の設計が重要。
2 Spot Node はバッチ処理に最適・Web API には不向き
Spot Node(旧 Preemptible)は24時間以内に停止する可能性があるが、Argo Workflows は retryStrategy でタスク単位の自動再試行ができる。そのためバッチ処理との相性が極めて良い。Web API や常時稼働サービス(可用性99.9%要件)には Spot を使わないこと。
3 BigQuery は「スキャン量を削減する」がコスト最適化の本質
クエリを速くするのではなく、読み取るデータ量を減らすことが重要。パーティション剪定(WHERE 句でパーティションキーを絞る)+ クラスタリング(GROUP BY 対象カラム)の組み合わせが最も効果的。INFORMATION_SCHEMA.JOBS でスキャン量を監視し、爆弾ジョブを早期発見する習慣をつけること。
4 Cloud Storage: Coldline の最小保存期間(90日)に注意
Coldline は $0.004/GB/月と安価だが、90日未満で削除すると早期削除料金が発生する。ログを30日で削除したい場合は Standard のまま Delete する方が安い。Nearline→Coldline の移行は「1年以上アクセスしない長期アーカイブ」に限定すること。
5 ROI はステークホルダー別に変換して伝える
エンジニアには「ペイバック10日」、CFO には「年間ROI 6,900%」、CTO には「6人日で月額 $5,662削減・年間1,019万円」と変換することで承認を得やすくなる。特にペイバック期間が1ヶ月以内の施策は「やらない理由がない」水準のシグナルとして経営層に伝わりやすい。

実務への応用

  • MOps/販促システム直結: Argo Workflows バッチは現職の技術スタックそのもの。Spot Node への移行は「本番バッチが止まらないか」の懸念があるが、Argo の retryStrategy を設定しておけば Spot 停止時に自動再試行できる。段階的移行(夜間バッチのみ → 全バッチ)でリスクを分散する
  • BigQuery コスト監視の自動化: INFORMATION_SCHEMA.JOBS を日次クエリして「スキャン量 TOP 10 ジョブ」を Slack 通知する Argo ジョブを追加すると、コスト膨張を早期検知できる。3ヶ月で2.4倍膨張も早期アラートがあれば対処できた
  • GKE Autopilot の課金構造: Autopilot は request 単位でノードを動的プロビジョニングするため、resource.requests を最小化することが直接コスト削減になる。limit は余裕を持たせつつ、requests を実測値ベースで絞ることが重要
  • 証券マン視点でのコスト判断: 「今の月額 $7,680 × 12 = 年間 $92K」を「削減後 $2,018 × 12 = 年間 $24K」と比較すると、6人日の工数(288,000円)で年間 $68K(≒1,020万円)削減できる。IRR で見ると「初日に投資して10日で回収」なので投資価値は自明
  • 次の発展問題: GKE Autopilot の Spot Node 停止率を 5%/10%/20% と変えた場合の期待バッチ完了時間とコストのトレードオフ試算。BQ Reservations(オンデマンド vs 月次コミット vs 年次コミット)の損益分岐点計算

今日のまとめ

GCP コスト削減は「Compute と BigQuery という大玉から順に攻める」ことで、6人日の工数で月額 73.7%削減・ペイバック10日・年間ROI 6,900%という異例の高効率改善を実現できる。

Argo Workflows × GKE の構成では Spot Node + scale-to-zero がアイドルコスト(全体の90%)を根本解決し、BigQuery では パーティション剪定(WHERE 句でパーティションキーを絞るだけ)でスキャン量を97%削減する設計変更が最大のレバレッジになる。コスト最適化の本質は「使っていない時間に払っていたお金をゼロにする」設計思想。

自己評価

自分の回答

気づき・メモ