ゼロからわかる SLI / SLO / SLA ─ 初心者向け完全ガイド

> **この記事で得られること**  
> 1️⃣ 3 つの略語が *「何を意味し、どう繋がるか」* を 5 分で理解  
> 2️⃣ ピザ屋・病院・ゲームアプリの **たとえ話** でイメージを掴む  
> 3️⃣ 自社サービスで適用するための **設計ステップ** と **実装サンプル** まで把握  

---

## 0. 概要

| 用語 | ひとことで | 例 |
| --- | --- | --- |
| **SLI**<br>*Service&nbsp;Level&nbsp;Indicator* | **指標となる実測値**（まず *何を測るか* 決める） | 成功率 99.2%、**P95 レイテンシ** 180 ms |
| **SLO**<br>*Service&nbsp;Level&nbsp;Objective* | **内部目標**（SLI を *どこまで達成したいか*） | 成功率 **99.9%** を毎月キープ |
| **SLA**<br>*Service&nbsp;Level&nbsp;Agreement* | **外部契約**（利用者への正式な約束） | 稼働率 **99.5%** 未満で料金 10% 返金 |

覚え方 → **測る → 目標 → 約束**

> **📝 用語メモ**  
> **Latency (レイテンシ)** = 要求を出してから応答が返るまでの **待ち時間**  
> **P95** = *95 パーセンタイル*（全リクエストの 95% がその値以下）  
> **SRE** (*Site Reliability Engineering*) = Google 発祥の “ソフトウェアで運用自動化し信頼性を高める” 文化

---

## 1. 3 つの用語を図で俯瞰する

```mermaid
flowchart LR
  SLI["**SLI** (指標/実測値)"] --> SLO["**SLO** (内部目標)"]
  SLO --> SLA["**SLA** (顧客契約)"]
  SLO -. "Error Budget = 許容失敗枠" .- SLA
```
- **左→右** に進むほど“約束度”が上がる。  
- **点線** は *「内部目標を超えると外部契約違反リスクが近づく」* ことを示す。

---

## 2. 一覧表でサクッと比較

| 観点 | **SLI** | **SLO** | **SLA** |
| --- | --- | --- | --- |
| ざっくり | **今この瞬間のスコア** | 社内ゴール | 顧客と合意 |
| 例 (Web API) | **P95 レイテンシ 180 ms** | P95 < **200 ms** を 28/30 日達成 | 月間 P95 < **250 ms** 未達で料金減額 |
| 主担当 | 開発 / **SRE** | 開発 / 運用 / PM | 顧客 / 法務 |
| 更新頻度 | 秒〜分単位 | 四半期ごと見直し | 契約更新時 |

---

## 3. たとえ話で完全理解

### 3-1. ピザ屋デリバリー 🍕

| 区分 | ピザ屋の世界で言うと… |
| --- | --- |
| **SLI** | 1 件ごとの配達時間 (22 min など) |
| **SLO** | 注文の 95% を **25 min** 以内に届ける (社内) |
| **SLA** | 注文の 90% を **30 min** 以内に届ける。超えたらクーポン配布 (顧客) |

> **学び:** SLO を少し厳しくしておくと、SLA は余裕で守れる。

---

### 3-2. 病院の救急外来 🏥

- **SLI**: 患者ごとの待機時間 (受付→診察開始)  
- **SLO**: 95% を **20 min** 以内に診察 (内部目標)  
- **SLA**: 90% を **30 min** 以内に診察保証 (対外約束)。未達時は次回優先券

---

### 3-3. オンラインゲーム 🎮

- **SLI**: 月間稼働率 (アップタイム)  
- **SLO**: **99.95%** 以上 (月ダウン 21 min 未満)  
- **SLA**: **99.9%** 未満でゲーム内通貨 100 個補填  
- **Error Budget**: 0.05% = 21 min／月。使い切ったら新機能リリース凍結！

---

## 4. Error Budget (エラーバジェット) が“鍵”になる理由

> **読み方:** *エラーバジェット*  
> **意味:** **SLO をギリギリ満たせなくなるまでの “失敗許容量”**

### 4-1. 数字で見るエラーバジェット例

| 指標 | **SLO 目標** | 許容失敗枠 (Error Budget) |
| --- | --- | --- |
| 稼働率 | 99.95% (月ダウン **21 min** 以下) | **21 min**／月 まで障害 OK |
| レイテンシ P95 | 200 ms | 月間 5% のリクエストが 200 ms 超えても OK |

### 4-2. 企業での運用うんちく

- **Google**: Error Budget を日次で自動集計し、残高ゼロでリリース凍結  
- **Shopify**: Error Budget 消費率 25% 超 → Feature Flag 自動 OFF

| 残高状況 | 開発チームの動き |
| --- | --- |
| 80-100% 残 | 新機能リリース & 実験モード 🟢 |
| 30-80% 残 | リスク高い変更は要レビュー 🟡 |
| 0-30% 残 | リリース凍結、障害対応専念 🔴 |

---

## 5. 自分のサービスで適用する 3 ステップ

1. **指標を決める (SLI)** – 例: **P95 レイテンシ**, エラー率, アップタイム  
2. **内部目標を置く (SLO)** – “顧客期待 + 少し厳しめ” が鉄則  
3. **契約を作る (SLA)** – 法務と補償条項もセットで

### 🌟 ミニ実装例：PromQL で成功率 SLI を計算

> **Prometheus** = OSS の時系列 DB＆監視ツール  
> **PromQL** = そのクエリ言語  

```promql
# 1. 直近 5 分の HTTP 成功リクエスト数 (2xx)
sum(rate(http_requests_total{status=~"2.."}[5m]))

# 2. 同期間の全リクエスト数
sum(rate(http_requests_total[5m]))

# 3. 割り算で成功率 (SLI)
(
  sum(rate(http_requests_total{status=~"2.."}[5m]))
)
/(
  sum(rate(http_requests_total[5m]))
)
```

上記メトリクスをダッシュボード化し、**しきい値 `>= 0.999`** にアラートを設定すれば  
SLO「成功率 99.9% 以上」を自動監視できます ✅

> 💡 **Prometheus がない場合** でも CloudWatch や Datadog で同様の成功率メトリクスを作成し、しきい値でアラート → SLO を運用できます。

---

## 6. よくある質問 (FAQ)

> **Q1. SLO と SLA を同じ数値で設定すると？**  
> → “障害 = 即契約違反” のリスク大。SLO を少し厳しくして Error Budget を確保  
> **Q2. 平均応答時間で十分？**  
> → 外れ値に弱い。**P90/P95/P99** のパーセンタイルを採用  
> **Q3. 数値感が分からない…**  
> → まず現状計測 → *「現状 + ちょい改善」* を SLO に。半年ごとに見直す

---

## 7. まとめ & 次の一歩
- 覚え方は **測る → 目標 → 約束**  
- **SLI** を決めることからすべてが始まる  
- **Error Budget** を賢く使って “壊さず速く” を実現しよう  

---

## 参考リンク
- *Site Reliability Engineering* (O'Reilly, 2023 邦訳)  
- Google Cloud – [SLA & SLO Documentation](https://cloud.google.com/)  
- Prometheus Docs – [`histogram_quantile()` function](https://prometheus.io/docs)

---