概要
コストは「大きい順に攻める」が鉄則
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%削減)に抑える施策を立案・試算せよ。
追加調査で判明した課題
- Argo Workflows: バッチジョブは1日3回(06:00 / 12:00 / 22:00 JST)のスケジュール実行。非実行時(21時間/日)もノードが2台スタンバイ
- BigQuery: dbt ジョブがパーティション剪定なし・
FULL_TABLE_SCANを多用。1ジョブあたり平均スキャン量 500GB($2.50/回 × 1,024回/月) - Cloud Storage: ライフサイクルルールが未設定。90日超のログ/アーティファクトが計 3.2TB 蓄積(Nearline 以下に落とせる)
- Artifact Registry: イメージ世代管理なし。過去12ヶ月の全ビルドが Standard ストレージに残存
制約: エンジニア2名・工数上限 8人日、単価 6,000円/h、1 USD = 150円、GKE Autopilot 現状維持、本番バッチへの影響ゼロが必須
期待する回答形式: 施策別コスト試算(削減額)+ 優先順位付き実施計画(フェーズ)+ ROI試算 + リスクと対策
期待する回答形式: 施策別コスト試算(削減額)+ 優先順位付き実施計画(フェーズ)+ 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 に組み込むことで、パーティション条件の抜けを自動検知できる。
dbt 1.8 Unit Tests を CI に組み込むことで、パーティション条件の抜けを自動検知できる。
コスト削減フロー図 — 施策別インパクト(SVG)
模範解答
# 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,110 | 2人日 | 最優先 |
| 2. BQ パーティション剪定 | $2,483 | 3人日 | 最優先 |
| 3. Cloud Storage ライフサイクル | $19.2 | 0.5人日 | 中 |
| 4. Artifact Registry クリーンアップ | $50 | 0.5人日 | 中 |
| 合計 | $5,662.2/月 | 6人日 | (上限8人日以内) |
削減後月額: $7,680 - $5,662 = $2,018/月(目標 $4,000 以下 ✅ 達成)
余力: 工数 6人日消化(上限8人日の75%)。残り2人日で Pub/Sub 最適化・Cloud Logging フィルタリングに充当可能
余力: 工数 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) は重要だが、先に大玉を潰してから取り掛かることで、工数対効果が最大化できる。細かい最適化より優先順位の設計が重要。
今回は Compute (42%) + BigQuery (33%) = 75%がターゲット。この2つで $5,593削減(全体削減の99%)を達成できる。Storage ($19) や Registry ($50) は重要だが、先に大玉を潰してから取り掛かることで、工数対効果が最大化できる。細かい最適化より優先順位の設計が重要。
2
Spot Node はバッチ処理に最適・Web API には不向き
Spot Node(旧 Preemptible)は24時間以内に停止する可能性があるが、Argo Workflows は
Spot Node(旧 Preemptible)は24時間以内に停止する可能性があるが、Argo Workflows は
retryStrategy でタスク単位の自動再試行ができる。そのためバッチ処理との相性が極めて良い。Web API や常時稼働サービス(可用性99.9%要件)には Spot を使わないこと。
3
BigQuery は「スキャン量を削減する」がコスト最適化の本質
クエリを速くするのではなく、読み取るデータ量を減らすことが重要。パーティション剪定(WHERE 句でパーティションキーを絞る)+ クラスタリング(GROUP BY 対象カラム)の組み合わせが最も効果的。
クエリを速くするのではなく、読み取るデータ量を減らすことが重要。パーティション剪定(WHERE 句でパーティションキーを絞る)+ クラスタリング(GROUP BY 対象カラム)の組み合わせが最も効果的。
INFORMATION_SCHEMA.JOBS でスキャン量を監視し、爆弾ジョブを早期発見する習慣をつけること。
4
Cloud Storage: Coldline の最小保存期間(90日)に注意
Coldline は $0.004/GB/月と安価だが、90日未満で削除すると早期削除料金が発生する。ログを30日で削除したい場合は Standard のまま Delete する方が安い。Nearline→Coldline の移行は「1年以上アクセスしない長期アーカイブ」に限定すること。
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ヶ月以内の施策は「やらない理由がない」水準のシグナルとして経営層に伝わりやすい。
エンジニアには「ペイバック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%削減する設計変更が最大のレバレッジになる。コスト最適化の本質は「使っていない時間に払っていたお金をゼロにする」設計思想。
Argo Workflows × GKE の構成では Spot Node + scale-to-zero がアイドルコスト(全体の90%)を根本解決し、BigQuery では パーティション剪定(WHERE 句でパーティションキーを絞るだけ)でスキャン量を97%削減する設計変更が最大のレバレッジになる。コスト最適化の本質は「使っていない時間に払っていたお金をゼロにする」設計思想。