PCD 合格対策

運用・SRE 深掘り

Google SRE Book / Workbook 準拠 — GCP サービスで実装する SRE プラクティス

SLO
信頼性目標
FinOps
コスト最適化
Toil
削減対象
Postmortem
学習サイクル
🎯 このページの位置づけ PCD 試験範囲は Section 1〜4 ですが、実務では運用・SRE プラクティスが品質を決めます。本ページは Google SRE Book / Workbook の考え方を GCP サービスで実装する方法に焦点を当て、設計時に組み込むべき SRE 観点を整理します。試験対策としても「最も信頼性が高い・最もコスト効率が良い」選択肢を判断する根拠になります。

1. SLO / SLI / Error Budget

4 つの Golden Signals(Google SRE Book)

サービスの健全性を測る基本指標。これを満たさない監視は SRE 的に不完全です。

① Latency(レイテンシ)

リクエスト処理時間。成功と失敗を分離して測定することが肝心。失敗が速いと全体平均が良く見える錯覚。

p50 / p95 / p99 で分布を見る

② Traffic(トラフィック)

需要の量。HTTP RPS、Pub/Sub メッセージ/秒、DB クエリ/秒など。サービスごとに「需要」の単位を定義。

Cloud Monitoring の組込メトリクス

③ Errors(エラー)

失敗率。明示的失敗(5xx)、暗黙的失敗(200 OK だがコンテンツが空)、ポリシー違反(レイテンシ超過)。

Error Reporting + ログクエリ

④ Saturation(飽和度)

リソースがどれだけ使われているか。CPU 80% を超えると応答悪化、メモリ 90% で OOM 危険、コネクションプール 80% で枯渇間近。

Cloud Monitoring + Profiler
✅ 4 Golden Signals を測る GCP マッピング
  • Latency: Cloud Run の run.googleapis.com/request_latencies、GKE の Pod 単位レイテンシ、Cloud Trace の span 分布
  • Traffic: Cloud Run の request_count、Pub/Sub の send_message_operation_count
  • Errors: Cloud Run の request_count{response_code_class="5xx"}、Error Reporting
  • Saturation: container/cpu/utilization、メモリ、ネットワーク、DB プール使用率(カスタムメトリック)

SLI の設計:Request-based vs Windows-based

Request-based SLI 「リクエストの何%が要件を満たしたか」 SLI = good_requests / total_requests 例: - p95 latency < 200ms のリクエスト割合 - HTTP 2xx/3xx を返したリクエスト割合 - Pub/Sub の ack を返したメッセージ割合 ✓ 個別リクエスト中心のサービス向け ✗ 短期スパイクで悪化を捉えにくい Windows-based SLI 「測定期間の何%が品質基準を満たしたか」 SLI = good_windows / total_windows 例: - 5分間の p95 latency < 200ms の window 割合 - 10分間の error rate < 1% の window 割合 - DB 接続成功率 99% の 1分 window 割合 ✓ 短時間の劣化スパイク検知 ✗ window 内の特異値が無視される
図1: Request-based は粒度細かく、Windows-based は時間窓で劣化を検知。両方を併用するのが理想。

具体的な SLI 例(公開向け Web サービス)

カテゴリSLI 定義SLO 目標例
Availability(2xx + 3xx + 401 + 403 + 404) / total_requests99.9% / 月
Latencyrequests_with_latency_under_200ms / total_requests95% / 月
Throughputrequests_per_second がしきい値以上1000 RPS
Freshness (バッチ)data_age_under_1h / total_checks99% / 日
Correctnesspassed_data_quality_checks / total_checks99.95%
Coverageprocessed_records / total_records99.99%
SLI の選び方の罠
  • 4xx を全部失敗扱いするのは誤り。401(認証ミス)/ 404(存在しない)はユーザー責任なので分母から除外、または 2xx と同等の「成功」扱い
  • p99 だけ見ない。p99 は外れ値に振られすぎる。p50 / p95 / p99 をセットで
  • 平均レイテンシは無意味。1リクエストが 10秒、残り 99 が 100ms → 平均 199ms(実態を反映しない)
  • サンプリングなしで全リクエスト計測はコスト爆発。トレースは 1〜10% サンプリング推奨

Error Budget Policy

Error Budget = 許容できる失敗の量。SLO 99.9% なら 0.1% の失敗予算がある。

Error Budget の計算(30日間) SLO: 99.9% 達成期間 Error Budget: 0.1% 月間 720h のうち 719.28h 43分 12秒 SLO 別 月間ダウンタイム許容 99% (2 nines) 7時間 12分 99.5% 3時間 36分 99.9% (3 nines) 43分 99.95% 21分 99.99% (4 nines) 4分 18秒
図2: SLO の「nines」が増えるごとに許容ダウンタイムが激減。99.99% は実装コストが非常に高い。

Error Budget Policy の実例

# Error Budget Policy(例)

service: my-api
slo: 99.9%
compliance_period: 30days_rolling

actions:
  - condition: budget_remaining >= 50%
    actions:
      - 新機能リリース継続
      - 通常の運用

  - condition: budget_remaining < 50% AND >= 25%
    actions:
      - リリース速度を半減(週2回 → 週1回)
      - リリースごとに staging で 24時間試験
      - エンジニアリングマネージャーに報告

  - condition: budget_remaining < 25%
    actions:
      - 機能リリースを停止
      - 信頼性向上タスクに 100% 注力
      - 失敗の根本原因分析を実施
      - SRE と Dev で原因対策会議

  - condition: budget_exhausted (< 0%)
    actions:
      - 緊急リリースのみ許可(バグ修正・セキュリティパッチ)
      - インシデントレビューを CTO に報告
      - 翌期の SLO を見直す可能性

Multi-Burn-Rate Alert

「Error Budget の消費速度(Burn Rate)」でアラートする方式。Google SRE Workbook 推奨。

📘 Burn Rate とは

Burn Rate = 期間内に消費する Error Budget の割合 ÷ 期間 / Compliance Period

  • Burn Rate = 1.0 → 30日かけてちょうど Budget を使い切るペース(許容範囲)
  • Burn Rate = 2.0 → 15日で使い切るペース(要注意)
  • Burn Rate = 14.4 → 5時間で使い切るペース(緊急)

Multi-burn-rate アラート設計

重要度Burn Rate 閾値長期 window短期 window意味
Page (CRITICAL)14.4 倍1時間5分2% の予算を 1時間で消費 → 即対応
Page (HIGH)6 倍6時間30分5% の予算を 6時間で消費 → 業務時間内
Ticket (MEDIUM)1 倍3日6時間10% の予算を 3日で消費 → 翌日対応
Ticket (LOW)1 倍30日1日緩やかな budget burn → 改善計画
# Cloud Monitoring の SLO アラート例
displayName: "SLO Burn Rate - CRITICAL (page)"
combiner: AND
conditions:
  - displayName: "Burn rate > 14.4 over last 1h"
    conditionThreshold:
      filter: |
        select_slo_burn_rate("projects/PROJECT/services/SERVICE/serviceLevelObjectives/SLO",
        "3600s")
      comparison: COMPARISON_GT
      thresholdValue: 14.4
      duration: 0s

  - displayName: "Burn rate > 14.4 over last 5m"
    conditionThreshold:
      filter: |
        select_slo_burn_rate("projects/PROJECT/services/SERVICE/serviceLevelObjectives/SLO",
        "300s")
      comparison: COMPARISON_GT
      thresholdValue: 14.4
      duration: 0s

notificationChannels:
  - projects/PROJECT/notificationChannels/PAGERDUTY_CHANNEL
なぜ Multi-burn-rate?
  • 長期 window 単独: 短期スパイクを見逃す
  • 短期 window 単独: ノイズで頻繁発火(Alert Fatigue)
  • 両方の AND 条件: 「短期に発火 + 長期トレンドでも継続」で本物の異常を捕捉

2. FinOps(コスト最適化)

FinOps 原則と GCP の構造

FinOps は「クラウド支出をビジネス価値に紐付けて運用する文化」。CFO / Engineering / Product の三者が責任を共有。

① Inform(可視化)

誰が・何に・いくら使っているかを可視化。Cloud Billing Cost Allocation、ラベル戦略、BigQuery export でダッシュボード。

② Optimize(最適化)

Right-sizing、CUD、Spot VM、ストレージクラス、ログ Exclusion など。SLO を満たす最小コストを目標。

③ Operate(運営)

Budget Alert、Anomaly Detection、コストレビューを継続的に。四半期ごとのコスト棚卸しを定例化。

GCP のコスト構造(主要サービス)

サービス主な課金要素最適化レバー
Cloud RunvCPU × メモリ × 時間 + リクエスト数min/max instances、concurrency、CPU always-on の必要性検討
GKE Standardノード VM(CPU/メモリ/ディスク)+ Cluster Mgmt $0.10/hCUD、Spot VM、Cluster Autoscaler、VPA、ノードプール分割
GKE AutopilotPod の requests(vCPU/メモリ/ストレージ)VPA で requests を実測値に最適化、不要 Pod の削除
Compute EngineVM 時間 + ディスク + ネット egressCUD、Spot、適切なマシンファミリー(E2/N2/N4)
Cloud Storageストレージクラス × バイト × 月 + API + egressLifecycle policy で Standard → Nearline → Coldline → Archive
BigQueryストレージ + スキャン量(オンデマンド)or Slot(Editions)Partition + Cluster、マテビュー、BI Engine、Editions 予約
Cloud Logging取り込み量 ($0.5/GB) + 保管Exclusion Filter、Sink、retention 短縮
Cloud Monitoringカスタムメトリクスのデータポイント数cardinality 削減、サンプリング、不要メトリクス削除
Network egressリージョン跨ぎ + インターネット egress(GB 単価)CDN、リージョン内通信、Cloud Interconnect

Budgets と Anomaly Detection

# Cloud Billing Budget 作成(CLI)
gcloud billing budgets create \
  --billing-account=BILLING_ACCOUNT_ID \
  --display-name="Production Monthly Budget" \
  --budget-amount=10000USD \
  --filter-projects="projects/prod-project" \
  --threshold-rule=percent=0.5 \
  --threshold-rule=percent=0.9 \
  --threshold-rule=percent=1.0 \
  --threshold-rule=percent=1.5,basis=forecasted-spend \
  --notifications-rule-pubsub-topic="projects/PROJECT/topics/budget-alerts" \
  --notifications-rule-monitoring-notification-channels="projects/PROJECT/notificationChannels/SLACK"
Budget Alert 設計のベストプラクティス
  1. 実績 + 予測の両方でしきい値を設定(50% / 90% / 100% 実績 + 150% 予測)
  2. Pub/Sub 通知で自動アクション(特定 SA を一時無効化、Cloud Function でアラートエスカレーション)
  3. 環境別(dev / staging / prod)に別 Budget
  4. 機密度高いサービス(Spanner、BigQuery)は個別 Budgetでモニタ
  5. Budget = 自動制限ではない。通知だけ。自動停止には Cloud Function + 課金 API 連携が必要
Budget Alert の落とし穴
  1. Budget は支出を自動制限しない。本当に「コスト爆発を止めたい」なら、Cloud Function で cloudbilling.disableBillingForProject を呼ぶ仕組みを別途構築(注意:本番停止と同義)
  2. 反映遅延 1〜2日。Cloud Billing のレポートは遅延する。Cost Anomaly Detection の方が早い
  3. SAVINGS(割引・クレジット)を含む計算は意図しない閾値超過を起こす
  4. クラウドからの請求は月初 2日に前月分が確定する。月末 1日のスパイクで翌月 Budget が一気に消費されたように見える錯覚

Cost Anomaly Detection(コスト異常検知)

過去パターンから「異常な支出増加」を機械学習で検知。Cloud Billing の Reports 内で有効化。

Committed Use Discount (CUD) / Spot VM

Spot VM

  • 標準 VM の最大 91% 割引
  • Google が必要時にプリエンプション(強制停止)
  • 30秒前に SIGTERM 通知
  • SLA 対象外
耐障害性のあるバッチ・分析ワークロード

FlexCUD(柔軟な CUD)

  • マシンファミリーをまたいで適用可能
  • 地域跨ぎでも一部適用
  • 従来 CUD より柔軟、割引率は若干低い
ワークロードが変動するチーム向け

Spot VM の活用パターン

# GKE での Spot ノードプール
apiVersion: v1
kind: Node
metadata:
  labels:
    cloud.google.com/gke-spot: "true"
spec:
  # Spot は強制終了されるため、tolerations で受け入れ可能な Pod のみスケジュール
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: batch-worker
spec:
  template:
    spec:
      tolerations:
        - key: "cloud.google.com/gke-spot"
          operator: "Equal"
          value: "true"
          effect: "NoSchedule"
      terminationGracePeriodSeconds: 25   # 30秒の SIGTERM 内に終了
Spot VM の罠
  • SLA 対象外: 99.99% を求める本番 API には不向き。Spot はバッチ・データ処理・テスト環境に限定
  • 突然停止: 30秒前通知のみ。状態を持つ Pod は即座にチェックポイント保存が必要
  • キャパシティ枯渇: 需要が高いリージョンでは Spot が手に入らない時間帯あり
  • StatefulSet 不向き: PersistentVolume の付け替えが煩雑

サービス別コスト最適化レシピ

💰 Cloud Run のコスト最適化
  • min-instances を最小に: バックグラウンドタスクなしなら 0、コールドスタート許容できないなら 1
  • CPU always-on を切る: --no-cpu-throttling はバックグラウンド処理が必要な時のみ
  • concurrency を上げる: I/O バウンドなら 80 → 200+ で 1 インスタンスの利用効率向上
  • メモリプロファイル: Cloud Profiler で実測 → メモリを --memory=256Mi 等に切り詰める
  • 不要 Service の削除: テスト用 Service が残って min-instances 課金されているケースが頻発
  • Cloud Run Jobs を活用: バッチ処理は Service ではなく Jobs(実行時のみ課金)
💰 GKE のコスト最適化
  • Autopilot vs Standard の選択: 小〜中規模ワークロードは Autopilot の方が安いことが多い(ノード idle 時間ゼロ)
  • VPA で resources.requests を最適化: requests = 実測値に近づける(過剰なら CUD でも無駄)
  • Cluster Autoscaler: 低負荷時に min ノード数を下げる
  • ノードプール分離: 本番 = e2-standard、バッチ = Spot、GPU = N1 + GPU で混在
  • Network policy + LB の最適化: Internal LB を使い egress 料金を抑える
  • CUD で 1〜3年契約: 常時稼働の ノードプール分
💰 Cloud Storage のコスト最適化
  • Lifecycle policy: 30日経過 → Nearline、90日 → Coldline、365日 → Archive
  • 削除ポリシー: バックアップは N年で自動削除
  • requester pays: 外部ユーザーがダウンロードする際の egress 料金を彼ら負担に
  • リージョン選択: マルチリージョン vs リージョナルでコスト差(マルチリージョンは 2倍)
  • Cloud CDN 連携: 頻繁に DL されるオブジェクトは CDN キャッシュで egress 削減
💰 BigQuery のコスト最適化
  • Partition + Cluster: クエリで WHERE date BETWEEN ... でスキャン量を激減
  • マテビュー: 頻繁な集計クエリを事前計算
  • BI Engine: ダッシュボードクエリを高速化 + コスト削減
  • Editions(Slot 予約): 月額固定の Slot Reservation で予測可能なコスト
  • クエリ最適化: SELECT * 禁止、必要な列のみ。STRUCT/ARRAY を活用
  • ストレージ自動レート: 90日触らないデータは long-term storage(半額)に自動移行
💰 Cloud Logging / Monitoring のコスト最適化
  • Exclusion Filter: 必要のないログ(DEBUG、health check、Audit Data Access の大量分)を破棄
  • Sink to BigQuery / GCS: 長期保管はストレージ単価が安い方へ
  • Logging Bucket retention: デフォルト 30日。アクセス頻度低いログは短く
  • Custom Metrics の cardinality 削減: ラベルに高 cardinality 値(user_id、order_id)を使わない
  • Cloud Trace のサンプリング: 100% → 1〜10% で大幅コスト削減(重要 trace は明示的にサンプル)

3. インシデント対応・オンコール

アラート設計:SLO ベースの厳選

Google SRE Book 推奨:「人間が即座に行動を取る必要があるもの」だけ通知する。

Page 夜中起こす価値あり Ticket 翌営業日対応 Log(参考のみ) PagerDuty / SMS Slack / Jira Dashboard
図3: アラート3階層。Page は最小限、Ticket は業務時間内、Log は調査用。

❌ 悪いアラート

  • 「CPU > 80%」など単純閾値(誤検知多発)
  • 原因不明、対応方法不明
  • 1日 100件以上
  • 誰も見ていない
  • 夜中に何度も叩き起こされる

典型的なアラート設計の改善例

悪い:「Cloud Run の CPU > 80% が 5分継続」
       → CPU 高くてもユーザー影響なしの可能性、誤検知

良い:「過去 1時間の error rate が 5% (Burn Rate 14.4) AND 過去 5分の error rate が 5%」
       → SLO 違反が短期 + 長期で確認、ユーザー影響確定

Runbook と Toil 削減

Runbook = アラート発火時の対応手順書。Toil = 手動・反復・自動化可能な作業。

良い Runbook の構成

# Runbook: Cloud Run Service "my-api" の error rate 上昇

## 1. 即時確認
1. Cloud Monitoring の SLO ダッシュボードを開く:
2. Burn Rate を確認(14.4 倍以上なら緊急)
3. Cloud Run の error率トレンドを直近 30分で確認

## 2. 切り分け
- (a) 直近のデプロイがあるか? → Cloud Build Activity を確認
- (b) Cloud SQL の CPU / 接続数を確認
- (c) 外部 API(決済代行)のヘルスチェック
- (d) Cloud Logging で 5xx の内訳を確認

## 3. 緊急対応
### (a) デプロイが原因の場合
```bash
gcloud run services update-traffic my-api \
  --to-revisions=PREVIOUS=100 --region=us-central1
```

### (b) Cloud SQL の問題
- 接続数 > 90% → 一時的に max-instances を半減
- CPU > 95% → スレーブへ切替検討(Read Replica)

### (c) 外部 API 障害
- Circuit Breaker を有効化
- Slack #partner-incidents で連携

## 4. エスカレーション
30分以内に解決しなければ → On-call Engineering Manager に連絡(PagerDuty)
1時間以内に解決しなければ → CTO 通知
Toil 削減の SRE ルール
  • SRE の業務時間のうち Toil(手動運用作業)は最大 50% までに制限
  • 残り 50% は自動化・改善プロジェクトに投資
  • Runbook の手順がすべて自動化可能なら、Cloud Function や Workflows で自動 Remediation
  • 同じインシデントが 3回起きたら、自動化が必須

Postmortem 文化(Blameless)

インシデント後の振り返り。「誰の責任か」ではなく「システムをどう変えるか」に焦点。

Postmortem テンプレート(Google SRE Book 準拠)

# Postmortem: Cloud SQL Connection Exhaustion - 2026-05-28

## サマリー
- **日時**: 2026-05-28 14:00-14:15 JST(15分)
- **影響**: 注文 API の 30% が 500 を返却
- **重大度**: SEV-HIGH
- **ステータス**: 解決 / 再発防止策実装中

## タイムライン
- 14:00 セールキャンペーン開始、トラフィック 3倍に
- 14:03 Cloud SQL の接続数が max_connections に到達
- 14:05 PagerDuty アラート発火(SLO Burn Rate 14.4)
- 14:07 On-call Engineer 認識・対応開始
- 14:10 Cloud Run の max-instances を 100 → 50 に縮小
- 14:15 接続数回復、SLO 復活

## 根本原因
- Cloud Run max-instances=100 × 各 Pod の DB プール 20 = 最大 2,000 接続要求
- Cloud SQL の max_connections=100 → 接続枯渇

## 影響
- 注文失敗 248件、約 $5,000 の機会損失
- ユーザー苦情 12件
- SLO 月間 Error Budget の 30% を消費

## やったこと(What went well)
- アラートが 2分以内に発火 → 検知早期
- Runbook がすぐ参照可能 → 対応 4分以内

## うまくいかなかったこと(What went poorly)
- Cloud SQL 接続数の Capacity Planning が不十分
- セール前の負荷試験で max-instances 想定を考慮していなかった

## アクションアイテム
| # | 対応 | 担当 | 期限 |
|---|------|------|------|
| 1 | PgBouncer 導入で接続プーリング集約 | Alice | 2026-06-15 |
| 2 | Cloud SQL のフラグで max_connections=500 に増やす | Bob | 2026-06-01 |
| 3 | セール前 Capacity Planning チェックリスト整備 | Carol | 2026-06-30 |
| 4 | 接続数 80% で Page アラートを追加 | Dave | 2026-06-05 |
Blameless Postmortem の原則
  • 「誰が」ではなく「何が」「なぜ」に焦点
  • 個人の過失ではなくシステム/プロセスの欠陥として扱う
  • すべての参加者が正直に発言できる心理的安全性を確保
  • アクションアイテムには担当者と期限を明記
  • 1ヶ月後にアクションアイテム完了確認
  • 類似インシデントの再発時はPostmortem の質を疑う

4. リリース工学・カオステスト・キャパシティ

Progressive Delivery(段階的リリース)

Canary Release

新版を一部トラフィック(5% / 10% / 50% / 100%)に段階的に流す。Cloud Run の update-traffic で実装。

エラーレート / レイテンシで自動 rollback

Blue-Green

2環境(Blue=旧、Green=新)を準備し、ロードバランサで一気に切替。Cloud Run なら 2 Service + LB、GKE なら 2 Deployment + Service swap。

即時切替 / 即時ロールバック

A/B Testing

ユーザー属性(地域・ID hash・ブラウザ)で振り分け。Cloud Run の tag-based routing や Feature Flag SaaS で実装。

機能の効果検証

Shadow / Dark Launch

新版に本物のリクエストをコピーして流すが、レスポンスは旧版を返す。本番負荷での検証

本番条件のテスト

Cloud Deploy + Cloud Run/GKE の自動 Progressive Delivery

# Cloud Deploy の Delivery Pipeline
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-app
serialPipeline:
  stages:
    - targetId: staging
      profiles: []
    - targetId: prod-canary
      profiles: []
      strategy:
        canary:
          runtimeConfig:
            cloudRun:
              automaticTrafficControl: true
          canaryDeployment:
            percentages: [5, 25, 50]      # 段階的に拡大
            verify: true                    # 各段階で検証
    - targetId: prod-full
      profiles: []

Feature Flag による機能フラグ

# Feature Flag の典型実装(自前 or LaunchDarkly/Flagsmith 利用)
def get_feature(feature_name: str, user_id: str) -> bool:
    """機能フラグの有効性を判定"""
    config = feature_flag_client.get_config(feature_name)

    # 1. 完全有効 / 完全無効
    if config["enabled"] is False:
        return False
    if config["rollout_percent"] == 100:
        return True

    # 2. % rollout(ユーザーIDの hash で決定)
    user_hash = hash(f"{feature_name}:{user_id}") % 100
    return user_hash < config["rollout_percent"]

# 使い方
if get_feature("new_checkout_flow", user_id):
    return render_new_checkout()
else:
    return render_legacy_checkout()
Feature Flag の運用ルール
  • 新機能は必ず Feature Flag で出す(即時無効化可能)
  • 段階的 rollout: 1% → 10% → 50% → 100%(各段階で 24h 観察)
  • 古い Flag は必ず削除(コードに永久に残ると技術負債)
  • 運用者が UI で簡単に Toggle できるダッシュボード必須
  • Cloud Run のリビジョン切替と組み合わせ、Flag + traffic split で多段制御

Chaos Engineering

意図的に障害を起こして、システムの弱点を発見」する実践。

典型的な Chaos Experiments

シナリオ仮説実施方法
Pod 強制終了HPA + PDB で自動復旧kubectl delete pod / chaos-mesh
Node 障害Pod が他ノードに退避GCE インスタンスを停止
Cloud SQL フェイルオーバーアプリが自動再接続gcloud sql instances failover
ネットワーク遅延サービスは耐性あるtc / chaos-mesh で latency 注入
外部 API 障害Circuit Breaker で隔離WireMock で 5xx 注入
リージョン全停止DR 計画通り別リージョンへ本番直前のリハーサル
Chaos Engineering の進め方
  1. 仮説を立てる: 「Cloud SQL がダウンしても、API は 503 を返さず、待機する」
  2. 定常状態を測定: 通常時の Error Rate / Latency / Throughput を記録
  3. 実験範囲を最小化: 最初は staging、blast radius を限定
  4. 実験実施: 障害を注入
  5. 結果検証: 仮説が正しいか確認、システムの弱点を発見
  6. 修正 + 再実験
  7. 本番への展開: 信頼が育ったら本番でも実施(GameDay)

Capacity Planning

「将来のトラフィック増に対応できるか」を事前に確認する活動。

① 需要予測

過去トラフィックから将来予測(季節性、キャンペーン、新機能リリース影響)。BigQuery + Vertex AI 等で時系列予測。

② 供給能力測定

負荷試験で「1 Pod が捌ける RPS」「Cloud SQL が捌ける TPS」を測定。Vegeta / k6 / Locust などで本番条件再現。

③ Quota 確認

GCP の Quota(CPU、IP、API call/秒)を予測値と比較。事前に Quota 増加申請(数日〜2週間かかる)。

④ コスト試算

容量増に伴うコスト見積もり。SLO 達成と予算のバランス。

負荷試験のシナリオパターン

# k6 を使った負荷試験
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 100 },   // 2分かけて 100 VU まで上げる(ramp-up)
    { duration: '5m', target: 100 },   // 5分維持
    { duration: '2m', target: 500 },   // 500 VU まで急増(spike)
    { duration: '5m', target: 500 },   // 維持
    { duration: '2m', target: 0 },     // ramp-down
  ],
  thresholds: {
    http_req_duration: ['p(95)<500', 'p(99)<1000'],
    http_req_failed: ['rate<0.01'],
  },
};

export default function () {
  const res = http.get('https://my-api.example.com/orders');
  check(res, { 'status 200': (r) => r.status === 200 });
  sleep(1);
}

Quota 管理のチェックリスト


5. DR / BCP(災害復旧・事業継続)

RPO / RTO の定義

RPO (Recovery Point Objective)

どこまで遡ったデータ損失を許容するか。「直近 5分のデータは失っても OK」なら RPO=5分。

RTO (Recovery Time Objective)

どれだけの時間で復旧するか。「2時間以内に復旧する」なら RTO=2h。

DR 戦略パターン

戦略RPO/RTOコスト説明
Backup & RestoreRPO: 数時間 / RTO: 数時間定期バックアップ。災害時に手動復元
Pilot LightRPO: 数分 / RTO: 数十分本番の縮小コピーを別リージョンに常時稼働
Warm StandbyRPO: 秒 / RTO: 数分本番並みの規模で別リージョン稼働
Active-ActiveRPO: 0 / RTO: 0非常に高複数リージョンで同時稼働

GCP サービス別 DR 設計

DR テストの重要性
  • 四半期ごとに DR ドリル: バックアップから復元できるか、フェイルオーバーが機能するか
  • 本番リハーサル時は、事前に全社通知 + 切り戻し計画
  • 「動くと思っていた DR が動かない」が最大の事故。使われていない仕組みは信用しない
  • RPO/RTO はビジネス要件として SLA に組み込む

6. Observability 深掘り

Pillars of Observability(3つの柱)

Logs 「何が起きた」 - 詳細な情報・ID - 構造化 JSON - Cloud Logging - OpenTelemetry Logs 高コスト・限定保持 調査時に最も価値 Metrics 「どれくらい」 - 集計値(counter, gauge) - 時系列 - Cloud Monitoring - Prometheus 低コスト・長期保持 トレンド検知に最適 Traces 「どう流れた」 - リクエスト1本の追跡 - 分散システム横断 - Cloud Trace - OpenTelemetry Traces サンプリング推奨 分散レイテンシ解析
図4: Observability の3つの柱。Logs / Metrics / Traces を組み合わせて全体像を把握。

Profiles(4本目の柱)

近年は Profiling(CPU/メモリの関数単位 hotspot)も Observability の柱として注目。GCP では Cloud Profiler が継続的プロファイリング(< 1% オーバーヘッド)を提供。

High Cardinality の罠

Metrics 設計の致命的失敗:High Cardinality
  • Cardinality = メトリクスのラベル組合せ数
  • 例: http_requests_total{user_id="u1", endpoint="/orders"} で user_id を入れると、ユーザー数 × エンドポイント数の組合せ
  • 100万ユーザー × 100エンドポイント = 1億の時系列 → Cloud Monitoring が爆発、コスト爆発
  • 解決策: ラベルは「集約可能な少数値」のみ(HTTP status、region、environment 等)。user_id / order_id 等の高 cardinality はログに記録

サンプリング戦略

戦略説明使い所
Head-based Samplingリクエスト開始時にランダムで決定シンプル。Cloud Trace のデフォルト
Tail-based Samplingリクエスト完了後、エラー/遅延があれば必ず保持OTel Collector で実装。本番推奨
Probabilistic Sampling固定確率(例: 10%)でサンプリング低トラフィックなら 100%
Rate Limiting秒間 N トレースまで急激なトラフィック増対応

USE Method / RED Method

USE Method(リソース観点)

  • Utilization: リソース利用率
  • Saturation: 飽和度(待ち行列)
  • Errors: エラー数
CPU/メモリ/ディスク/ネットワーク向け

RED Method(サービス観点)

  • Rate: リクエスト/秒
  • Errors: エラー数
  • Duration: レイテンシ
マイクロサービス向け(Golden Signals に近い)

📚 SRE 実践のための学習リソース

🎯 SRE トピックの試験対策ポイント
  • 4 Golden Signals: Latency / Traffic / Errors / Saturation を即答
  • SLO ベースのアラート: 単純閾値ではなく Burn Rate
  • Error Budget: SLO 99.9% = 月 43分のダウンタイム許容
  • Spot VM: 最大 91% 割引、バッチ・耐障害性ワークロード向け
  • CUD: 1〜3年契約、最大 70% 割引、定常ワークロード向け
  • Budget Alert は通知のみ、自動制限ではない
  • Cardinality 注意: user_id を metric label に入れない
  • RPO/RTO: ビジネス要件として明確化
← セクション4 ホームへ →