障害対応手順
Bazbiiシステムのインシデント対応とトラブルシューティング手順を説明します。
インシデント対応の概要
インシデントの定義
- サービス停止: ユーザーがサービスを利用できない状態
- パフォーマンス劣化: レスポンスタイムが大幅に増加
- データ不整合: データの整合性が損なわれた状態
- セキュリティインシデント: 不正アクセス、データ漏洩など
インシデントの分類
重大度レベル
- P0 (Critical): サービス完全停止
- P1 (High): サービス大幅な機能制限
- P2 (Medium): 一部機能の不具合
- P3 (Low): 軽微な不具合、改善要望
インシデント対応フロー
1. インシデント検知
検知方法
- 監視アラート: Grafana Cloudからのアラート
- ユーザー報告: サポートチケット、問い合わせ
- ログ確認: エラーログの急増
- メトリクス異常: リクエスト数、エラー率の急変
アラート確認
# Grafanaダッシュボード確認
# - エラー率のグラフ
# - レスポンスタイムのグラフ
# - リソース使用率のグラフ
2. 初期対応
インシデントの確認
-
影響範囲の把握
- どのサービスが影響を受けているか
- どのユーザーが影響を受けているか
- どの機能が影響を受けているか
-
ログ確認
# エラーログを確認
kubectl logs -f deployment/gateway | grep error
# 特定のログIDで検索
kubectl logs deployment/api | grep "EVT_POST_003"
- メトリクス確認
# Grafana Cloud Prometheus互換エンドポイントへのクエリ(PromQL)
rate(http_requests_total{status=~"5.."}[5m])
緊急対応
- サービス停止: 原因不明の場合は一時的にサービスを停止
- ロールバック: 直近のデプロイが原因の場合はロールバック
- トラフィック制限: DDoS攻撃の場合はトラフィック制限
3. 原因調査
調査項目
-
最近の変更
- デプロイ履歴
- 設定変更
- データベースマイグレーション
-
ログ分析
# エラーログの集計
kubectl logs deployment/api | grep error | wc -l
# 時間帯別のエラー数
kubectl logs deployment/api --since=1h | grep error
- メトリクス分析
- リクエスト数の推移
- エラー率の推移
- レスポンスタイムの推移
- リソース使用率
- データベース確認
# 接続数確認
kubectl exec deployment/api -- psql -c "SELECT count(*) FROM pg_stat_activity;"
# ロック確認
kubectl exec deployment/api -- psql -c "SELECT * FROM pg_locks WHERE NOT granted;"
4. 修正・復旧
修正方法
- 設定変更: 設定の問題の場合は修正
- コード修正: バグの場合は修正
- リソース追加: リソース不足の場合はスケールアップ
- ロールバック: 直近の変更を戻す
復旧確認
# ヘルスチェック
curl https://api.bazbii.app/healthz
# メトリクス確認
# Grafanaダッシュボードで正常値を確認
5. 事後対応
インシデント報告書の作成
- 発生時刻: いつ発生したか
- 検知時刻: いつ検知したか
- 復旧時刻: いつ復旧したか
- 原因: 何が原因だったか
- 影響範囲: どのような影響があったか
- 対応内容: どのような対応をしたか
- 再発防止策: 再発を防ぐための対策
再発防止策
- コード修正: バグ修正
- 監視強化: 監視項目の追加
- アラート改善: アラート閾値の調整
- ドキュメント更新: 手順書の更新
トラブルシューティング手順
よくある問題と対処法
1. サービスが起動しない
# ログ確認
kubectl logs deployment/gateway
# ポッドの状態確認
kubectl get pods
# イベント確認
kubectl describe pod <pod-name>
2. データベース接続エラー
# 接続数確認
kubectl exec deployment/api -- psql -c "SELECT count(*) FROM pg_stat_activity;"
# 接続プール設定確認
kubectl get configmap api-config -o yaml
# データベースの状態確認
kubectl logs deployment/postgres
3. メモリ不足
# リソース使用率確認
kubectl top pods
# メモリ使用量確認
kubectl exec deployment/api -- free -h
# メモリリークの可能性がある場合
kubectl logs deployment/api | grep "out of memory"
4. レスポンスタイムの悪化
# スロークエリ確認
kubectl exec deployment/api -- psql -c "SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;"
# リクエスト数の確認
# Grafanaでリクエスト数のグラフを確認
5. エラー率の増加
# エラーログの集計
kubectl logs deployment/gateway --since=1h | grep error | wc -l
# エラーの種類を確認
kubectl logs deployment/gateway --since=1h | grep error | sort | uniq -c
# 特定のエラーを調査
kubectl logs deployment/api | grep "EVT_POST_003"
エスカレーション基準
エスカレーションレベル
- L1 (担当者): 初期対応、基本的なトラブルシューティング
- L2 (上級者): 複雑な問題の調査、コード修正
- L3 (アーキテクト): アーキテクチャレベルの問題
エスカレーション条件
- P0: 15分以内に解決できない場合は即座にエスカレーション
- P1: 30分以内に解決できない場合はエスカレーション
- P2/P3: 必要に応じてエスカレーション
インシデント後のレビュー(Post-Mortem)
Post-Mortemの目的
- インシデントの原因を深掘り
- 対応プロセスの改善点を特定
- 再発防止策を立案
Post-Mortemの内容
- タイムライン: インシデント発生から復旧までの経緯
- 原因分析: 根本原因の特定
- 対応の振り返り: 対応プロセスの評価
- 改善策: 再発防止策とプロセス改善
Post-Mortemテンプレート
# インシデント報告書
## 概要
- 発生時刻: YYYY-MM-DD HH:mm
- 検知時刻: YYYY-MM-DD HH:mm
- 復旧時刻: YYYY-MM-DD HH:mm
- 影響時間: X時間Y分
## 影響範囲
- 影響を受けたサービス: Gateway, API
- 影響を受けたユーザー数: 約XX人
- 影響を受けた機能: 投稿作成、フィード取得
## 原因
- 直接原因: データベース接続プールの枯渇
- 根本原因: 接続プールサイズの設定不備
## 対応内容
1. 接続プールサイズを増加
2. 既存接続の確認・切断
3. サービス再起動
## 再発防止策
- [ ] 接続プールサイズの適切な設定
- [ ] 接続数の監視アラート追加
- [ ] ドキュメント更新