運用・SRE 深掘り
Google SRE Book / Workbook 準拠 — GCP サービスで実装する SRE プラクティス
1. SLO / SLI / Error Budget
4 つの Golden Signals(Google SRE Book)
サービスの健全性を測る基本指標。これを満たさない監視は SRE 的に不完全です。
① Latency(レイテンシ)
リクエスト処理時間。成功と失敗を分離して測定することが肝心。失敗が速いと全体平均が良く見える錯覚。
② Traffic(トラフィック)
需要の量。HTTP RPS、Pub/Sub メッセージ/秒、DB クエリ/秒など。サービスごとに「需要」の単位を定義。
③ Errors(エラー)
失敗率。明示的失敗(5xx)、暗黙的失敗(200 OK だがコンテンツが空)、ポリシー違反(レイテンシ超過)。
④ Saturation(飽和度)
リソースがどれだけ使われているか。CPU 80% を超えると応答悪化、メモリ 90% で OOM 危険、コネクションプール 80% で枯渇間近。
- 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
具体的な SLI 例(公開向け Web サービス)
| カテゴリ | SLI 定義 | SLO 目標例 |
|---|---|---|
| Availability | (2xx + 3xx + 401 + 403 + 404) / total_requests | 99.9% / 月 |
| Latency | requests_with_latency_under_200ms / total_requests | 95% / 月 |
| Throughput | requests_per_second がしきい値以上 | 1000 RPS |
| Freshness (バッチ) | data_age_under_1h / total_checks | 99% / 日 |
| Correctness | passed_data_quality_checks / total_checks | 99.95% |
| Coverage | processed_records / total_records | 99.99% |
- 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 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 = 期間内に消費する 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
- 長期 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 Run | vCPU × メモリ × 時間 + リクエスト数 | min/max instances、concurrency、CPU always-on の必要性検討 |
| GKE Standard | ノード VM(CPU/メモリ/ディスク)+ Cluster Mgmt $0.10/h | CUD、Spot VM、Cluster Autoscaler、VPA、ノードプール分割 |
| GKE Autopilot | Pod の requests(vCPU/メモリ/ストレージ) | VPA で requests を実測値に最適化、不要 Pod の削除 |
| Compute Engine | VM 時間 + ディスク + ネット egress | CUD、Spot、適切なマシンファミリー(E2/N2/N4) |
| Cloud Storage | ストレージクラス × バイト × 月 + API + egress | Lifecycle 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"
- 実績 + 予測の両方でしきい値を設定(50% / 90% / 100% 実績 + 150% 予測)
- Pub/Sub 通知で自動アクション(特定 SA を一時無効化、Cloud Function でアラートエスカレーション)
- 環境別(dev / staging / prod)に別 Budget
- 機密度高いサービス(Spanner、BigQuery)は個別 Budgetでモニタ
- Budget = 自動制限ではない。通知だけ。自動停止には Cloud Function + 課金 API 連携が必要
- Budget は支出を自動制限しない。本当に「コスト爆発を止めたい」なら、Cloud Function で
cloudbilling.disableBillingForProjectを呼ぶ仕組みを別途構築(注意:本番停止と同義) - 反映遅延 1〜2日。Cloud Billing のレポートは遅延する。Cost Anomaly Detection の方が早い
- SAVINGS(割引・クレジット)を含む計算は意図しない閾値超過を起こす
- クラウドからの請求は月初 2日に前月分が確定する。月末 1日のスパイクで翌月 Budget が一気に消費されたように見える錯覚
Cost Anomaly Detection(コスト異常検知)
過去パターンから「異常な支出増加」を機械学習で検知。Cloud Billing の Reports 内で有効化。
- プロジェクト・サービス・ラベル粒度で異常を発見
- 「特定の SKU が突然 3倍になった」「新規プロジェクトが急に高額」を即時検知
- Budget Alert と組み合わせ: Budget は「絶対額」、Anomaly Detection は「変化率」を見る
Committed Use Discount (CUD) / Spot VM
Committed Use Discount (CUD)
- 1年 or 3年 の使用約束で最大 70% 割引
- Compute Engine、Cloud Run、GKE、Spanner、Memorystore に対応
- vCPU / メモリの量で約束(特定マシンタイプではない)
- 常時稼働ワークロードに最適
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 内に終了
- 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 推奨:「人間が即座に行動を取る必要があるもの」だけ通知する。
✅ 良いアラート
- SLO ベース(Burn Rate)
- 原因が示唆される
- Runbook へのリンクあり
- 誤検知率 < 10%
- 1日に 1〜5件以下
❌ 悪いアラート
- 「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 通知
- 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 |
- 「誰が」ではなく「何が」「なぜ」に焦点
- 個人の過失ではなくシステム/プロセスの欠陥として扱う
- すべての参加者が正直に発言できる心理的安全性を確保
- アクションアイテムには担当者と期限を明記
- 1ヶ月後にアクションアイテム完了確認
- 類似インシデントの再発時はPostmortem の質を疑う
4. リリース工学・カオステスト・キャパシティ
Progressive Delivery(段階的リリース)
Canary Release
新版を一部トラフィック(5% / 10% / 50% / 100%)に段階的に流す。Cloud Run の update-traffic で実装。
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 で出す(即時無効化可能)
- 段階的 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 計画通り別リージョンへ | 本番直前のリハーサル |
- 仮説を立てる: 「Cloud SQL がダウンしても、API は 503 を返さず、待機する」
- 定常状態を測定: 通常時の Error Rate / Latency / Throughput を記録
- 実験範囲を最小化: 最初は staging、blast radius を限定
- 実験実施: 障害を注入
- 結果検証: 仮説が正しいか確認、システムの弱点を発見
- 修正 + 再実験
- 本番への展開: 信頼が育ったら本番でも実施(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 管理のチェックリスト
- Compute Engine: CPU、Persistent Disk、External IP(地域別)
- Cloud SQL: max_connections(インスタンスフラグ)、インスタンス数
- Cloud Run: max-instances、リクエスト/秒
- Cloud Storage: バケット数、API request/秒
- BigQuery: 同時クエリ数、スロット数、ストリーミング挿入
- Pub/Sub: メッセージ/秒、topic 数
- API レート制限:
quota.exceededエラーで判明する前に確認
5. DR / BCP(災害復旧・事業継続)
RPO / RTO の定義
RPO (Recovery Point Objective)
どこまで遡ったデータ損失を許容するか。「直近 5分のデータは失っても OK」なら RPO=5分。
RTO (Recovery Time Objective)
どれだけの時間で復旧するか。「2時間以内に復旧する」なら RTO=2h。
DR 戦略パターン
| 戦略 | RPO/RTO | コスト | 説明 |
|---|---|---|---|
| Backup & Restore | RPO: 数時間 / RTO: 数時間 | 低 | 定期バックアップ。災害時に手動復元 |
| Pilot Light | RPO: 数分 / RTO: 数十分 | 中 | 本番の縮小コピーを別リージョンに常時稼働 |
| Warm Standby | RPO: 秒 / RTO: 数分 | 高 | 本番並みの規模で別リージョン稼働 |
| Active-Active | RPO: 0 / RTO: 0 | 非常に高 | 複数リージョンで同時稼働 |
GCP サービス別 DR 設計
- Cloud Run: 複数リージョンに同じ Service をデプロイ + Global HTTP(S) LB でルーティング
- GKE: GKE Multi-cluster + Anthos / Cloud Service Mesh で複数リージョン
- Spanner: マルチリージョン構成(自動同期、RPO=0、RTO≈0)
- Cloud SQL: クロスリージョンリードレプリカ + 手動フェイルオーバー(RPO: 秒、RTO: 数分)
- Firestore: マルチリージョンモードでリージョン障害時も継続
- Cloud Storage: Dual-region / Multi-region クラスで自動レプリケーション
- BigQuery:
copy_datasetでクロスリージョン同期、または BigQuery Omni - Pub/Sub: グローバルサービス(リージョン障害でも自動継続)
- 四半期ごとに DR ドリル: バックアップから復元できるか、フェイルオーバーが機能するか
- 本番リハーサル時は、事前に全社通知 + 切り戻し計画
- 「動くと思っていた DR が動かない」が最大の事故。使われていない仕組みは信用しない
- RPO/RTO はビジネス要件として SLA に組み込む
6. Observability 深掘り
Pillars of Observability(3つの柱)
Profiles(4本目の柱)
近年は Profiling(CPU/メモリの関数単位 hotspot)も Observability の柱として注目。GCP では Cloud Profiler が継続的プロファイリング(< 1% オーバーヘッド)を提供。
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: エラー数
RED Method(サービス観点)
- Rate: リクエスト/秒
- Errors: エラー数
- Duration: レイテンシ
📚 SRE 実践のための学習リソース
- Google SRE Book(無料公開)
- Google SRE Workbook
- Google Cloud Architecture Framework
- Cloud Monitoring SLO ドキュメント
- SRE Resources(テンプレート集)
- 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: ビジネス要件として明確化