概要
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 から「コスト最適化の余地を定量的に示してほしい」と依頼があった。以下の現状構成をもとに:
- 各サービス(Cloud Run / GKE / Cloud Storage)の Bad→Good コスト試算を行い、施策別削減額を算出せよ
- 施策を ROI × リスク で優先順位付けし、4 人日以内の実施計画を示せよ
- CFO 向け提案サマリー(投資額・月次削減・ペイバック・年間 ROI・リスク)を作成せよ
- FinOps ダッシュボードで継続的なコスト監視の設計を示せよ
与件(GCP インフラ構成)
| サービス | 現状 | 問題点 |
|---|---|---|
| Cloud Run v2 × 8 | CPU 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 コスト構造 — 最適化前の 3 つの問題
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/月
# ───────────────────────────────────
cpu_idle=true に変更するだけで処理時のみ課金になり、97% 削減可能。コード変更・デプロイ不要。ヒント(段階的開示)
ヒント1 — 方向性
ヒント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点)
| # | 問題点 | 分類 | 改善方法 | 削減額 | リスク |
|---|---|---|---|---|---|
| 1 | Cloud Run CPU always-on(アイドル時課金) | コスト/設定 | cpu_idle=true(Terraform 1 行) | $592/月 | 低(コード変更不要) |
| 2 | GKE 全ノードオンデマンド(CUD/Spot 未使用) | コスト/契約 | 7 ノード CUD + 3 ノード Spot | $658/月 | 中(1 年契約拘束) |
| 3 | Cloud Storage 全 Standard(アーカイブ含む) | コスト/設定 | lifecycle_rule Coldline 自動移行 | $737/月 | 低(読み取りコスト注意) |
コスト構造図 — Bad vs Good(3 施策)
施策別 ROI 比較 — リスク × 削減額マトリクス
模範解答
Cloud Run: cpu_idle=true でアイドル課金を撲滅
# 問題: 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/月
# ✅ 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 段構え
# ❌ 全ノードオンデマンド(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/月
# ✅ 本番 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 移行
# ❌ ライフサイクルルールなし(全データ 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/月 のムダ
# ✅ ライフサイクルルール: 自動クラス移行
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 に保存
ポイント解説
google_cloud_run_v2_service で cpu_idle を指定しない場合、デフォルトは「CPU always-on」(= アイドル時も課金)になるバージョンが存在する。第 2 世代 Cloud Run は cpu_idle=true がデフォルトになりつつあるが、Terraform プロバイダや既存サービスの設定を明示的に確認すること。startup_cpu_boost=true との組み合わせでコールドスタートを短縮しながらコストを削減できる。
Spot ノードに
taint: cloud.google.com/gke-spot=true:NoSchedule を設定することで、Spot を明示的に許容した Pod(toleration 設定済み)のみがスケジュールされる。本番 API が誤って Spot に乗り中断されるリスクを排除できる。Argo Workflows のバッチ Step に tolerations を設定することで、中断可能なジョブだけを Spot に誘導する設計が安全。
Coldline は保存コスト($0.004/GB/月)が安い代わりに、読み取り(データ取得)コストが $0.05/GB と Standard の 5 倍。45 TB を一括読み取りする場合は 46,080 × $0.05 = $2,304 の追加コストが発生する。月次バッチで全件読み取りが必要な場合は、Nearline($0.01/GB 読み取り)の方がトータルで安くなるケースもある。事前にアクセスパターンとコスト試算を行ってからクラスを選択すること。
コスト削減は 1 回の施策で終わりではない。Cloud Billing を BigQuery にエクスポートし Looker Studio で可視化することで、施策効果のトラッキングと次の最適化機会の発見が自動化できる。前日比 20% 増加アラートで早期検知し、月次 CFO レポートで信頼を蓄積するサイクルを作ることが、継続的なコスト最適化文化の基盤となる。
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 に自動メール送付。「エンジニアが毎月手作業で作っている」という状況を脱し、データドリブンな意思決定文化を築く
今日のまとめ
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 点セットで「投資案件」として提案する。