observability6分で読める

システム監視とアラート設計:実践と運用編

システム運用における監視(モニタリング)とアラートの具体的な実装方法、運用ノウハウ、ベストプラクティスを実践的に解説します。理論は基礎編を参照してください。

#監視#モニタリング#アラート#DevOps#SRE#運用#実践

システム監視とアラート設計:実践と運用編

本記事では、システム運用における監視(モニタリング)とアラートの具体的な実装方法と運用ノウハウについて解説します。基礎概念や設計原則については、理論と概念編を参照してください。

目次


死活監視(ヘルスチェック)

死活監視とは

死活監視は、システムやサービスが「生きているか(稼働しているか)」を確認する最も基本的な監視です。別名「ヘルスチェック」「Uptime監視」とも呼ばれます。

なぜ死活監視が必要か

  • 最優先の監視項目: どんなに高度な監視を行っても、サービスが停止していれば意味がない
  • ユーザー影響の即座の検知: サービスダウンは全ユーザーに影響するため、最速で検知する必要がある
  • 障害復旧の起点: 死活監視のアラートが障害対応の最初のトリガーとなる
  • SLA/SLOの基盤: 可用性(Availability)の計算には死活監視のデータが必須

死活監視・ヘルスチェック・外形監視の位置づけ

「死活監視」という言葉は広義に使われますが、現代の運用では以下の3つに整理して考えると理解しやすくなります。

特徴単純な死活監視 (Ping/Port)ヘルスチェック (App Health)外形監視 (Synthetic)
問い「サーバーは起動しているか?」「アプリは正常に動作可能か?」「ユーザーはサービスを使えるか?」
視点インフラ/ネットワークアプリケーション内部エンドユーザー/UX
場所監視サーバー (内部/外部)ロードバランサー/監視サーバーインターネット (外部)
範囲特定サーバーの疎通確認DB接続や依存サービスの確認DNS, CDN, 経路, 描画まで含む

それぞれの役割:

  1. 単純な死活監視: サーバーが落ちていることを即座に知る(Pingなど)。
  2. ヘルスチェック: アプリ内のロジック(DB接続など)を含めて健全性を診断する(/health エンドポイントなど)。
  3. 外形監視: 世界中のユーザーと同じ経路でアクセスできるかを保証する。

これらを組み合わせることで、**「サーバーは動いているが、DB接続エラーで画面が出ない」**といった状態も正確に検知できます。

死活監視の種類

エンドポイント監視(外形監視)

サービスの入口(エンドポイント)に実際にアクセスして応答を確認します。

例: - HTTPSリクエストを送信 - 期待するステータスコード(200 OK)を確認 - レスポンス時間を測定

メリット:

  • ユーザーと同じ経路で確認できる
  • 実際の可用性を測定できる
  • DNS、ロードバランサー、ネットワークの問題も検知

チェック項目:

  • HTTPステータスコード(200, 301など)
  • レスポンスボディの内容確認(特定の文字列が含まれるか)
  • レスポンスタイム(タイムアウト設定)
  • SSL証明書の有効期限

プロセス監視

サーバー上でプロセスが実行されているかを確認します。

例: - Webサーバー(nginx, apache)のプロセス存在確認 - アプリケーションプロセスの状態確認 - デーモンの稼働状況

メリット:

  • プロセスレベルの問題を早期検知
  • 自動再起動の前提条件

注意点:

  • プロセスが存在してもサービスが応答しない場合がある(ハング状態など)
  • エンドポイント監視と併用すべき

ポート監視

サービスが利用するポートがリッスン状態かを確認します。

例: - TCPポート80(HTTP) - TCPポート443(HTTPS) - TCPポート3306(MySQL) - TCPポート6379(Redis)

メリット:

  • 軽量で高速
  • ネットワークレベルの到達性を確認

デメリット:

  • ポートが開いていても、サービスが正常とは限らない

ヘルスチェックエンドポイント

アプリケーション専用のヘルスチェックエンドポイントを用意します。

代表的なパス: - /health - /healthz - /health/live - /health/ready - /api/health

ヘルスチェックの種類:

タイプ目的確認内容ステータス
Liveness(生存確認)プロセスが生きているかアプリケーションが応答可能か失敗時は再起動
Readiness(準備完了確認)リクエストを受け付けられるかDB接続、依存サービスの状態失敗時はトラフィック除外
Startup(起動確認)起動が完了したか初期化処理の完了起動時のみ

ヘルスチェックエンドポイントの設計

シンプルなヘルスチェック

GET /health Response 200 OK: { "status": "ok", "timestamp": "2026-01-21T10:30:00Z" }

詳細なヘルスチェック

GET /health Response 200 OK: { "status": "ok", "version": "1.2.3", "timestamp": "2026-01-21T10:30:00Z", "checks": { "database": "ok", "redis": "ok", "external_api": "ok" } } Response 503 Service Unavailable: { "status": "error", "timestamp": "2026-01-21T10:30:00Z", "checks": { "database": "ok", "redis": "error", "external_api": "ok" } }

ベストプラクティス

  • 軽量に保つ: ヘルスチェック自体が高負荷にならないように
  • 認証不要: ヘルスチェックエンドポイントは認証なしでアクセス可能にする
  • 適切なステータスコード: 正常時は200、異常時は5xx(503推奨)
  • タイムアウト設定: ヘルスチェック自体に短いタイムアウトを設定(例: 3秒)
  • 依存関係の考慮:
    • Liveness: 自分自身のみチェック
    • Readiness: 依存サービスもチェック

チェック間隔と判定基準

チェック間隔の推奨値

環境チェック間隔理由
本番環境(重要)30秒〜1分迅速な障害検知
本番環境(一般)1分〜3分バランス型
ステージング環境3分〜5分コスト削減
開発環境5分〜10分最小限の監視

トレードオフ:

  • 短い間隔 = 早期検知 but コスト増・負荷増
  • 長い間隔 = コスト減 but 検知遅延

失敗判定の考え方

連続失敗で判定する

NG: 1回の失敗で即アラート → ネットワークの瞬断や一時的な高負荷で誤検知 OK: N回連続失敗でアラート(例: 3回連続) → 一時的な問題を除外

設定例:

  • チェック間隔: 1分
  • 失敗判定: 3回連続失敗
  • アラート発報: 最短3分後(1分×3回)

タイムアウト設定:

推奨:チェック間隔の 1/2 〜 1/3 例: - チェック間隔: 60秒 - タイムアウト: 20秒〜30秒

死活監視のアンチパターン

チェックが重すぎる

NG: - ヘルスチェックで大量のDBクエリ - 外部APIを複数呼び出す - ファイルシステムの全スキャン → ヘルスチェック自体がシステムの負荷になる

依存関係の混同

NG: Livenessで外部サービスの状態をチェック → 外部サービスダウン時に不必要な再起動 OK: - Liveness: 自分自身の健全性のみ - Readiness: 依存サービスを含めた準備状態

単一ポイントからのチェックのみ

NG: 同一リージョン・同一ネットワークからのみチェック → ネットワーク分断時に検知できない OK: 複数リージョン・複数プロバイダーからチェック → 真のユーザー影響を検知

よくある誤解:ALBのヘルスチェックだけで十分か?

結論:不十分です。必ず「外形監視(External Monitoring)」と組み合わせる必要があります。

AWSのApplication Load Balancer (ALB) にもヘルスチェック機能がありますが、これはあくまで**「ロードバランサーから見て、背後のターゲット(EC2やコンテナ)が生きているか」**を確認するためのものです。

ALBヘルスチェックで見落とすポイント:

  1. DNS解決: ユーザーがドメイン名を解決できているか(Route53の誤設定など)
  2. SSL証明書: 証明書の有効期限切れや設定ミス
  3. インターネット接続: インターネットからALBまでの経路(セキュリティグループやNACLの誤設定)
  4. ALB自体の障害: 稀ですが、ALB自体がダウンしている可能性

推奨構成:

  • 内部監視(Internal): ALBヘルスチェック(異常なホストへの振り分け停止用)
  • 外形監視(External): Route53 Health ChecksやDatadog Synthetic Monitoring(ユーザーとしてアクセスできるかの確認用)

死活監視ツールの例

クラウドサービス

  • AWS: Route 53 Health Checks, CloudWatch Synthetic Monitoring
  • Azure: Application Insights Availability Tests
  • GCP: Cloud Monitoring Uptime Checks

SaaSサービス

  • Pingdom: 世界中からのHTTPチェック
  • Uptime Robot: 無料で基本的な死活監視
  • Better Uptime: モダンなインターフェース
  • Datadog Synthetic Monitoring: 総合監視の一部

セルフホスト

  • Prometheus + Blackbox Exporter: HTTP/TCP/ICMPチェック
  • Zabbix: エージェント型とエージェントレス型
  • Nagios/Icinga: 従来型の死活監視

死活監視のチェックリスト

  • エンドポイント監視が設定されている
  • 複数拠点からチェックしている(本番環境の場合)
  • チェック間隔が適切(本番なら1〜3分)
  • 連続失敗での判定を設定(例: 3回連続)
  • タイムアウトが適切に設定されている
  • ヘルスチェックエンドポイントが実装されている
  • Liveness と Readiness を適切に分離している
  • アラート通知先が正しく設定されている
  • SSL証明書の有効期限もチェックしている
  • 定期的に死活監視自体の動作確認をしている

CloudWatchアラームのデータポイントについて

データポイントとは

データポイントは、CloudWatchアラームがメトリクスを評価する際の時系列データの個々の点を指します。アラームは「指定した期間内に、何個のデータポイントが閾値を超えたか」で状態を判定します。

評価期間の計算

評価期間(分) = 統計期間(分) × 評価するデータポイント数

:

  • 1分間隔で3データポイント = 3分間の評価
  • 5分間隔で3データポイント = 15分間の評価
  • 1分間隔で1データポイント = 1分間の評価(即座に反応)

データポイント設定の考え方

設定パターン統計期間データポイント評価期間用途
即時検知1分1/11分サービス停止など致命的な問題
短期監視1分2/2 または 2/32〜3分エラー率、5xxエラーなど
中期監視5分3/315分CPU使用率、メモリ使用率など
長期監視5分3/525分一時的なスパイクを無視したい場合

データポイント数の選び方

1/1(1個中1個)- 即時反応型

  • サービス停止(HealthyHostCount = 0)
  • システムステータスチェック失敗
  • 冗長性喪失(HealthyHostCount < 2)
  • 理由: 一瞬でも問題があれば即座に対処が必要

2/2 または 2/3(連続または2回以上)- 短期判定型

  • 5xxエラー率
  • ターゲット接続エラー
  • タスク数不足
  • 理由: 一時的な異常を除外しつつ、問題を早期検知

3/3(3個中3個)- 中期安定型

  • CPU使用率
  • メモリ使用率
  • ディスク使用率
  • 理由: 一時的なスパイクを無視し、持続的な問題のみ検知

3/5 または 4/5(5個中3〜4個)- 長期傾向型

  • クレジットバランス
  • ディスク容量の増加傾向
  • 理由: 一時的な変動を許容し、傾向的な問題を検知

誤検知(False Positive)とのバランス

  • データポイントが少なすぎる: 一時的なスパイクで誤検知が増える(アラート疲労)
  • データポイントが多すぎる: 検知が遅れ、重大な問題を見逃す可能性
  • 推奨: 優先度P0は1/1または2/2、P1-P2は2/3または3/3、P3は3/5

欠落データの扱い

CloudWatchでは、メトリクスが送信されない場合の動作を設定できます:

  • notBreaching(違反なし): 欠落データを正常とみなす(デフォルト、推奨)
  • breaching(違反あり): 欠落データを異常とみなす
  • ignore(無視): 欠落データを評価に含めない
  • missing(欠落): アラーム状態を「INSUFFICIENT_DATA」にする

推奨: 通常は notBreaching を使用。ただし、死活監視など「データが来ないこと自体が異常」の場合は breaching を使用。


運用フェーズ別の監視戦略

フェーズ1: リリース前(開発・ステージング)

目的: システムの基本的な健全性を確認

  • アプリケーションが起動できるか
  • 基本的なヘルスチェックエンドポイント(/health
  • ログが正しく出力されているか
  • 主要なエンドポイントが応答するか

監視項目(最小限):

  • サーバーの死活監視
  • アプリケーションプロセスの監視
  • エラーログの監視

フェーズ2: 初期リリース(トラフィック小)

目的: 本番環境での基本的な動作を確認

  • 外形監視(エンドユーザー視点)
  • エラー率の監視
  • レスポンスタイムの監視
  • リソース使用率の監視

アラート設定:

  • P0: サービスダウン、エラー率50%超
  • P1: レスポンスタイム5秒超、エラー率10%超

フェーズ3: 成長期(トラフィック増加)

目的: スケーラビリティの問題を早期発見

  • トラフィックパターンの分析
  • ボトルネックの特定(APM導入)
  • データベースのスロークエリ監視
  • キャッシュヒット率の監視

アラート追加:

  • P2: リソース使用率80%超
  • P3: トラフィック増加率の異常(前週比200%超など)

フェーズ4: 成熟期(安定運用)

目的: 高可用性とパフォーマンスの維持

  • SLI/SLO/SLAの定義と監視
  • 複数リージョンの監視
  • コスト最適化のための監視
  • セキュリティ監視(異常アクセス、攻撃)

高度な監視:

  • 分散トレーシング(Jaeger、X-Ray)
  • ビジネスメトリクス(コンバージョン、売上)
  • カオスエンジニアリング(障害注入テスト)

監視ダッシュボードの設計

RED Method(サービス監視)

マイクロサービス向けの監視方法論。

  • Rate(レート): リクエスト数/秒
  • Errors(エラー): エラー率
  • Duration(期間): レスポンスタイム(P50, P95, P99)

USE Method(リソース監視)

インフラ向けの監視方法論。

  • Utilization(使用率): リソースがどれくらい使われているか
  • Saturation(飽和度): リソースがどれくらい逼迫しているか
  • Errors(エラー): エラー発生率

ダッシュボードの階層構造

レベル1: 全体概要(Executive Dashboard) ├─ サービス稼働率(SLA) ├─ 総トラフィック ├─ エラー率 └─ 主要ビジネスメトリクス レベル2: サービス別詳細 ├─ サービスAのRED指標 ├─ サービスBのRED指標 └─ 依存関係マップ レベル3: コンポーネント詳細 ├─ DBのパフォーマンス ├─ キャッシュの状態 └─ キューの滞留 レベル4: トラブルシューティング ├─ ログ検索 ├─ トレース表示 └─ メトリクスの相関分析

チェックリスト:監視設計の確認事項

基本事項

  • 監視の目的が明確か(何を守りたいのか)
  • SLI/SLO が定義されているか
  • 4つのゴールデンシグナルを監視しているか
  • アラートは対処可能(Actionable)か

技術的実装

  • メトリクス収集の仕組みがあるか
  • ログ集約の仕組みがあるか
  • 分散トレーシングがあるか(マイクロサービスの場合)
  • 外形監視があるか

アラート設計

  • アラートの優先度が定義されているか
  • 通知先が適切に設定されているか
  • エスカレーションポリシーがあるか
  • アラート疲れ対策がされているか

運用体制

  • オンコール体制が整っているか
  • ランブック(対応手順書)があるか
  • 定期的なアラートレビューをしているか
  • ポストモーテム(事後分析)をしているか

まとめ

監視設計の鉄則

  • ユーザー影響を最優先に: 内部メトリクスよりユーザー体験
  • シンプルに始める: 4つのゴールデンシグナルから
  • 継続的に改善: アラートは定期的に見直す
  • 対処可能なアラートのみ: 「念のため」アラートは作らない
  • 観測可能性を高める: 未知の問題も調査できるようにする

次のステップ

  • 現在の監視状況を棚卸しする
  • SLI/SLO を定義する
  • 不要なアラートを削除する
  • ランブックを作成・更新する
  • ダッシュボードを整理する

さらに学ぶ

監視の理論や概念について学び直したい場合は、理論と概念編を参照してください。

参考リソース

AWS

Prometheus

Datadog

RK

1997年生まれ

ITエンジニア

インフラ・SRE