ストーリー
田
田中VPoE
SLI/SLO戦略の基本フレームワークは固まった。次は「階層設計」だ。組織のSLOは単一のフラットなリストではない。ユーザージャーニー、サービス依存関係、ビジネスドメインに沿った「構造」が必要だ
あなた
サービスごとにSLOを定義するだけでは駄目ですか?
あ
田
田中VPoE
それだけだと「サービスBのSLOは99.9%だが、サービスBが依存するサービスCのSLOは99.5%」のような矛盾が発生する。下流のSLOが上流より緩いと、上流のSLOは原理的に達成不可能だ。依存関係を考慮した階層的な設計が不可欠だ
あなた
なるほど。依存関係チェーンを考慮してSLOを上から下へ設計するということですね
あ
田
田中VPoE
まさにそうだ。さらに、個別サービスのSLOだけでなく「ユーザージャーニーSLO」という上位概念も導入する。ユーザーが体験するEnd-to-Endの品質を保証するためだ
SLO階層の全体構造
3層のSLO階層
┌─────────────────────────────────────────────┐
│ Layer 1: ジャーニーSLO │
│ 「ユーザーが体験するEnd-to-Endの品質」 │
│ 例: タスク作成→保存→表示 が2秒以内: 99.9% │
├─────────────────────────────────────────────┤
│ Layer 2: サービスSLO │
│ 「個々のマイクロサービスの品質」 │
│ 例: API Gateway 可用性 99.95% │
├─────────────────────────────────────────────┤
│ Layer 3: インフラSLO │
│ 「基盤サービスの品質」 │
│ 例: データベース可用性 99.99% │
└─────────────────────────────────────────────┘
| 層 | 対象 | 設定者 | レビュー頻度 |
|---|
| ジャーニーSLO | ユーザーが体験するEnd-to-Endフロー | プロダクト + SRE | 月次 |
| サービスSLO | 個々のマイクロサービス | サービスオーナーチーム | 隔週 |
| インフラSLO | DB、キャッシュ、メッセージキューなどの基盤 | インフラ/プラットフォームチーム | 月次 |
Layer 1: ジャーニーSLO
ジャーニーSLOとは
| 観点 | 説明 |
|---|
| 定義 | ユーザーが特定の目的を達成するまでのEnd-to-Endフローに対するSLO |
| 目的 | 個別サービスのSLOだけでは捉えられない「体験全体の品質」を保証する |
| 特徴 | 複数のサービスSLOを組み合わせた複合的な指標 |
ジャーニーSLOの具体例(TaskFlow社)
| ジャーニー | SLI定義 | SLO |
|---|
| タスク作成 | タスク作成API呼出→DB保存→画面反映までが2秒以内 | 99.9% |
| プロジェクト一覧表示 | ログイン→プロジェクト一覧取得→レンダリング完了が3秒以内 | 99.9% |
| 通知配信 | イベント発生→通知生成→ユーザーへの配信が30秒以内 | 99.5% |
| レポート生成 | レポート要求→データ集計→PDF生成→ダウンロード可能が60秒以内 | 99.0% |
| 決済処理 | 決済開始→外部ゲートウェイ→完了通知が5秒以内 | 99.95% |
ジャーニーSLOの計算
ジャーニー: タスク作成
関与サービス:
1. Web Frontend (レンダリング)
2. API Gateway (ルーティング)
3. Task Service (ビジネスロジック)
4. Database (永続化)
5. Notification Service (リアルタイム更新)
各サービスSLO:
Web Frontend: 99.95%
API Gateway: 99.99%
Task Service: 99.95%
Database: 99.99%
Notification: 99.9%
直列依存の場合の理論的上限:
0.9995 × 0.9999 × 0.9995 × 0.9999 × 0.999
= 99.78%(理論的上限)
→ ジャーニーSLO 99.9% を達成するには
各サービスのSLOを高く維持する必要がある
「ジャーニーSLOは”チームの壁”を越える指標だ。個々のチームが自チームのSLOを達成していても、ユーザージャーニー全体が満足な品質でなければ意味がない」 — 田中VPoE
Layer 2: サービスSLO
サービス依存関係とSLOの整合性
| ルール | 説明 | 例 |
|---|
| 上流≧下流 | 上流サービスのSLOは下流以下にできない | API(99.95%) → DB(99.99%) |
| 依存数の考慮 | 依存が多いほどSLOマージンが必要 | 5サービス依存→各99.99%でも全体99.95% |
| クリティカルパスの特定 | ジャーニー上の最もSLOが低い経路が全体を制約 | 通知(99.9%)がボトルネック |
| グレースフルデグラデーション | 非クリティカル依存の障害では機能縮退で継続 | 検索ダウン時はキャッシュ結果を表示 |
依存関係マトリクス
依存関係マップ(TaskFlow社):
Web Frontend
├── API Gateway (同期・クリティカル)
│ ├── Task Service (同期・クリティカル)
│ │ ├── Database (同期・クリティカル)
│ │ └── Cache (同期・非クリティカル)
│ ├── Search Service (同期・非クリティカル)
│ │ └── Elasticsearch (同期・クリティカル)
│ ├── Payment Service (同期・クリティカル)
│ │ └── External Gateway (同期・クリティカル)
│ └── Notification Service (非同期・非クリティカル)
│ ├── Message Queue (非同期・クリティカル)
│ └── Email/Push Provider (非同期・クリティカル)
└── CDN (同期・クリティカル)
SLO伝播ルール
| 依存タイプ | SLOへの影響 | 設計指針 |
|---|
| 同期・クリティカル | 直接影響(掛け算) | 下流SLOは上流より高く設定 |
| 同期・非クリティカル | フォールバック時は影響なし | サーキットブレーカーで保護、SLOは独立 |
| 非同期・クリティカル | 遅延許容だがデータ損失は不可 | メッセージキューの耐久性SLOで担保 |
| 非同期・非クリティカル | ベストエフォート | SLOは参考値、エラーバジェットは緩め |
Layer 3: インフラSLO
基盤サービスのSLO設計
| 基盤サービス | SLI | SLO | 根拠 |
|---|
| RDS (Primary) | 成功クエリ率 | 99.99% | 全上位サービスのクリティカル依存 |
| RDS (Read Replica) | 成功クエリ率 + レプリケーション遅延 | 99.95% | 読取専用、多少の遅延許容 |
| ElastiCache | キャッシュヒット率を除く可用性 | 99.99% | キャッシュミスはDB直接参照で代替可能 |
| SQS/SNS | メッセージ配信成功率 | 99.99% | 非同期処理の信頼性基盤 |
| ECS/EKS | Pod/Task起動成功率 | 99.95% | コンテナオーケストレーション |
インフラSLOがサービスSLOに与える影響
インフラ障害の波及:
RDS障害(SLO: 99.99%)
→ Task Service 影響 (直接依存)
→ Payment Service 影響 (直接依存)
→ Search Service 影響なし (Elasticsearch使用)
→ Notification Service 部分影響 (配信ログのみDB)
影響範囲:
Tier 1サービス: 2/2 影響あり(100%)
Tier 2サービス: 1/2 影響あり(50%)
→ RDB障害はビジネスインパクト最大
→ 99.99%のSLOが妥当
SLO依存関係の設計手法
ステップ1: 依存関係グラフの作成
| ステップ | アクション | 成果物 |
|---|
| 1-1 | 全サービスの一覧化 | サービスカタログ |
| 1-2 | サービス間の呼び出し関係を可視化 | 依存関係グラフ |
| 1-3 | 各依存を「同期/非同期」「クリティカル/非クリティカル」で分類 | 依存関係マトリクス |
| 1-4 | ユーザージャーニーごとのクリティカルパスを特定 | クリティカルパスマップ |
ステップ2: ボトムアップSLO設計
| ステップ | アクション | ポイント |
|---|
| 2-1 | インフラSLOを設定(最も高いSLO) | クラウドSLAを参考に設定 |
| 2-2 | サービスSLOをインフラSLO以下で設定 | 依存数に応じてマージンを確保 |
| 2-3 | ジャーニーSLOをサービスSLOの組合せで検証 | クリティカルパスのSLO積が目標を上回ることを確認 |
ステップ3: トップダウン検証
| ステップ | アクション | ポイント |
|---|
| 3-1 | ジャーニーSLOからサービスSLOの必要水準を逆算 | 全体SLOから個別SLOの下限を算出 |
| 3-2 | ボトムアップ結果とトップダウン結果を突合 | 矛盾がある場合はSLOを調整 |
| 3-3 | コストとのバランスで最終決定 | SLO引き上げのコスト影響を評価 |
SLO階層設計のアンチパターン
| アンチパターン | 問題 | 対策 |
|---|
| フラットSLO | 全サービスが同じSLOで依存関係を無視 | 階層設計と依存関係分析の実施 |
| 過剰SLO | 全サービス99.99%で人もコストも疲弊 | ティア制度に基づく現実的なSLO設定 |
| 孤立SLO | 個別チームが独自にSLOを設定し整合性なし | ジャーニーSLOによるEnd-to-End検証 |
| 静的SLO | 一度設定したら見直さない | 四半期レビューによる継続的な調整 |
| SLO乖離 | SLO目標と実績が大幅に乖離 | 現状実績ベースのSLO設定と段階的引き上げ |
まとめ
| ポイント | 内容 |
|---|
| 3層のSLO階層 | ジャーニーSLO → サービスSLO → インフラSLOの3層で構造化 |
| 依存関係の整合性 | 上流のSLOは下流以下にできない、クリティカルパスの掛け算を考慮 |
| ボトムアップ + トップダウン | 双方向から設計し矛盾を検出・解消する |
| アンチパターン回避 | フラット・過剰・孤立・静的なSLO設計を避ける |
チェックリスト
次のステップへ
次は「エラーバジェットポリシーの組織展開」を学びます。SLOを設定した後、エラーバジェットをどのように管理し、組織全体で活用するかを身につけましょう。
推定読了時間: 30分