PCDE 合格対策
DEEP DIVE

🎯 SRE プラクティス徹底深掘り

Google SRE Book / Workbook の原則を Cloud Monitoring / Cloud Service Mesh / GKE / Cloud Run で実装する具体的手法、SLO 計算式・Multi-burn-rate 設計・インシデント対応まで深掘り。試験対策の最終仕上げと、本番 SRE 業務のリファレンスを兼ねた一枚教材です。

SRE Book / Workbook 準拠 🎯 上級 📐 数式 📊 ダウンタイム表 ⚠️ 事故ケース 35+ 🚨 ICS / Postmortem
🎯 試験頻出 ⚠️ 事故ケース ✅ ベストプラクティス 📐 数式 🔑 即答パターン
🔑 TL;DR — このページの結論 SRE は 「class SRE implements DevOps」 = DevOps の理念を SLI / SLO / Error Budget / Toil 50% / Blameless Postmortem で実装する工学体系。SLI = Good / TotalSLO = 内部目標SLA = 顧客契約 (SLI < SLO < SLA に見えるが数値の大小は逆順、SLI が最高、SLA が最低)Error Budget = 1 − SLOBurn Rate = エラー率 / (1−SLO)。SRE Workbook Ch.5 の Multi-window Multi-burn-rate は page: 1h+5m/14.4x (2%消費) / page: 6h+30m/6x (5%消費) / ticket: 3d+6h/1x (10%消費) の 3 段。短期ウィンドウはロングウィンドウの 1/12 を推奨。ダウンタイム暗記:99.9% = 月 43m / 年 8.76h99.99% = 月 4.3m / 年 52.6m99.999% = 月 26s / 年 5.26m。「nines」を 1 桁上げるごとに 10x コスト。Cloud Service Mesh(旧 Anthos Service Mesh)は istio_requests_total でアプリ無改修 SLO。Autoscaling は MIG(CPU/LB/Custom/Schedule/Predictive)/ Cloud Run(concurrency/min-max/CPU always)/ GKE(HPA + VPA + CA + NAP)HPA と VPA を同一メトリクスで併用は NG。インシデント対応の鉄則は 影響緩和 → 容量追加 → ロールバック → 原因究明。最速の止血は Feature Flag OFF
最大の事故源は 「99.99% SLO を盲目的に目指してチーム疲弊」「Burn rate 5 分ウィンドウだけで flapping」「HPA + VPA 同一メトリクスで Pod 振動」「PDB 未設定で CA がノード落とせず詰まる」「リージョン障害で DNS TTL 600s が長すぎて切替遅延」の 5 つです。

📚 参照する公式ドキュメント

本資料は以下の Google SRE Book / Workbook / Google Cloud 公式ドキュメント(2026 年時点)から技術詳細・計算式・SLA・ベストプラクティスを抽出しています。各章で都度引用と URL を併記します。

#領域公式 URL
1SRE Book Ch.4 SLOssre.google/sre-book/service-level-objectives/
2SRE Book Ch.5 Eliminating Toilsre.google/sre-book/eliminating-toil/
3SRE Book Ch.6 Monitoringsre.google/sre-book/monitoring-distributed-systems/
4SRE Workbook Ch.2 Implementing SLOssre.google/workbook/implementing-slos/
5SRE Workbook Ch.5 Alerting on SLOssre.google/workbook/alerting-on-slos/
6SRE Workbook Ch.9 Incident Responsesre.google/workbook/incident-response/
7Cloud Monitoring SLO 概要cloud.google.com/stackdriver/docs/solutions/slo-monitoring
8Cloud Monitoring SLO 作成cloud.google.com/monitoring/service-monitoring/create-slo
9Cloud Service Mesh SLO 概要cloud.google.com/service-mesh/docs/observability/slo-overview
10MIG Autoscalingcloud.google.com/compute/docs/autoscaler
11Cloud Run Autoscalingcloud.google.com/run/docs/about-instance-autoscaling
12GKE Horizontal Pod Autoscalercloud.google.com/kubernetes-engine/docs/concepts/horizontalpodautoscaler
13GKE Vertical Pod Autoscalercloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler
14GKE Cluster Autoscalercloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler
15GKE Node Auto-Provisioningcloud.google.com/kubernetes-engine/docs/concepts/node-auto-provisioning
16Reservations 概要cloud.google.com/compute/docs/instances/reservations-overview
17Dynamic Workload Schedulercloud.google.com/blog/products/compute/introducing-dynamic-workload-scheduler
18DR Planning Guidecloud.google.com/architecture/dr-scenarios-planning-guide
19Postmortem culturesre.google/sre-book/postmortem-culture/
20DORA / State of DevOpsdora.dev

1SRE の哲学と DevOps

SRE(Site Reliability Engineering)は Ben Treynor(Google VP)が 2003 年に提唱した、ソフトウェアエンジニアリングの手法で運用問題を解く規律です。DevOps が「WHAT(理念)」なら、SRE は「HOW(具体的実装)」。試験では「SRE と DevOps の関係」「Toil 50% ルール」「Four Golden Signals」「Postmortem の Blameless 原則」「DORA 4 metrics」が頻出です。

「SRE is what happens when you ask a software engineer to design an operations team.」 — Ben Treynor Sloss, Google VP of Engineering

1.1 「class SRE implements DevOps」の正確な意味

DevOps の 5 つの原則に対し、SRE は 具体的な実装手段を提供します。「class」「implements」というプログラミング用語の比喩は、DevOps を interface、SRE を concrete class として捉えるという意味です。

DevOps 原則(WHAT)SRE 実装(HOW)具体例
組織サイロを壊すDev と SRE が 共通 SLO を持つError Budget Policy を両者で合意
失敗を normal として受容Error Budget で 許される失敗量を数値化SLO 99.9% → 月 43 分まで OK
段階的変更(gradual)Canary + Multi-burn-rate alertCloud Deploy canary 25/50/100%
ツール・自動化を活用Toil ≤ 50%、自動化に残り時間投資Runbook → Cloud Workflows へ昇格
すべてを計測SLI / Four Golden SignalsLatency p99 / Errors / Traffic / Saturation
💡 試験ポイント — 「DevOps と SRE の違いを問われたら」
  • DevOps は文化・哲学(What)/ SRE は実装・職務(How)
  • SRE は specific prescriptive practice of DevOps(DevOps の具体的・規範的実装)
  • 両者は対立しない。SRE は DevOps を含み、さらに数値目標と組織構造を加える

1.2 Google SRE Book と SRE Workbook の違い

📕 Site Reliability Engineering(SRE Book, 2016)

「What」を語る本。Google の SRE の原理・思想・組織構造を解説。「なぜ SRE が必要か」「Error Budget とは何か」「Toil とは何か」「Four Golden Signals」などの基本概念を提示。Ch.4 「Service Level Objectives」が SLO のバイブル。

sre.google/sre-book/table-of-contents/

📗 Site Reliability Workbook(2018)

「How」を語る本。SRE Book で示した思想を実際にどう実装するかのハンズオン。Ch.2 「Implementing SLOs」、Ch.5 「Alerting on SLOs」(Multi-burn-rate のバイブル)、Ch.9 「Incident Response」など、実務で即使える計算式・コードが充実。

sre.google/workbook/table-of-contents/

1.3 Toil(労苦)の定義と 50% ルール

Toil = SRE が削減すべき「無価値で反復的な手作業」。SRE Book Ch.5 が定義する 5 つの特徴のすべてを満たすものが Toil。1 つでも欠ければ Toil ではない(例:「自動化困難な調査作業」は反復的だが automatable ではないので Toil ではなく Overhead)。

#Toil の必須条件反例(Toil でない)
1Manual(手作業)すでに自動化済みのスクリプト実行
2Repetitive(反復的)新規アーキテクチャの設計(一度きり)
3Automatable(自動化可能)本質的に人間判断が必要な複雑な障害調査
4Tactical(戦術的、価値を生まない)新機能の設計レビュー
5No enduring value(永続的価値なし)恒久的な信頼性改善コード
6O(n) with service growth(サービス成長に比例)規模に関係なく一定回数の作業
📐 数式 — Toil 上限 50% ルール
SRE 1 人あたり Toil ≤ 50% × 1 週間の労働時間
       = 50% × 40h = 20h / 週

残り 50% (= 20h / 週) は engineering work
  ├ 信頼性改善コード
  ├ 自動化(runbook → script → workflow)
  ├ Postmortem の Action Items 実装
  └ アーキテクチャ改善

→ Toil > 50% が継続したら:
   1. オンコール rotation 拡大、
   2. プロジェクトを開発チームに pushback、
   3. SRE 増員、
   4. Toil 削減プロジェクト起票

1.4 Postmortem 文化 — Blameless が大前提

「The cost of failure is education.」 — SRE Book Ch.15 Postmortem Culture

Blameless Postmortem = 「誰が」ではなく「何が」「なぜ」を問う事後分析。個人攻撃を排除することで、本当の事実が表に出る。Postmortem が punitive(懲罰的)になると、エンジニアはミスを隠し、根本原因が永遠に見つからない。

✅ Blameless の原則

「何が」起きたかを問う/プロセス改善に集中/教訓を組織で共有/振り返りを公開(社内 Wiki)/Action Items に必ず担当者と期限を割り当てる/Five Whys でシステム要因を掘り下げる。

❌ Blameful のアンチパターン

「誰が」ボタンを押したかを問う/個人攻撃/犯人探し/隠蔽の温床/Action Items が抽象的(「気をつける」「研修を実施」など)/Root Cause が「Operator error」で止まる(その人がミスするシステムが悪い)。

Postmortem の Trigger(いつ書くか)

Trigger
ユーザー影響あり(SLO 違反 / Error Budget 大量消費)Checkout API が 15 分ダウン、月予算の 30% 消費
データ損失 / 破損顧客データの 1 件でも消失・改竄
オンコール介入夜間アラートでエンジニアが起こされた
解決に予想以上の時間1h 想定 → 実際 6h
監視ギャップ顧客から先に報告された(アラートが鳴らなかった)
ステークホルダーからの要請VP / 顧客から「Postmortem 共有して」と要望

Five Whys の例

障害: 決済 API が 23 分間 503 を返した
Why 1: Pod が OOM Killed され続けた
Why 2: メモリ要求 (256Mi) に対し実使用が 2Gi に達した
Why 3: 新リリースで請求書 PDF を全件 in-memory ロードに変更された
Why 4: コードレビューでメモリ影響が見落とされた
Why 5: メモリ profiling が CI に組み込まれていなかった
→ Action Item:
   - [P0] Cloud Profiler を本番常時有効化(担当: SRE A, 期限: 2 週間)
   - [P1] PR テンプレートに「メモリ影響」項目追加(担当: Dev Lead, 期限: 1 週間)
   - [P1] VPA recommender を有効化して memory request の自動調整(担当: SRE B, 期限: 1 ヶ月)

1.5 The Four Golden Signals — 最小監視セット

Google SRE Book Ch.6 が示す、ユーザー向けシステムを監視する最小 4 シグナル。「これだけは必ず計測しろ」というベースライン。試験で「ユーザー影響を反映する最小監視セット」と問われたら即答 = Four Golden Signals

Latency
処理時間
(成功と失敗を分離)
Traffic
需要
(RPS / QPS)
Errors
失敗率
(明示 / 暗黙 / 仕様)
Saturation
混雑度
(リソース利用 + 待ち)
シグナル定義代表メトリクス落とし穴
Latencyリクエスト処理時間p50 / p95 / p99 / p99.9成功と失敗を分離(5xx は早く返ることが多く平均が歪む)/平均ではなく percentile を使う
Trafficシステムへの需要HTTP RPS、PubSub messages/s、DB QPSサービスごとに「Traffic」の単位を明示(webhooks か、user clicks か)
Errors失敗リクエスト率5xx ratio、4xx ratio、明示的失敗「正しい応答だが内容が誤り」(policy 失敗、ML 推論誤り)も Errors としてカウント
Saturation混雑度(最も制約のあるリソース)CPU / Memory / Disk I/O / Queue length / Goroutines100% に達する前に対処(予測指標)/「最も詰まる箇所」をサービスごとに特定
💡 類似フレームワーク — どれを使い分ける?
フレームワーク提唱対象
Four Golden SignalsGoogle SREユーザー向けサービスLatency / Traffic / Errors / Saturation
USE MethodBrendan Greggリソース(CPU/メモリ/ディスク等)Utilization / Saturation / Errors
RED MethodTom Wilkieマイクロサービス / リクエストRate / Errors / Duration

使い分け:ユーザー視点 → Golden Signals/リソース視点 → USE/リクエスト視点(特に分散トレーシング)→ RED。SRE 試験は Four Golden Signals がデフォ正解

1.6 DORA 4 metrics — 高成果チームのベンチマーク

Google Cloud 配下の DORA(DevOps Research and Assessment)が毎年公開する State of DevOps Report の中核指標。試験では「DORA」というキーワード単体でも問われる。CI/CD と SRE の橋渡し指標

メトリクス定義EliteHighMediumLow
Deployment Frequency(DF)本番デプロイ頻度1 日複数回1 日〜1 週1 週〜1 ヶ月1 ヶ月以上
Lead Time for Changes(LT)commit → 本番までの時間1 時間未満1 日〜1 週1 週〜1 ヶ月1 ヶ月以上
Change Failure Rate(CFR)本番デプロイの失敗率0-15%16-30%16-30%16-30%
MTTR / Failed Deployment Recovery Time障害から復旧までの時間1 時間未満1 日未満1 日〜1 週1 ヶ月以上

2023 年版から、5 つ目の指標として「Reliability」(SLO 達成率、または運用上の信頼性)が追加された。これにより DORA は「速度(DF/LT)」「品質(CFR/MTTR)」「信頼性(SLO)」の 3 軸を測る完全体に。

💡 DORA と SRE の関係 DORA の MTTR と SRE の Error Budget は表裏一体:MTTR が長い = Error Budget 消費が大きい。DF と LT が高速でも CFR が高ければ Error Budget が枯渇 → リリース凍結。4 つを同時に改善することが「Elite performers」の条件。

1.7 SVG ダイアグラム — SRE 組織モデル

Dev チーム 機能開発 / リリース DF↑ / LT↓ を狙う SRE チーム 信頼性 / 自動化 / オンコール CFR↓ / MTTR↓ を狙う 共通 SLO + Error Budget SLO 99.9% / 月予算 43 分 残予算 > 50% → リリース自由 / 残 < 25% → 凍結 Error Budget Policy(事前合意の運用ルール) 残量に応じてリリース・信頼性投資を機械的に切替 → 障害時に揉めない
図 1-1:Dev と SRE が「共通 SLO」で合意することで、感情論ではなく数値で運用判断を行う

2SLI / SLO / SLA 数学的定義

「SLI / SLO / SLA を 1 分で説明せよ」は SRE 試験のスタート地点。正しい数式桁ごとのダウンタイム数値を暗記すれば、応用問題は機械的に解ける。逆にここがブレるとすべての問題で迷う。

2.1 正確な定義式

📐 数式 — SLI / SLO / SLA / Error Budget
SLI (Service Level Indicator)
  = good_events / valid_events           ← リクエストベース
  または
  = good_windows / total_windows         ← ウィンドウベース

SLO (Service Level Objective)
  = SLI に対する内部目標値(target)
  例:SLI ≥ 99.9% を 30 日間 rolling で維持

SLA (Service Level Agreement)
  = 顧客との契約値 + 違反時のペナルティ(返金 etc)
  通常: SLA < SLO(バッファを取る)

Error Budget
  = 1 − SLO
  例:SLO 99.9% → Error Budget = 0.1% = 月 43.2 分

Burn Rate
  = 実際のエラー率 / (1 − SLO)
  例:実エラー率 1.44% / 0.1% = 14.4x(=  Fast burn)

2.2 SLI / SLO / SLA の数値関係(覚え方)

「文字並びは SLI < SLO < SLA だが、数値の大小は SLA < SLO < SLI」 という逆転関係を必ず把握する。

SLA  99.9%   ←  顧客契約(最も低い保証)  下回ったら返金
SLO  99.95%  ←  内部目標(バッファあり)    下回ったら信頼性投資
SLI  99.98%  ←  実測値(実際の運用)       現状

[なぜこの順?]
  - SLA は契約 → 絶対下回ってはいけない → 余裕を持って低く
  - SLO は SLA を絶対下回らないための内部ライン → SLA より高く
  - SLI は理想的にはずっと SLO 以上 → 実測が一番高くなるよう運用

2.3 リクエストベース SLI vs ウィンドウベース SLI

📦 Request-based SLI

SLI = good_requests / valid_requests

例:直近 28 日の HTTP 成功率
  good   = HTTP 2xx + 3xx + 4xx(client error は除外可)
  valid  = 全 HTTP requests
  → SLI = good / valid

用途:HTTP API、トランザクション系、ほとんどのオンライン serving。ユーザー視点に近い

長所:直感的、Burn Rate 計算が自然、SRE Workbook の Multi-burn-rate がそのまま使える。

🪟 Window-based SLI

SLI = good_windows / total_windows

例:1 分ウィンドウで「成功率 99% 以上」が good
  ウィンドウサイズ = 1 分
  good = 「1 分内の成功率 ≥ 99%」のウィンドウ数
  → SLI = good / 全ウィンドウ数

用途:バッチ処理、データパイプライン、定期実行ジョブ、stream processing。

落とし穴1 リクエストでも失敗 = ウィンドウ全体が bad になる定義だと、SLI が極端に厳しくなる。閾値の取り方で SLI が乱高下する。

2.4 良い SLI の 4 条件(SRE Workbook Ch.2)

条件意味実例
1. ユーザーに影響するSLI 低下がユーザー体験低下と一致するHTTP 成功率 ○/CPU 使用率 ×
2. 集計可能(aggregatable)サブセットを足し合わせて全体 SLI を計算できるrequest counter ○/平均レイテンシ ×(平均の平均は誤り)
3. シンプル少数精鋭、複雑な合成は避ける5xx ratio ○/「ML スコア × クリック率 × ...」×
4. 直近の状態を反映古すぎず、リアルタイムに近い5 分集計 ○/日次集計 △(即時 alert 不可)

2.5 SLI 設計のアンチパターン

❌ Uptime check だけ

「/healthz が 200 を返す」だけで SLO を組む → 主要 API が 500 を返してもアラートが鳴らない。Uptime check は 補助、ユーザー体験を表す real traffic ベースの SLI が主軸。

❌ CPU 使用率を SLI に

CPU 高 = ユーザー影響、とは限らない。CPU 100% でもレスポンスが早ければユーザーは満足。CPU は Saturation 監視には使えるが SLI ではない

❌ 平均レイテンシ

平均は外れ値で大きく歪む。100 req のうち 1 件が 30 秒、99 件が 100ms → 平均 400ms(しかし p99 = 30 秒、ユーザー体験は崩壊)。必ず percentile(p95/p99/p99.9)を使う。

❌ 100% SLO

「100% 信頼性」は不可能。100% SLO = リリース完全凍結。SLO を 99.999% より高くするとコストが指数的に増え、ROI がマイナスになる。「ユーザーが気づく程度の信頼性」を目指す。

❌ ノード数 / Pod 数を SLI に

「Pod が 10 個いる」≠「サービスが正常」。リソース数はサービス品質ではない。リクエスト成功率と latency を見るべき。

❌ サーバー側だけ計測

クライアントは LB に到達できず failed しているのに、サーバー側 SLI は 100%。クライアント側 SLI(synthetic monitoring、real user monitoring)を併用する。

2.6 桁ごとのダウンタイム数値表(必須暗記)

SRE 試験で最も頻出のテーブル。「SLO 99.9% で月どれだけ落ちて良いか」を即答できないと話にならない。

SLO通称Error Budget1 週間1 ヶ月(30 日)1 四半期(90 日)1 年(365 日)
99%two nines1%1.68 時間7.2 時間21.6 時間87.6 時間(3.65 日)
99.5%0.5%50.4 分3.6 時間10.8 時間43.8 時間(1.83 日)
99.9%three nines0.1%10.1 分43.2 分2.16 時間8.76 時間
99.95%0.05%5.04 分21.6 分64.8 分4.38 時間
99.99%four nines0.01%1.01 分4.32 分12.96 分52.6 分
99.999%five nines0.001%6.05 秒25.9 秒1.30 分5.26 分
99.9999%six nines0.0001%0.6 秒2.59 秒7.78 秒31.5 秒
💡 暗記の語呂(試験で 30 秒以内に思い出す)
  • 99% → 月 7.2h/年 87.6h("two nines"。月 1 日近く落ちて OK、SaaS としては論外)
  • 99.9% → 月 43m/年 8.76h("three nines"。月 1 ライブ配信分の余裕、一般 SaaS の標準)
  • 99.99% → 月 4.3m/年 52.6m("four nines"。月 4 分 = 1 デプロイ失敗で半分消費)
  • 99.999% → 月 26s/年 5.26m("five nines"。電話・決済・救急レベル。multi-region 必須)
  • 「nines を 1 つ追加するごとに 許容時間は 1/10」← この比例関係だけ覚えれば全部導出可

2.7 SLO 達成のコスト関数(指数的に増加)

SLO(信頼性) コスト(log) 99% 99.9% 99.99% 99.999% 99.9999% ×1 ×10 ×100 ×1000 ×10000 「Nines」を 1 つ追加 = コスト 10x 必要技術:multi-region、active-active、 専用ハード、ホットスタンバイ、24/7 SRE
図 2-1:信頼性のコストは「nines」を追加するごとに指数(10x)的に増加。99.99% を超えると ROI が急速に悪化する

「ユーザーが気づかない高信頼性は過剰投資」。たとえば社内管理ツールに 99.999% は無駄。逆に決済 / 医療 / 通信は 99.99% でも足りない。「ユーザーが本当に求める信頼性」を調査して決める。

2.8 SLO の Compliance Period(カレンダー vs ローリング)

📅 Calendar-aligned Window

暦月・暦週・暦四半期で評価。SLA / 契約に紐づく。「月初リセット」型。月初に予算満タンでスタートし、月末で評価。

  • 長所:請求・契約レポートと自然に整合
  • 短所:月末に大障害 → 翌月リセットで何もしない、という抜け道
  • 用途:SLA reporting、CFO 向けレポート

🔄 Rolling Window

「直近 N 日」で常時評価(例:rolling 28 days)。連続的に SLO を計測。任意時点で「過去 28 日の SLI」を確認できる。

  • 長所:「月末リセットで甘くなる」を防ぐ
  • 短所:人間の暦感覚(月次レポート)とズレる
  • 用途:内部運用、Cloud Monitoring デフォ(最大 30 日)
「Cloud Monitoring supports compliance periods of calendar week, calendar month, or rolling 1〜30 days.」 — Cloud Monitoring create SLO

2.9 事故ケース集(SLI / SLO 設計)

事故 #1:SLO 99.99% を盲目的に目指してアプリチーム疲弊
状況新規 SaaS のため "とりあえず four nines" と決めた。実際の SLI は 99.8% 程度。
結果毎月 Error Budget が 5 倍超過、リリース凍結が常態化、開発速度ゼロ、エンジニア離職。
原因ユーザー要求の調査なし、現状 SLI とのギャップ無視。「nines を多くすれば偉い」という誤解。
対処SLO を 99.5% に再設定。3 ヶ月の SLI 観測 → 段階的に引き上げ(99.5 → 99.7 → 99.9)。Error Budget Policy を再合意。
事故 #2:ウィンドウベース SLI で 1 リクエスト失敗 = 違反
状況「1 分ウィンドウ内の成功率 100%」を good と定義 → 1 件でも 5xx あればウィンドウ全体が bad。
結果SLI が 80% 程度に低迷(実エラー率は 0.5% に過ぎないのに)。Burn rate 常時発火、誤検知でオンコール疲弊。
原因ウィンドウ閾値設計ミス(100% は厳しすぎる)。
対処「1 分内成功率 ≥ 99%」を good に変更。またはリクエストベース SLI に切替(推奨)。
事故 #3:SLA を SLO と同値にして契約違反多発
状況SLA = SLO = 99.9% に設定。実 SLI が 99.85% で SLA も自動違反。
結果毎月返金発生、顧客の信頼失墜。
原因SLA にバッファ無し。本来は SLA < SLO < SLI の階層を作るべき。
対処SLA 99% / SLO 99.9% / SLI 99.95% の 3 階層に再設計。SLI で SLO を守り、SLO で SLA を守る。
事故 #4:CPU 使用率を SLI にして「正常」表示なのに顧客クレーム
状況「CPU < 80% を good」と定義した SLI 99.9%。ダッシュボードは全てグリーン。
結果下流の DB がボトルネックで HTTP 95% が timeout、しかし SLI は 100%(CPU は余裕)。顧客から「サイトが遅い / 落ちている」苦情多数。
原因SLI がユーザー体験を反映していない。CPU は Saturation の指標であって SLI ではない。
対処SLI を HTTP 成功率 + レイテンシ p99 に変更。CPU は Monitoring の補助指標として残す。
事故 #5:平均レイテンシ SLI で p99 災害を見逃す
状況「平均レイテンシ < 200ms」を SLI に。ダッシュボードでは 150ms で常時 OK。
結果p99 は 5 秒を超え、ヘビーユーザー(VIP 顧客)が大量解約。平均は OK でも、上位 1% は崩壊していた。
原因平均は外れ値で歪む。SRE の鉄則 = 必ず percentile を使う
対処SLI を「p99 < 500ms の割合」に変更。p50 / p95 / p99 / p99.9 を分けてダッシュボード化。
事故 #6:100 個の SLO で誰も追えなくなる
状況「全マイクロサービスに SLO」と決めて 100+ サービス × 4 SLI = 400 SLO を作成。
結果誰も全体把握できず、本当に重要な SLO が埋もれる。Burn rate alert が常時何かしら発火、慢性疲労。
原因「Less is more」の SRE 原則違反。サービス数ではなく Critical User Journey ベースで SLO を絞るべき。
対処主要 CUJ(カート→決済、検索→閲覧、ログイン)× 3 つに集約。サブサービスは内部 SLI(観測のみ、alert なし)に降格。
事故 #7:サーバ側だけ SLI で「正常」、実際は LB の前で全 fail
状況SLI を「nginx access log の 2xx ratio」で計測。サーバ側 SLI は 100%。
結果実は GLB の SSL 証明書失効でクライアントが TLS handshake 失敗 → サーバまで到達せず、サーバ側ログには記録なし。
原因「fail したリクエストはログに残らない」盲点。サーバ側 SLI だけだと 到達前障害が見えない
対処クライアント側(synthetic、RUM、LB ログ)の SLI を併用。LB の HTTP(S) log を Cloud Logging に転送し、SLI 計算に使う。
🔑 試験頻出パターン(SLI/SLO/SLA)
  • 「ユーザー影響を最小監視」 → Four Golden Signals
  • 「アプリ無改修で SLO 計測」 → Cloud Service Mesh の istio_requests_total
  • 「SLO 99.9% の月予算」43 分
  • 「99.99% の年予算」52.6 分
  • 「平均レイテンシで監視」→「percentile を使え」
  • 「100% SLO は不可能」「コスト指数増」
  • 「サーバ側だけでなくクライアント側 SLI も」

3Error Budget 完全理解

Error Budget は SRE の最重要発明。「リリース速度」と「信頼性」のトレードオフを数値で議論可能にする。試験では Burn Rate の計算式Multi-window Multi-burn-rate の 3 段Error Budget Policy の発動条件がほぼ必ず問われる。

3.1 Error Budget の数式と意味

📐 数式 — Error Budget
Error Budget = 1 − SLO

例:SLO 99.9% (rolling 30 days)
  Error Budget = 0.1%
              = 30 days × 24h × 60min × 0.001
              = 43.2 分(時間ベース)
  または
              = total_requests × 0.001(リクエストベース)

例:SLO 99.99%、月 100 万 req
  許容 bad req = 1,000,000 × 0.0001 = 100 req / 月

意味:
  「43 分(または 100 req)までは failure してよい」
  → リリース・実験のリスクテイク予算
  → ゼロ消費を目指すのではなく、計画的に使う

Error Budget は「消費を悪と考えない」のが鉄則。Error Budget が余っているのにリリースしないのは機会損失。新機能リリースには必ず信頼性リスクがあるため、Error Budget の範囲内ならリスクを取って早く出すべき。

3.2 Burn Rate の計算式

📐 数式 — Burn Rate
Burn Rate = 観測期間の実エラー率 / (1 − SLO)

例:SLO 99.9% (Error Budget = 0.1%)
  観測期間 1 時間で実エラー率 1.44%
  Burn Rate = 1.44% / 0.1% = 14.4x

意味:
  Burn Rate 1x   = SLO 期間全体(30 日)で予算をちょうど使い切るペース
  Burn Rate 2x   = 15 日で使い切る
  Burn Rate 14.4x = 約 50 時間で使い切る(30d / 14.4)
  Burn Rate 6x   = 5 日で使い切る
  Burn Rate 60x  = 12 時間で使い切る

Burn Rate ↔ 予算消費率 ↔ 残時間の早見表(SLO 30 日)

Burn Rate1 期間(30 日)で消費1 時間で消費残予算を使い切る時間推奨アクション
1x100%0.14%30 日正常運用
2x200%0.28%15 日注意観察
6x600%0.83%5 日Page(Medium burn)
14.4x1,440%2.0%50 時間Page(Fast burn)
60x6,000%8.3%12 時間P0 incident、即時 mitigation
720x72,000%100%1 時間完全 outage、緊急 escalation

3.3 Multi-window Multi-burn-rate Alerting(SRE Workbook Ch.5)

SRE Workbook Ch.5 の推奨アラート設計。1 つのウィンドウだけだと「短期スパイクで誤検知(false positive)」または「長期で見落とし(false negative)」が起きるため、複数ウィンドウを AND で組み合わせる

「For example, an alert configured for a 1-hour window with a 14.4 burn rate fires when 2% of the budget is consumed in 1 hour.」 — SRE Workbook Ch.5 Table 5-8

SRE Workbook 推奨:99.9% SLO の 3 段アラート

重要度Long WindowShort WindowBurn Rate予算消費通知先SLA
Page(Fast)1 時間5 分14.4x2% / 1hPagerDuty15 分以内応答
Page(Medium)6 時間30 分6x5% / 6hPagerDuty1 時間以内応答
Ticket(Slow)3 日6 時間1x10% / 3dJira / Slack営業時間内応答
💡 ショートウィンドウ = ロングウィンドウ / 12 のルール

SRE Workbook の推奨:short window = long window × 1/12。これにより「問題が継続している」確認になり、一時的スパイクで発火しない。1h → 5min (1/12)、6h → 30min (1/12)、3d → 6h (1/12) の関係を覚える。

判定ロジック(疑似コード)

def should_alert_fast_burn(slo, errors, window_long='1h', window_short='5m'):
    burn_long  = error_rate(window_long)  / (1 - slo)
    burn_short = error_rate(window_short) / (1 - slo)
    # AND 条件:両方 14.4x を超えた時のみ発火
    return burn_long > 14.4 and burn_short > 14.4

# 効果:
#  - long のみだと 5 分で復旧した spike も 1 時間後まで発火継続
#  - short のみだと 30 秒の一時 burst でも発火 → false positive
#  - AND にすることで「長期傾向 AND 現在も継続」のみ通知

Burn Rate Alert の SVG ロジック図

時間 (分) エラー率 (%) SLO 0.1% × 14.4 = 1.44% SLO 0.1% × 6 = 0.6% Burn Rate 0 Fast burn (14.4x) Medium burn (6x) 5min ウィンドウだけだと spike (220-260) で発火→収束で flapping 1h AND 5min で「現在も継続」確認→ 真の障害だけ発火
図 3-1:Burn Rate Alert のロジック。Long Window(傾向)AND Short Window(現在)で flapping を防ぐ

3.4 数値計算例:実際にアラートが発火するか

ケースSLO観測(直近 1h)burn_long観測(直近 5m)burn_shortFast burn 発火?
A99.9%10,000 req / 144 err (1.44%)14.4x1,000 req / 15 err (1.5%)15x✅ 発火(両方 ≥ 14.4)
B99.9%10,000 req / 200 err (2%)20x1,000 req / 5 err (0.5%)5x❌ 不発火(short 不足)
C99.9%10,000 req / 50 err (0.5%)5x1,000 req / 20 err (2%)20x❌ 不発火(long 不足)
D99.95%20,000 req / 144 err (0.72%)14.4x2,000 req / 15 err (0.75%)15x✅ 発火
E99.99%50,000 req / 72 err (0.144%)14.4x5,000 req / 8 err (0.16%)16x✅ 発火

ケース B・C が重要。「片方だけ高くても発火しない」のが Multi-window の本質。B はかつての大障害が収束したケース(過去 1h に蓄積したが現在は OK)、C は瞬間 burst(5m だけ悪化、1h で見ると無視できる)。

3.5 Error Budget Policy(消費レベル別対応)

Error Budget Policy = 「予算残量に応じた事前合意ルール」。障害時に「リリースして良いか」を感情で議論しないために、平時に合意しておく。Dev / SRE / プロダクトオーナー が署名する。

残予算状態新機能リリースリスクある変更信頼性投資エスカレーション
100% – 75%Healthy自由許容通常不要
75% – 50%Caution慎重にCanary % を小さく軽度強化SRE Lead に共有
50% – 25%Warning機能と信頼性 50:50事前レビュー必須優先度上げEngineering Manager
25% – 0%Critical新機能凍結禁止100% 集中Director
0% 以下Burned完全凍結禁止全リソース投入VP / CTO 承認
💡 Policy の例外条項(必須)
  • セキュリティパッチ:予算枯渇でも適用可(リスク評価のうえ)
  • 規制対応 / 法的対応:適用可
  • 「VP 承認」のリリース:例外承認パス(濫用防止のため明確な書面承認)
  • 顧客個別緊急対応:feature flag 限定で展開可

3.6 Cloud Monitoring SLO の作成手順

Cloud Monitoring の Service Monitoring 機能で、コンソール / API / IaC で SLO を作成。Burn Rate Alert は自動生成可能

① Service 定義 Cloud Run / GKE / Anthos / Custom ② SLI タイプ選択 Availability / Latency / Custom ③ Good/Bad 基準 e.g. HTTP 2xx+3xx を good ④ Goal 設定 99.9% / 99.95% ⑤ Compliance Period Calendar week/month or Rolling 1-30 days ⑥ Burn Rate Alert 自動生成 Fast burn / Slow burn のセット ⑦ Notification Channel PagerDuty / Slack / Webhook ⑧ 運用フィードバックループ SLI 観測 → Burn rate alert → mitigation → Error Budget Policy 発動 四半期レビュー:SLO 目標値、ウィンドウ、burn rate 閾値を見直し Postmortem Action Items → 信頼性投資 → 次期 SLI 改善 SLO 達成率が常に 100% → SLO が緩すぎ、引き上げ検討
図 3-2:Cloud Monitoring での SLO 作成フロー(8 ステップ)と運用フィードバック

Service Monitoring API 定義例

# SLO 定義(Cloud Monitoring API)
displayName: "Checkout API availability"
serviceLevelIndicator:
  requestBased:
    goodTotalRatio:
      goodServiceFilter: |
        metric.type="loadbalancing.googleapis.com/https/request_count"
        AND metric.label.response_code_class="2xx"
        AND resource.label.url_map_name="checkout-lb"
      totalServiceFilter: |
        metric.type="loadbalancing.googleapis.com/https/request_count"
        AND resource.label.url_map_name="checkout-lb"
goal: 0.999                    # SLO 99.9%
rollingPeriod: 2419200s        # 28 日 (rolling)
# またはカレンダーアライン
# calendarPeriod: MONTH

---
# Burn Rate Alert(Fast Burn)
displayName: "Checkout SLO Fast Burn"
conditions:
- displayName: "Fast burn over 1h AND 5min"
  conditionThreshold:
    filter: |
      select_slo_burn_rate("projects/PRJ/services/checkout/serviceLevelObjectives/avail", "3600s")
    comparison: COMPARISON_GT
    thresholdValue: 14.4
    duration: 300s             # 5min 継続でトリガ
notificationChannels:
  - "projects/PRJ/notificationChannels/pagerduty-prod"

3.7 事故ケース集(Error Budget / Burn rate)

事故 #8:Burn rate alert の flapping でオンコール疲弊
状況5 分ウィンドウ単独で「burn rate > 14.4 で発火」と設定。
結果1 件失敗 → 5 分間 alert → 復旧 → 5 分後 alert 解除 → 再失敗 → 再 alert ... を 1 時間に 10 回繰り返し、PagerDuty が深夜に 10 回鳴る。
原因短期ウィンドウ単独は低トラフィック時にノイズが激しい(1 件で大きな % 変動)。
対処Multi-window 化(1h AND 5min)。両方の AND 条件で発火するようにロジック修正。
事故 #9:Slow burn を無視してリリース継続 → 月末に予算枯渇
状況Slow burn alert (1x / 3 日) が ticket で起票されたが、開発チームが「軽微」と判断し放置。
結果1 ヶ月で予算 110% 消費。SLA 違反で返金、Director エスカレーション。
原因Slow burn は「重大ではない」が「持続的」。1x のペースが 3 週間続けば確実に予算枯渇。
対処Error Budget Policy を厳格化:Slow burn ticket は 48h 以内対応 SLA、未対応で自動エスカレーション。
事故 #10:複数 SLI の組み合わせで意図しないアラート連鎖
状況Availability、Latency、Freshness の 3 SLI 各々で Fast burn alert を設定。
結果DB 障害時に 3 つの SLI が同時悪化 → PagerDuty が 3 件発火 → 3 人別々に起こされ、調整に時間を浪費。
原因SLI 間の相関を考慮せずに alert を作った。同一インシデントに複数アラート。
対処SLI ごとに alert を分けず、「Service レベルで集約」。Alert grouping(PagerDuty deduplication)有効化。Critical SLI(Availability)のみ Fast burn、他は Slow burn に降格。
事故 #11:低トラフィック時間帯に Burn rate が無意味に振動
状況夜間 3:00-5:00 のトラフィック 1/100 に低下。1 件失敗で SLI が 50% に低下、burn rate 500x。
結果毎日深夜に false positive alert、SRE が夜中起こされる。
原因低トラフィックでは分母が小さく、1 件で SLI が暴れる。Burn rate 計算が無意味。
対処最低リクエスト数閾値」を導入(例:1h 内 1000 req 未満ならアラート無効)。または時間帯別 SLO(夜間は 99% に緩和)。
事故 #12:Calendar SLO で月末リセット狙い「月末に大障害」
状況Calendar-aligned 月次 SLO。月末 28 日目に大障害 → 残予算 5% を使い切り。
結果月初リセットを期待して「次月のために何もしない」3 日間。SLA 違反は確定したが、改善努力ゼロ。
原因Calendar 型の抜け道。月末障害が「次月に持ち越されない」ため、改善インセンティブが消える。
対処Rolling 28-day SLO に変更。常に「直近 28 日」で評価されるため、月末障害は次月も予算消費にカウントされる。

4Cloud Service Mesh の SRE 機能

Cloud Service Mesh(旧 Anthos Service Mesh / ASM)は、Istio をベースにした Google Cloud マネージドサービスメッシュ。アプリ無改修で SLO 計測・mTLS・トラフィック制御を実現。試験では「アプリに手を入れずに SLI 収集」「マイクロサービス間の相互認証」が問われたら、ほぼ Cloud Service Mesh が正解。

「Cloud Service Mesh supports two SLI types: latency and availability, set and monitored on the Health page using service telemetry.」 — Cloud Service Mesh SLO Overview

4.1 アーキテクチャ(Istio Control Plane + Envoy Sidecar)

Control Plane(Managed by Google) istiod (Pilot/Citadel/Galley) mTLS CA / 証明書管理 設定配信 / Discovery Pod (Service A) App Envoy Sidecar Pod (Service B) App Envoy Sidecar mTLS encrypted Telemetry → Cloud Monitoring(自動収集) istio_requests_total (リクエスト数 / response_code) istio_request_duration_ms (latency histogram) istio_request_bytes (リクエスト/レスポンスサイズ) → SLO(Availability / Latency)自動生成
図 4-1:Cloud Service Mesh のアーキテクチャ。Sidecar が全リクエストをインターセプトし、テレメトリと mTLS を提供

4.2 主要メトリクスと SLO 定義(PromQL)

メトリクス主要 label用途
istio_requests_totalcounterdestination_service / response_code / reporterAvailability SLI
istio_request_duration_millisecondshistogramdestination_service / leLatency SLI(p99 計算)
istio_request_byteshistogram同上リクエストサイズ分布
istio_response_byteshistogram同上レスポンスサイズ分布
istio_tcp_sent_bytes_totalcounterdestination_serviceTCP 通信量

Availability SLI(PromQL)

# 成功リクエスト / 全リクエスト(destination 側から見た)
sum(rate(istio_requests_total{
  destination_service="checkout.prod.svc.cluster.local",
  response_code!~"5..",
  reporter="destination"
}[5m]))
/
sum(rate(istio_requests_total{
  destination_service="checkout.prod.svc.cluster.local",
  reporter="destination"
}[5m]))

Latency SLI(PromQL)

# p99 レイテンシ
histogram_quantile(0.99,
  sum(rate(istio_request_duration_milliseconds_bucket{
    destination_service="checkout.prod.svc.cluster.local"
  }[5m])) by (le)
)

# あるいは「p99 ≤ 500ms の割合」を SLI に
sum(rate(istio_request_duration_milliseconds_bucket{
  destination_service="checkout.prod.svc.cluster.local",
  le="500"
}[5m]))
/
sum(rate(istio_request_duration_milliseconds_count{
  destination_service="checkout.prod.svc.cluster.local"
}[5m]))

4.3 SLO 定義例(Cloud Service Mesh コンソール / API)

# Cloud Console → Cloud Service Mesh → Services → SLO 作成
displayName: "Checkout latency p99 ≤ 500ms"
serviceLevelIndicator:
  basicSli:
    latency:
      threshold: 0.5s
    method: ["GET", "POST"]
    location: ["asia-northeast1"]
goal: 0.999
rollingPeriod: 2419200s

# Availability SLO
displayName: "Checkout availability"
serviceLevelIndicator:
  basicSli:
    availability: {}    # 自動で 2xx-3xx を good 扱い
goal: 0.9995
calendarPeriod: MONTH

4.4 mTLS / 認可ポリシー / トラフィック制御

機能YAML 例用途
mTLS(PeerAuthentication)mode: STRICT / PERMISSIVE / DISABLEサービス間相互 TLS 認証
AuthorizationPolicyallow / deny rule(principal / source / path)L7 認可(誰がどの URL を呼べるか)
VirtualServiceroute / weight / matchトラフィック分割(canary / A-B)
DestinationRulesubset / circuitBreaker / loadBalancerサービスレベル設定(subset、CB)
Gatewayport / host / TLS外部公開(North-South ingress)

mTLS STRICT 設定例

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT          # mesh 内通信は必ず mTLS、平文拒否

---
# 段階移行は PERMISSIVE → STRICT(legacy app を含む場合)
spec:
  mtls:
    mode: PERMISSIVE      # mTLS と平文の両方を受け付け

Canary トラフィック分割(VirtualService)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: checkout
spec:
  hosts: [checkout.prod.svc.cluster.local]
  http:
  - route:
    - destination:
        host: checkout
        subset: v1            # 安定版
      weight: 90              # 90%
    - destination:
        host: checkout
        subset: v2            # 新版(canary)
      weight: 10              # 10%

4.5 Managed Cloud Service Mesh vs OSS Istio(インクラスタ)

観点Managed Cloud Service MeshOSS Istio(自前運用)
Control plane 管理Google が管理(istiod は managed)自前で istiod デプロイ・運用
アップグレード自動(チャンネル:rapid / regular / stable)手動、互換性検証必須
SLAGoogle から SLA 提供なし(自前運用)
Cloud Monitoring 統合自動(SLO UI、burn rate alert)手動(Prometheus → GMP)
mTLS CAGoogle マネージド CA自前 CA 運用(cert-manager 等)
コスト追加課金あり(per-pod)無料(OSS)だが運用コスト大
マルチクラスタFleet ベースで簡単複雑(root CA 共有、network 設定)
💡 試験での選定指針 「マルチクラスタで一元的に SLO 管理」「Google が CA と control plane 管理」「アップグレード自動」→ Managed Cloud Service Mesh。OSS Istio は試験ではほぼ正解にならない(PCDE は GCP マネージドサービス優先)。

4.6 事故ケース集(Cloud Service Mesh)

事故 #13:Sidecar OOM でリクエスト全停止
状況Envoy sidecar のメモリ要求 64Mi、実使用が 200Mi に達する大トラフィック時。
結果Sidecar が OOM Kill → Pod が再起動ループ → Service 単位で 503 多発。
原因Sidecar resource limits の見積もり不足。Istio config が大きい(多数の VirtualService)と Envoy メモリも増える。
対処Sidecar の memory request/limit を 256Mi / 512Mi に増加。Sidecar リソースで namespace スコープを絞り、Envoy が読む config を最小化。Cloud Profiler で sidecar の usage を継続監視。
事故 #14:mTLS STRICT 強制で legacy アプリ通信不可
状況新規アプリは mTLS 対応だが、レガシー HTTP only サービスがある状態で、いきなり mtls.mode: STRICT 適用。
結果レガシーサービスからの inbound が全て拒否。本番障害 30 分。
原因段階移行を経ずに STRICT を全 mesh に適用。
対処PERMISSIVE → STRICT の段階移行。① PERMISSIVE で mTLS と平文両受け、② レガシーを sidecar 注入し mTLS 化、③ kiali で 100% mTLS 確認、④ STRICT に切替。
事故 #15:AuthorizationPolicy の deny が全 namespace に波及
状況namespace 指定を忘れ、root namespace (istio-system) に deny ポリシーを作成。
結果mesh 全体に deny が適用、全マイクロサービス通信不可。
原因istio-system namespace のポリシーはmesh 全体に適用される仕様の見落とし。
対処ポリシーを正しい namespace に移動。CI で「root namespace への AuthorizationPolicy 作成は禁止」の policy gate(OPA)を導入。

5オートスケール完全攻略

Google Cloud のオートスケーリングは MIG(VM)/ Cloud Run(サーバーレス)/ GKE(HPA + VPA + CA + NAP)の 3 プロダクトファミリ。試験では「適切な autoscaling 方式の選択」「HPA と VPA の併用禁止」「PDB 設定漏れ」「min-instances の使い分け」が頻出。

5.1 Managed Instance Group(MIG)— VM の自動スケール

MIG Autoscaling Policy の 5 種類

ポリシーシグナル用途注意
CPU utilizationVM 平均 CPU汎用、CPU バウンドアプリデフォルト 60%(推奨)
Load balancing utilizationHTTP(S) LB のバックエンド使用率Web サーバ、APIBackendService の maxUtilization と連動
Custom metricCloud Monitoring の任意メトリクスキュー長、RPS、業務メトリクスper-instance / per-group / per-target を選択
Schedule-basedcron 的時間ベース予測可能な負荷ピーク(平日 9:00-18:00 等)min を時間帯で引き上げ
Predictive autoscaling過去 7-21 日のパターン予測起動が遅い VM、規則的な日次パターン事前 warm up、予測誤差は再現

MIG 設定例(CPU + Custom metric)

gcloud compute instance-groups managed set-autoscaling app-mig \
  --zone=asia-northeast1-a \
  --min-num-replicas=3 \
  --max-num-replicas=50 \
  --target-cpu-utilization=0.6 \
  --custom-metric-utilization=metric=custom.googleapis.com/queue_length,utilization-target=100,utilization-target-type=GAUGE \
  --cool-down-period=90 \
  --mode=ON           # OFF / ONLY_SCALE_OUT で逆 scale 防止可

Predictive Autoscaling

過去 7-21 日のメトリクスパターンから「今後 N 分後の負荷」を予測し、事前にスケールアップする。起動時間が長い VM(Java / .NET / 大きな AMI)に有効。reactive scaling より遅延なくピークに対応できる。

--cpu-utilization-predictive-method=OPTIMIZE_AVAILABILITY
# またはコンソールで「Predictive autoscaling」ON

Stateful MIG

通常 MIG はステートレス(VM 置換自由)。Stateful MIG は VM 単位で disk・metadata を保持。自己ホスト DB(Cassandra、Elasticsearch)、stateful レガシーアプリで使う。

5.2 Cloud Run — サーバーレスの自動スケール

主要パラメータと推奨値

パラメータ意味デフォルト推奨
--concurrency1 インスタンスあたりの並行リクエスト数80軽量 API: 80-1000 / CPU 重い: 1-10
--min-instances最小常駐インスタンス0レイテンシ重視: ≥ 1(cold start 回避)
--max-instances最大スケール100下流 DB 容量から逆算(コネクション数)
--cpu-throttlingリクエスト時のみ CPU 割当trueバックグラウンド処理あり → false(CPU always)
--startup-cpu-boost起動時 CPU 倍増(gen2)falseJVM・大型 init → true
--cpu / --memoryper-instance リソース1 vCPU / 512Mi負荷テストで決定
--no-cpu-boostboost 無効化コスト抑制で OFF も

Cold Start を潰す 5 つのテクニック

  1. min-instances ≥ 1:最も即効。常時 1 インスタンス温存(cold start 発生回数を激減)
  2. Startup CPU Boost:gen2 で起動時 CPU を一時的に最大化(Java / Spring Boot で 30-50% 短縮)
  3. 軽量ランタイム選択:Go / Python / Node.js は起動 100-500ms、Java は 5-15s
  4. Lazy initialization:起動時の重い処理を最初のリクエスト後に delay(ただし最初のリクエストは遅い)
  5. Container size 最小化:マルチステージビルド、distroless image、layer cache 最適化
💡 min-instances vs コスト:トレードオフの計算
min-instances = 1 で 24/7 常駐
  → 月 720h × (1 vCPU + 512Mi) = 月 $35-50 程度
  → cold start 回避できる代わりに、ピーク外でも常時課金

min-instances = 0
  → リクエストゼロ時は完全停止、コスト最小
  → cold start で p99 が +2-10 秒

判断軸:
  - ユーザー対面で latency SLO 厳しい → min-instances ≥ 1
  - 内部 API、バッチ起動 → min-instances = 0 で OK

CPU always allocated の判断軸

シナリオ推奨理由
HTTP リクエスト処理のみrequest 時のみ(default)コスト最小
バックグラウンド処理(response 後も処理継続)CPU always allocatedrequest 時のみだと CPU が切られて処理中断
WebSocket / SSE / ロングポーリングCPU always allocated接続維持に常時 CPU 必要
gRPC streamingCPU always allocatedstreaming RPC の CPU 維持
初期化重く後続で活用CPU always allocatedwarm な state を保持

5.3 GKE Horizontal Pod Autoscaler(HPA)

HPA の Metric Types

type用途
ResourceCPU / Memory標準。kubelet が cAdvisor から取得
PodsPod 単位の custom(例:rps_per_pod)Pod 平均で集計
Object外部リソースの metric(Ingress の rps 等)cluster 外部の数値
ExternalPub/Sub queue depth、Cloud SQL connectionsクラウド外部 metric(Stackdriver Adapter 経由)
ContainerResourcemulti-container Pod で特定コンテナの CPUsidecar あり Pod での精度向上(v1.27+)

HPA v2 の高度な behavior 設定

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata: { name: app }
spec:
  scaleTargetRef: { kind: Deployment, name: app }
  minReplicas: 3
  maxReplicas: 100
  metrics:
  - type: Resource
    resource: { name: cpu, target: { type: Utilization, averageUtilization: 70 } }
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300   # 5 分待って収まりを確認してから縮小
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60               # 1 分で 10% ずつ縮小
    scaleUp:
      stabilizationWindowSeconds: 0     # 即座に拡大
      policies:
      - type: Percent
        value: 100
        periodSeconds: 30               # 30s で倍増
      - type: Pods
        value: 4
        periodSeconds: 30               # または 30s で 4 Pod 増
      selectPolicy: Max                 # 両 policy の最大を選択

5.4 GKE Vertical Pod Autoscaler(VPA)

VPA はPod の CPU / Memory の requestを実使用量に基づき自動調整。Pod を再作成する。

VPA の Update Mode

mode挙動用途
Off推奨値を計算するのみ(適用しない)初期観測、手動チューニングの参考
InitialPod 起動時のみ recommendation を適用新規 Pod だけ最適化、既存はそのまま
Auto / Recreate稼働中 Pod も再作成して適用本番の自動最適化(注意:再起動連発リスク)
In-Place(α)Pod 再作成なしで request 更新1.27+ α 機能、本番投入は要検証
💡 VPA Auto mode の落とし穴

Pod recreation が頻発すると、レイテンシ spike や接続断が発生。本番では Off で recommendation を観測してから手動 / quarterly で適用、または memory only Auto(CPU は HPA、Memory は VPA)の役割分担が安全。

5.5 GKE Cluster Autoscaler(CA)

CA の profile(GKE 特有)

profile挙動用途
balanced(default)標準的な scale-down 判断(10 分 underutilized)汎用ワークロード
optimize-utilization積極的に scale-down、Pod packing 重視コスト最重視、stateless ワークロード

CA の scale-down 判定条件

  1. ノードのリソース使用率が 50% 以下(profile で変動)
  2. そのノードの全 Pod が他ノードに移動可能
  3. 10 分間 underutilized 継続(連続観測)
  4. PDB(Pod Disruption Budget)を尊重できる
  5. 削除禁止 annotation(cluster-autoscaler.kubernetes.io/safe-to-evict=false)がない
  6. kube-system Pod に制約がない(CoreDNS、metrics-server 等)
  7. local storage を使う Pod がない

Node Auto-Provisioning(NAP)

CA を超えて、Node Pool 自体を自動生成。Pending Pod の要求(CPU/Memory/GPU/特殊ハード)を読み、最適な machine type の Node Pool を新規作成。不要になれば削除。

gcloud container clusters update my-cluster \
  --enable-autoprovisioning \
  --min-cpu=10 --max-cpu=1000 \
  --min-memory=40 --max-memory=4000 \
  --autoprovisioning-scopes=https://www.googleapis.com/auth/cloud-platform \
  --autoprovisioning-service-account=nap-sa@PRJ.iam.gserviceaccount.com

5.6 HPA + VPA + CA + NAP 同時利用のベストプラクティス

✅ 推奨パターン

HPA = カスタムメトリクス(RPS / queue length)VPA = Memory only AutoCA = balanced profileNAP = GPU / 特殊ハードのみ。役割を分離することで衝突なし。

❌ NG パターン

HPA = CPU、VPA = CPU (Auto):CPU が上がる → HPA が Pod 増やそうとする一方、VPA は per-Pod CPU を増やそうとする → 矛盾、Pod 再作成が連鎖。同一メトリクス(特に CPU/Memory)での併用は公式に非推奨。

5.7 PDB(Pod Disruption Budget)— CA を機能させる鍵

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata: { name: app-pdb, namespace: production }
spec:
  minAvailable: 2          # 最低 2 Pod を常時保つ
  # または: maxUnavailable: 1
  selector:
    matchLabels: { app: my-app }

PDB は「voluntary disruption」(CA scale-down、ノードアップグレード、kubectl drain)に対する保証。involuntary(ノード障害、OOM)には効かない。CA が PDB を満たせない場合、scale-down は停止する → ノードが減らず、コスト増。

5.8 Pause Pod パターン(バースト対応)

低優先度の pause Pod を意図的に配置 → クラスタに「空き容量を持つように見せる」 → 本物の Pod が来たら pause Pod を退避、CA が即時に新ノード追加。cold start を回避する高度なパターン。

5.9 事故ケース集(オートスケール)

事故 #16:PDB 設定漏れで rolling restart が止まる
状況3 replica Deployment に PDB minAvailable: 3 設定。rolling update で 1 Pod 停止しようとしても PDB 違反で停止不可。
結果Rolling update が無限停滞、新版がデプロイされない。GKE node upgrade も止まる。
原因PDB の minAvailable が replica 数と同じ。1 つも落とせない設定。
対処PDB minAvailable: 2 または maxUnavailable: 1 に修正。replica 数 - 1 を最低保証する。
事故 #17:VPA Auto mode で Pod が再起動連発、API ダウン
状況VPA を Auto で稼働。負荷変動に応じて毎時 Pod recreation。
結果1 時間に 10+ 回 Pod 再起動。長期接続クライアントは毎回再接続、p99 latency が 10 倍に。
原因VPA の updaterPolicy(recommendation 変動の閾値)がデフォルトで敏感すぎ。
対処updateMode: Off で recommendation のみ取得 → 週次バッチで手動適用、② または --in-place α 機能で再起動なし更新、③ minReplicas 引き上げで PDB と組み合わせ。
事故 #18:Cloud Run min-instances を潰したらコスト 2 倍
状況Cold start 対策で 50 サービス全てに min-instances=10 を一斉設定。
結果月コスト $2,000 → $5,000 に。空きインスタンスで 24/7 課金。
原因「全部に min-instances」が雑。トラフィック特性無視。
対処SLO 厳しい主要 3 サービスだけ min-instances=2、他は 0。または時間帯別(昼間だけ ≥ 1)の schedule。
事故 #19:HPA + VPA 同一 CPU メトリクスで Pod 振動
状況HPA cpu averageUtilization: 70、VPA Auto mode で CPU 自動調整。
結果VPA が CPU request を上げる → CPU 使用率(%)が下がる → HPA が Pod 減 → 残 Pod で CPU 上がる → VPA がさらに request 上げ ... の振動ループ。レイテンシが激しく変動。
原因同じシグナル(CPU)を 2 つの autoscaler が制御。古典的な制御工学のオシレーション。
対処役割分担:HPA は RPS / queue length のような外部メトリクス、VPA は Memory only Auto。HPA と VPA を同じメトリクスで併用しない
事故 #20:MIG Predictive Autoscaling が誤予測で過剰スケール
状況季節キャンペーン後にトラフィック平常化したが、Predictive が「来週も同じ」と予測。
結果不要に 5 倍のインスタンスを保持、コスト超過。
原因Predictive は過去パターンを将来に投影。一時的イベントを「常態」と誤学習。
対処キャンペーン後は Predictive を一時停止、reactive scaling に戻す。Predictive は周期性のある安定パターンでのみ使う。

6キャパシティプランニング

容量計画 = 「必要なリソース量を予測し、適切なタイミングで確保する」工学。試験では Quotas vs Limits の違いReservations の種類Dynamic Workload Scheduler(DWS)Little's Law と Erlang C の基礎が問われる。

6.1 Quotas vs Limits の違い

📊 Quotas(割当量)

プロジェクト / リージョン単位の「ソフト上限」引き上げ申請可能。Cloud Console / gcloud / API で増額リクエスト → 数日〜数週間で承認。

  • Rate quota:QPS(1 分間の API 呼び出し数等)
  • Allocation quota:同時保持数(vCPU 数、IP 数、ディスク容量)
  • 監視:Cloud Monitoring の Quota dashboard、Forecast Alert(90% 到達予測)

🚧 Limits(制限)

サービスごとの「ハード上限」増やせない技術的限界。アーキテクチャで回避するしかない。

  • GCS 単一オブジェクト:5 TiB
  • Cloud Run リクエスト timeout:60 分
  • GKE Pod/Node:110(標準モード)
  • Cloud Build:24 時間 / 300 ステップ / 700 イメージ
  • Cloud Function gen1:540 秒 / 8GB

Quota 引き上げ申請のタイミング

利用率状態アクション
~50%余裕放置 OK、月次レビュー
50% – 70%監視Forecast Alert で「90% 到達 30 日前」を予告通知
70% – 90%申請開始引き上げリクエスト送信(承認 1-2 週間想定)
90%~緊急緊急申請 + サポートチケット、影響評価開始

6.2 Reservations(容量予約)

Compute Engine の VM 容量を事前に確保。起動時に「Stockout(在庫不足)」エラーを防ぐ。CUD(Committed Use Discount)と組み合わせて割引も可能。

タイプ挙動用途
Specific reservationVM 起動時に reservation 名を明示指定したものだけ消費競合せず確実、複数チーム環境
Any reservationマッチする全 VM が自動消費シンプル、単一チーム
Auto-consume起動時に「reservation あり / なし」を自動選択デフォルトで効率化
Block reservation同一物理ラック・低レイテンシ(InfiniBand / NVLink)HPC、AI 学習(GPU/TPU クラスタ)
Future reservation未来の特定日時から容量確保キャンペーン、Black Friday 等の計画

CUD(Committed Use Discount)との組み合わせ

種類コミット割引
Resource-based CUD特定 machine type × region × 1 or 3 年1 年: 25-37% / 3 年: 52-70%
Spend-based CUD(Flexible)金額コミットのみ(任意 region/machine type 可)1 年: 17% / 3 年: 41%

6.3 Dynamic Workload Scheduler(DWS)— GPU/TPU 専用

AI/ML ワークロードのための柔軟な容量確保サービス。希少な GPU(A100/H100)/ TPU を効率的に確保。

mode挙動期間用途
Flex-startキャパシティ空き次第即時開始(即時〜7 日待機)最大 7 日ファインチューニング、実験、中断耐性あるバッチ
Calendar指定日時から確実に確保7/14/30/90 日大規模 LLM pretraining、月次バッチ、研究プロジェクト
💡 試験での選定軸
  • 「待てる ML バッチ、最安で GPU 確保」 → DWS flex-start
  • 「来週から 30 日 H100 を確実に確保」 → DWS calendar mode
  • 「通常 VM、安定運用」 → Reservations + CUD
  • 「中断 OK、最安バッチ」 → Spot VM(最大 91% off)
  • 「同一ラック・GPU クラスタ」 → Block reservation

6.4 容量計画の数学(待ち行列理論の基礎)

Little's Law(リトルの法則)

📐 数式 — Little's Law
L = λ × W

L : システム内の平均リクエスト数 (concurrent requests)
λ : リクエスト到着率 (RPS)
W : 平均応答時間 (秒)

例:
  RPS = 1000、平均レイテンシ 200ms (0.2s)
  L = 1000 × 0.2 = 200 concurrent requests

→ Cloud Run concurrency = 80 の場合、必要 instances = 200/80 = 3 (最低)
→ Pod 数 = 200 (concurrency=1 のとき)

Little's Law は「Cloud Run の min-instances」「Pod 数」「DB connection pool」を計算するときの基礎。p99 レイテンシを使えば「99% のリクエストを捌くのに必要な容量」も導ける。

Erlang C — トラフィック理論ベースの容量計算

コールセンター / 待ち行列での 「N 個のサーバで、Q% 以内に応答するのに必要な台数」を計算。Webサーバの容量計算にも応用可。GKE / MIG の min replica 計算に内部的に使われる。詳細は試験では不要、「Erlang C は容量計算の理論」程度で OK。

6.5 季節性のあるトラフィック予測

周期対応
日次朝 9 時ピーク、深夜低Schedule-based autoscaling、Predictive
週次平日 vs 週末Schedule-based、Predictive (1 週パターン学習)
月次月末締め、給料日月次バッチで Reservations 一時追加
季節(年次)Black Friday、年末Future Reservations、CUD で先行確保
イベント駆動セール、ニュース掲載Cloud Armor rate limit + 容量緊急追加

6.6 RTO / RPO と DR スケナリオ

「RTO is the maximum acceptable length of time that your application can be offline. RPO is the maximum acceptable length of time during which data might be lost.」 — DR Planning Guide
シナリオRTORPO構成コスト
Cold(バックアップ復元)数時間〜日数時間〜日GCS バックアップ、復旧時に新環境構築最低
Warm(pilot light)数十分〜時間数分〜時間最小構成を別 region に常駐、スケール可能
Hot(active-passive)数分以内数秒〜分本番と同等を別 region に常駐、replication 継続
Active-Active(multi-region)0 秒(自動)0 秒(同期 replication)全 region で本番稼働、global LB で負荷分散最大

7インシデント対応の体系

SRE Workbook Ch.9 が体系化した Incident Command System(ICS)と、Mitigate first 原則がインシデント対応の核心。試験では「障害時に最初にやること」「IC の責務」「最速の止血手段」が頻出。

7.1 鉄則:影響緩和 → 容量追加 → ロールバック → 原因究明

🔑 SRE の鉄則 — Mitigate First, Fix Later
優先順位(必ずこの順で考える):

1. Mitigate(影響緩和)       ← 最優先・最速
   - Feature Flag OFF(秒単位で復旧)
   - Cloud DNS で別 region へ traffic 切替
   - LB connection draining
2. Add Capacity(容量追加)
   - HPA / max-instances 引き上げ
   - Reservations 投入
3. Rollback(ロールバック)
   - Cloud Deploy rollout rollback
   - Cloud Run revision traffic 100% 旧版
4. Root Cause Analysis(原因究明)  ← 後でよい
   - Postmortem で詳細分析

→ 「先に原因を突き止めよう」とすると、その間ユーザー影響継続
→ まず止血、診断は復旧後

7.2 Incident Command System(ICS)

米国の災害対応で使われる ICS を SRE に転用。役割を明確に分離することで、混乱の中でも判断を継続できる。大規模障害では役割分離が必須、小規模は兼任 OK。

Incident Commander (IC) 全体統率 / 決断 / 優先度判断 Operations Lead 実際の mitigation 作業 ハンズオン、rollback 実行 Communications Status Page / 顧客通知 社内 Slack / 経営報告 Planning 長期障害の戦略 リソース調達 Scribe タイムライン 記録 Subject Matter Experts (SMEs) DB / Network / Security / 各サービスオーナーから on-demand 召集 IC の指示で参加、解決後は退出
図 7-1:ICS の役割構造。IC は技術作業をせず判断に集中し、Ops が実作業を担当

役割の責務(試験頻出)

役割責務NG 行為
Incident Commander (IC)全体統率、優先順位決定、エスカレーション、Status Page 承認自分で技術作業をする(手を動かしてはいけない)
Operations Lead実際の mitigation 作業、rollback、コマンド実行IC の判断を待たずに勝手に大きな変更
Communications LeadStatus Page、顧客連絡、社内 Slack、経営報告不確実な情報を顧客に公開
Planning Lead長期障害の戦略、リソース調整、シフト計画—(大規模障害のみ)
Scribeタイムライン記録、決定事項の記録、Postmortem の素材記録漏れ(Postmortem の質が下がる)
SME専門領域の技術判断(DB、Network 等)

7.3 インシデントレベル(Severity)

Sev定義応答 SLA通知
Sev 1全社的影響、サービス完全停止、データ損失全 region 障害、決済 100% 失敗5 分以内PagerDuty、CTO、CEO、Status Page 即時更新
Sev 2重大な機能停止、多数のユーザー影響1 region 障害、主要 API 50% 失敗15 分以内PagerDuty、Engineering Manager
Sev 3部分機能停止、限定的ユーザー影響1 サービス障害、副次機能不具合1 時間以内Slack、当番エンジニア
Sev 4軽微、回避策ありUI 表示崩れ、cosmetic bug営業時間内Jira
Sev 5潜在的、ユーザー影響なし監視 gap、ドキュメント漏れ次 SprintJira backlog

7.4 影響緩和テクニック

GLB Connection Draining

HTTP(S) Load Balancer のバックエンドを安全に削除するための機能。新規 traffic を止めつつ既存接続を完了まで待つ。最大 3600 秒(60 分)

# 1. capacity-scaler を 0 にして新規トラフィック停止
gcloud compute backend-services update-backend my-bs \
  --instance-group=my-mig --instance-group-zone=asia-northeast1-a \
  --capacity-scaler=0

# 2. connection draining timeout を設定(既存接続を待つ)
gcloud compute backend-services update my-bs \
  --connection-draining-timeout=600  # 10 分

# 3. drain 完了を待ってから backend 削除
gcloud compute backend-services remove-backend my-bs \
  --instance-group=my-mig --instance-group-zone=asia-northeast1-a

Cloud DNS Weighted Routing / Failover Routing

DNS レベルで traffic を別 region に切替。weight を変更するだけ → TTL 内でクライアントに伝播。TTL を短く設定(60-300 秒)しておくのが運用の鍵。

# weighted routing(90/10 → 0/100 で即時切替)
gcloud dns record-sets create api.example.com. \
  --type=A --ttl=60 --zone=my-zone \
  --routing-policy-type=WRR \
  --routing-policy-data="90=1.1.1.1;10=2.2.2.2"

# 障害時:weight を 0/100 に変更
gcloud dns record-sets update api.example.com. \
  --routing-policy-data="0=1.1.1.1;100=2.2.2.2"

Multi-cluster Ingress(MCI)でリージョン切替

複数 GKE クラスタを 1 つの Anycast Global LB で公開。リージョン障害時に自動切替。Cloud DNS よりも切替が速い(DNS TTL 不要)。

Feature Flag による即時無効化

最速の止血手段。コードはデプロイしたまま、新機能だけを秒単位で無効化。試験で「最も早く影響を止める」と問われたらFeature Flag OFF

🐌 通常 Rollback(パイプライン経由)

  • 5〜15 分かかる
  • 全機能が前バージョンに戻る
  • 新機能を残せない(all-or-nothing)

⚡ Feature Flag OFF

  • 秒単位で適用
  • その機能だけ無効化、他機能は新版で動く
  • 個別ユーザー / セグメント単位の切替可
  • ツール:Firebase Remote Config、LaunchDarkly、Split

7.5 ロールバック戦略の選択肢

戦略速度粒度使い分け
Feature Flag OFF機能単位新機能の問題、最速で止血
Cloud Run revision traffic 100%→旧版service 単位Cloud Run、即時 rollback
Cloud Deploy rollouts rollback数分release 単位GKE、検証付き rollback
kubectl rollout undo数分Deployment 単位GKE、即時 rollback(記録なし)
Helm rollback数分release 単位Helm 管理アプリ
DB マイグレーション rollback数十分〜schema 単位schema 変更を含む場合、forward-only 設計推奨
💡 DB schema 変更は forward-only が原則 DB rollback は事実上不可能。新カラム追加 → 旧版コードは無視できる、削除は不可。「expand → contract」パターン:① expand(新スキーマ追加)、② コード両対応、③ 旧スキーマ削除(contract)の 3 段階で進め、いつでも前段に戻れる設計に。

7.6 Postmortem テンプレート

# Postmortem: [障害タイトル]

## Status
Draft / Review / Final

## Date
2026-03-15

## Authors
[Names]

## Executive Summary(経営層向け 3 行)
- 何が起きたか
- ユーザー影響
- 再発防止策

## Impact
- 影響ユーザー数: ~50,000 (全体の 12%)
- 失敗 transactions: 8,400 ($120k 損失)
- SLO 消費: 月予算の 65%
- Sev: 2

## Timeline (UTC)
2026-03-15 09:15 - Deploy 開始 (v2.4.1)
2026-03-15 09:23 - Cloud Monitoring alert 発火 (Fast burn 18x)
2026-03-15 09:25 - SRE Oncall がトリアージ開始
2026-03-15 09:31 - IC 指名、Operations Lead と Comms 着任
2026-03-15 09:33 - Feature Flag OFF(緩和開始)
2026-03-15 09:35 - 影響収束を確認、SLI 回復
2026-03-15 09:50 - Status Page 「Resolved」更新
...

## Root Cause(Five Whys)
[詳細]

## Trigger
[何が引き金を引いたか]

## Detection
- どう検知したか (alert / customer report)
- 検知から対応までの時間

## Resolution
- 何で復旧したか
- mitigation, rollback, fix の区別

## What Went Well
- Multi-burn-rate alert が 8 分で発火
- Feature Flag で即時止血できた
- IC 指名がスムーズ

## What Went Wrong
- Canary 段階で気づけなかった
- Status Page 更新に 17 分かかった
- Runbook が古かった

## Where We Got Lucky
- 偶然にも障害が日中で人員確保できた

## Action Items
| # | Action | Owner | Priority | Due |
|---|--------|-------|----------|-----|
| 1 | Canary verification を追加 | SRE A | P0 | 2 週間 |
| 2 | Status Page 自動更新導入 | SRE B | P1 | 1 ヶ月 |
| 3 | Runbook 四半期見直しプロセス | Eng Mgr | P2 | 3 ヶ月 |

## Lessons Learned
[組織として何を学んだか]

## Supporting Information
- Cloud Logging クエリ: ...
- Grafana dashboard: ...
- 関連 ticket: ...

7.7 Game Day / Wheel of Misfortune

🎮 Game Day(障害想定演習)

  1. シナリオ作成(例:asia-northeast1-a 完全停止)
  2. 影響予測ドキュメント作成
  3. 実施時刻決定(事前告知 or 抜き打ち)
  4. Chaos 注入(実際にゾーン切断 or シミュレート)
  5. 検知 → 対応 → 復旧の演習
  6. Debrief(学び、Runbook 改善)

🎡 Wheel of Misfortune

オンコール訓練ゲーム。実コードを触らず、口頭での対応訓練。

  • シナリオを乱数 / ホイールで選択
  • 担当者が「何をするか」を口頭で説明
  • ファシリテーターが「次に何が起こる」を返す
  • チームで対応のフィードバック
  • Runbook の漏れを発見
  • 新入 SRE のオンボーディングに最適

7.8 事故ケース集(インシデント対応)

事故 #21:DNS TTL 600 秒で region 切替が間に合わない
状況asia-northeast1 が完全停止。Cloud DNS で us-central1 に切替。
結果TTL 600 秒のため、最大 10 分間古い DNS をキャッシュするクライアント残存。ユーザーの一部は 10 分後まで access できず。
原因DNS TTL が長すぎ(デフォルト 300-3600 秒)。
対処本番 record の TTL を 60 秒に短縮。または Multi-cluster Ingress(Anycast Global LB)で DNS 切替自体を不要に。
事故 #22:IC がオペレーション作業に手を出し全体把握喪失
状況IC が「自分の方が早く治せる」と kubectl を叩き始める。
結果状況把握が止まり、Comms が情報を取れず、Status Page 更新停滞、顧客への報告遅延。新事象(DB 障害連鎖)の判断が遅れる。
原因IC は判断と統率に専念すべきという ICS 原則違反。
対処IC は手を動かさない。「触りたくなったら別の Ops を指名して引き継ぐ」。Postmortem で原則を再確認。
事故 #23:Status Page を 1 時間放置、SNS で炎上
状況Comms Lead 不在、SRE Oncall が対応で手一杯。
結果Status Page が更新されないまま 60 分経過 → Twitter で顧客が大量に苦情、信頼失墜。
原因Status Page 更新の SLA 未定義。Comms Lead がトリアージから外れていた。
対処SLA 制定:「障害認識後 15 分以内に初回投稿、その後 30 分ごと」。Status Page 自動連動(PagerDuty incident → Statuspage API)。
事故 #24:原因究明を先に始めて 30 分ユーザー影響継続
状況Fast burn alert 発火 → エンジニアが「まず原因を」と Cloud Logging を 30 分探す。
結果その間ユーザー影響継続、SLO 月予算の 70% 消費、SLA 違反確定。
原因「Mitigate first, fix later」原則違反。新版が原因と疑わしいなら即 rollback すべき。
対処Runbook 1 行目に「不明な場合は直近 deploy を即 rollback」を記載。Cloud Deploy の auto-rollback on failure を有効化。
事故 #25:Postmortem の Action Item が抽象的で 1 年放置
状況Postmortem に「監視を強化する」「テストを書く」と抽象的 AI を 5 件起票。
結果担当者・期限・優先度未定。1 年経過しても 1 件も完了せず、同類障害が再発。
原因AI が SMART でない(Specific / Measurable / Assigned / Realistic / Time-bound)。
対処Postmortem テンプレ強制:AI は必ず担当者・期限・優先度を明記。月次 Postmortem レビュー会で AI の完了状況追跡。

8事故ケース総集編 / 試験で問われる即答パターン

8.1 全章の事故ケース一覧(25 件)

#領域事故根本原因即対処
1SLO99.99% を盲目的に目指してチーム疲弊ユーザー要求調査なしSLI 実績ベースで段階引き上げ
2SLIウィンドウ 100% 要求で慢性違反閾値設計ミス「99% を good」に緩和、リクエストベース化
3SLASLA = SLO で契約違反多発バッファなしSLI < SLO < SLA の 3 階層化
4SLICPU を SLI にして顧客クレーム見逃しユーザー視点欠如HTTP 成功率 + p99 latency に変更
5SLI平均 latency で p99 災害見逃し平均は外れ値で歪む必ず percentile(p95/p99)を使う
6SLO100 個の SLO で追えなくなるLess is more 違反CUJ ベースで 3-5 個に集約
7SLIサーバ側のみで LB 前障害見逃し到達前障害が見えないクライアント側 SLI(synthetic / RUM)併用
8Burn rate5min ウィンドウだけで flappingMulti-window 未適用1h AND 5min の AND 条件化
9Burn rateSlow burn を放置して予算枯渇ticket SLA 未定義48h 以内対応 SLA、自動エスカレ
10Alert複数 SLI alert 同時発火で混乱SLI 相関考慮なしService レベル集約、grouping 有効化
11Burn rate夜間低トラフィックで false positive分母が小さい最低リクエスト数閾値、時間帯別 SLO
12SLOCalendar SLO の月末抜け道月初リセット狙いRolling 28-day に変更
13Service MeshSidecar OOM でリクエスト全停止memory 見積もり不足memory 256/512Mi、Sidecar scope 縮小
14Service MeshmTLS STRICT で legacy 通信不可段階移行欠如PERMISSIVE → STRICT の段階移行
15Service MeshAuthorizationPolicy 全 mesh 適用事故namespace 指定漏れroot namespace 禁止の OPA policy
16K8sPDB minAvailable=replica で rolling 停止余裕なしmaxUnavailable: 1 に修正
17VPAAuto mode で Pod 再起動連発updaterPolicy 過敏Off + 週次手動 or in-place α 機能
18Cloud Runmin-instances 全 service で乱用、コスト 2 倍雑な一斉設定SLO 厳しい 3 サービスだけ ≥ 1
19HPAHPA+VPA 同 CPU で振動同シグナル制御HPA=RPS、VPA=Memory only
20MIGPredictive 誤予測で過剰スケール一時イベント学習キャンペーン後は Predictive 一時停止
21DNSTTL 600s で region 切替 10 分遅延TTL 長すぎTTL 60s、または MCI で DNS 不要に
22ICSIC が手を出し全体把握喪失役割原則違反IC は判断専念、別 Ops に引き継ぎ
23ICSStatus Page 1h 放置 → SNS 炎上更新 SLA 未定義15 分以内初回、自動連動
24Incident原因究明先行で 30 分影響継続Mitigate first 違反不明なら直近 deploy 即 rollback
25Postmortem抽象的 AI が 1 年放置、再発SMART でない担当・期限・優先度必須、月次レビュー

8.2 試験で問われる即答パターン(30+ 行)

🔑 即答マトリクス(試験本番で迷ったらこれ)
問題のキーワード正解(即答)
SRE と DevOps の関係class SRE implements DevOps(DevOps = 哲学、SRE = 具体実装)
SRE が運用に使う時間の上限50%(Toil ≤ 50% ルール)
ユーザー影響を反映する最小監視セットFour Golden Signals(Latency / Traffic / Errors / Saturation)
SLI / SLO / SLA の数値関係SLI > SLO > SLA(実測が一番高く、SLA が最も低い保証)
Error Budget の数式1 − SLO
Burn Rate の数式エラー率 / (1 − SLO)
SLO 99.9% の月予算43.2 分
SLO 99.99% の月予算4.32 分
SLO 99.99% の年予算52.6 分
SLO 99.999% の月予算25.9 秒
Multi-burn-rate の Fast burn 推奨1h + 5min / 14.4x / 2% 消費
Multi-burn-rate の Medium burn6h + 30min / 6x / 5% 消費
Multi-burn-rate の Slow burn (ticket)3d + 6h / 1x / 10% 消費
ショートウィンドウとロングウィンドウの比1/12(SRE Workbook 推奨)
アプリ無改修で SLO 計測Cloud Service Mesh + istio_requests_total
マイクロサービス間の mTLS / 認可Cloud Service Mesh(PeerAuthentication / AuthorizationPolicy)
カスタムメトリクスで Pod 数調整HPA(External metric / Stackdriver Adapter)
Pod の CPU / Memory request 自動調整VPA
Node 数を Pod 要求に応じて増減Cluster Autoscaler
Node Pool 自体を要求から自動生成Node Auto-Provisioning(NAP)
HPA と VPA を同じメトリクスで併用NG(公式非推奨、振動の原因)
計画的中断時の Pod 保証Pod Disruption Budget(PDB)
Cloud Run の cold start 削減min-instances ≥ 1 + Startup CPU Boost
Cloud Run でバックグラウンド処理CPU always allocated--no-cpu-throttling
確実にピーク容量を確保(汎用 VM)Reservations + CUD
GPU/TPU を確実に確保(AI/ML)Dynamic Workload Scheduler(DWS)
大規模 LLM pretraining で 30 日確保DWS calendar mode
待てる ML バッチで最安 GPUDWS flex-start mode
中断 OK バッチで最安Spot VM(最大 91% off)
同一ラック高速接続(GPU クラスタ)Block reservation
インシデント時の最優先アクションMitigate first(影響緩和 → 容量 → rollback → 究明)
最速で影響を止める手段Feature Flag OFF(秒単位)
Cloud Run rollback の最速手段revision traffic 100% 旧版
GKE rollback の最速手段kubectl rollout undo deployment/NAME
GLB backend 安全削除capacity-scaler 0 + connection draining(最大 3600s)
リージョン切替の手段Cloud DNS weighted / Multi-cluster Ingress
障害時の役割分担Incident Command System(ICS)
IC(Incident Commander)の責務全体統率・判断(技術作業はしない)
Postmortem の文化原則Blameless(個人を責めない、システムを問う)
障害想定の訓練Game Day / Wheel of Misfortune
DORA 4 metricsDF / LT / CFR / MTTR(+ Reliability で 5)

8.3 ダウンタイム計算ドリル

💡 試験本番で 30 秒で解くための練習問題

問 1:SLO 99.95%、月(30日)の Error Budget は?
→ 0.05% × 30 × 24 × 60 = 21.6 分

問 2:SLO 99.9%、過去 1 時間で 10,000 req 中 200 件失敗。Burn rate は?
→ エラー率 = 2%、Burn rate = 2% / 0.1% = 20x(Fast burn 発火)

問 3:SLO 99.99% (rolling 28日)、過去 1 時間で 50,000 req 中 7 件失敗。Burn rate は?
→ エラー率 = 0.014%、Burn rate = 0.014% / 0.01% = 1.4x(Slow burn 範囲)

問 4:SLO 99.5%、月予算を使い切るのに 5 日かかったペース。Burn rate は?
→ 30 / 5 = 6x(Medium burn)

問 5:Cloud Run で RPS 800、平均レイテンシ 250ms、concurrency 80。必要な最小 instances は?
→ Little's Law: L = 800 × 0.25 = 200 concurrent → 200 / 80 = 2.5 → 3 instances 最低(ピーク余裕で 5+ 推奨)

問 6:HPA target CPU 70%、現在 Pod 5 個 / 平均 CPU 90%。期待 Pod 数は?
→ 5 × (90/70) = 6.43 → 7 Pod に scale up

8.4 トラブルシュート意思決定フロー

💡 「障害発生時」の切り分け順序
  1. SLI / Burn rate を確認:影響範囲(service / region / user segment)を特定。Fast / Medium / Slow のどれが発火か。
  2. 「Mitigate first」を発動:直近 deploy があるなら Feature Flag OFF または rollback。原因究明は後。
  3. IC 指名:Sev 2 以上なら ICS に従い役割分離。Comms は Status Page 即時更新(15 分以内)。
  4. 容量チェック:HPA / max-instances / Quota が上限に達していないか。緊急なら max を引き上げる。
  5. 依存サービスの確認:DB / Cache / 下流 API / GCP Status。依存先障害なら failover or graceful degradation。
  6. Cloud Logging / Trace を確認:Trace ID で分散追跡、エラーパターンの抽出。
  7. 復旧確認:SLI が回復、Burn rate が 1x 未満に戻ったらインシデント終了宣言。
  8. Postmortem 起票:Sev 3 以上は必須。Blameless で、Action Items に担当・期限・優先度を明記。

8.5 次のステップ