メインコンテンツまでスキップ

認証サービスの障害ランブック

このランブックは、認証サービス(idp-server)でよく発生する障害パターンと対応手順をまとめたものです。アラートが鳴ったときに、このページを開いて手順に従えば対応できることを目指します。

01〜06 は汎用的な障害対応フレームワークですが、このランブックは認証サービス固有の内容です。自分のサービスのランブックを作る際のテンプレートとしても活用してください。

インフラ前提

このランブックは以下の構成を前提としていますが、障害パターン自体はインフラに依存しません。自分の環境に合わせてコマンドやツールを読み替えてください。

レイヤーこのランブックでの例他の選択肢
コンテナECS FargateKubernetes, Cloud Run
DBAurora PostgreSQLRDS, Cloud SQL, セルフホスト PostgreSQL
キャッシュElastiCache (Redis)MemoryDB, セルフホスト Redis, Valkey
LBALBNLB, Nginx, Envoy
監視CloudWatchDatadog, Grafana, New Relic
証明書ACMLet's Encrypt, mkcert

使い方

  1. アラート名または症状から該当するセクションを探す
  2. 「確認」の手順でどこに問題があるか特定
  3. 「対処」の手順で復旧

パターン一覧

#アラート / 症状想定原因重大度
15xx エラー率の急増アプリバグ、DB障害、リソース枯渇Sev 1-2
2全インスタンス Unhealthyアプリ起動失敗、ヘルスチェック失敗Sev 1
3DB コネクション枯渇プール設定ミス、スロークエリ、ロックSev 2
4レイテンシ悪化DB遅延、外部サービス遅延、GCSev 2-3
5DB フェイルオーバーハードウェア障害、メンテナンスSev 2
6キャッシュ接続エラーノード障害、メモリ枯渇Sev 2
7証明書期限切れ更新忘れSev 1
8ディスク容量不足ログ肥大、パーティション未削除Sev 3

1. 5xx エラー率の急増

確認

# 1. ALB の 5xx 内訳を確認
aws cloudwatch get-metric-statistics \
--namespace AWS/ApplicationELB \
--metric-name HTTPCode_Target_5XX_Count \
--start-time $(date -u -d '30 minutes ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 60 --statistics Sum

# 2. 直近のデプロイがあったか
aws ecs describe-services --cluster idp-cluster --services idp-server \
--query 'services[0].deployments'

# 3. アプリログでエラーを確認
aws logs filter-log-events \
--log-group-name /ecs/idp-server \
--filter-pattern "ERROR" \
--start-time $(date -d '15 minutes ago' +%s000) \
--limit 20

対処

状況対処
直近のデプロイありロールバック(最速)
デプロイなし + DB エラーパターン3
デプロイなし + OOMECS タスクのメモリ上限を確認、必要なら増加
デプロイなし + 原因不明アプリ再起動(force-new-deployment)

2. 全インスタンス Unhealthy

確認

# 1. ターゲットヘルス確認
aws elbv2 describe-target-health \
--target-group-arn $TARGET_GROUP_ARN

# 2. タスクの状態確認
aws ecs describe-services --cluster idp-cluster --services idp-server \
--query 'services[0].{desired:desiredCount,running:runningCount,pending:pendingCount}'

# 3. 停止したタスクの理由
aws ecs list-tasks --cluster idp-cluster --service idp-server \
--desired-status STOPPED --max-items 5
# → 各タスクの stoppedReason を確認

対処

状況対処
タスクが起動しない(Pending のまま)ECS イベントログ確認(リソース不足、イメージプル失敗)
タスクが起動直後に停止アプリログ確認(DB接続失敗、設定エラー)
ヘルスチェックだけ失敗ヘルスチェックパス(/actuator/health/readiness)を手動確認

3. DB コネクション枯渇

確認

-- 接続数
SELECT count(*) FROM pg_stat_activity;

-- 状態別
SELECT state, count(*) FROM pg_stat_activity GROUP BY state;

-- 待機中のクエリ
SELECT pid, state, wait_event_type, wait_event,
NOW() - query_start AS duration, LEFT(query, 80)
FROM pg_stat_activity
WHERE state = 'active' AND wait_event_type = 'Lock'
ORDER BY duration DESC;

対処

状況対処
idle 接続が多いHikariCP の idle-timeout を短縮
active + Lock 待ちが多いロック元のクエリを特定して対処(→ ロック実践
max_connections に到達RDS パラメータで max_connections を増加、またはアプリの pool-size を削減
一時的な対処長時間の idle セッションを切断: SELECT pg_terminate_backend(pid)

4. レイテンシ悪化

確認

# 1. どのエンドポイントが遅いか(ALBアクセスログ)
# /v1/tokens が遅い? /v1/authorizations が遅い?

# 2. DB スロークエリ
# Performance Insights → Top SQL

# 3. GC ログ
aws logs filter-log-events \
--log-group-name /ecs/idp-server \
--filter-pattern "GC pause" \
--start-time $(date -d '30 minutes ago' +%s000)

対処

状況対処
特定クエリが遅いEXPLAIN ANALYZE で実行計画確認、インデックス追加
フック実行が遅いフックのタイムアウト短縮、または一時無効化
GC が頻発ヒープサイズ確認(-Xmx)、メモリリーク調査
全体的に遅いスケールアウト(ECS タスク増加)

5. DB フェイルオーバー

確認

# RDS イベント確認
aws rds describe-events \
--source-identifier idp-cluster \
--source-type db-cluster \
--duration 60

対処

Aurora フェイルオーバーは自動で完了する(30秒〜1分):
・Reader が新 Writer に昇格
・エンドポイントが自動更新
・アプリ側は一時的な接続エラー → HikariCP が自動再接続

やること:
□ フェイルオーバーの完了を確認
□ アプリの接続が復旧したことを確認
□ 原因を確認(計画メンテナンス?ハードウェア障害?)
□ ポストモーテムの要否判断

6. キャッシュ接続エラー

確認

# ノードの状態
aws elasticache describe-cache-clusters \
--cache-cluster-id idp-redis \
--show-cache-node-info

対処

状況対処
ノードが Available でないフェイルオーバーを待つ(Multi-AZ の場合は自動)
メモリ使用率 100%maxmemory-policy 確認(allkeys-lru 推奨)、不要キーの削除
接続数上限アプリの Redis 接続プール設定を確認

7. 証明書期限切れ

確認

# ACM 証明書の期限確認
aws acm list-certificates --query 'CertificateSummaryList[*].[DomainName,NotAfter]'

対処

ACM(AWS Certificate Manager)を使っている場合:
→ DNS 検証なら自動更新される
→ 自動更新されていない場合は DNS レコードを確認

自己署名証明書の場合:
→ 新しい証明書を生成して ALB / CloudFront に適用
→ mkcert で生成している場合は有効期限を確認

8. ディスク容量不足

確認

# Aurora ストレージ使用量
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name VolumeBytesUsed \
--dimensions Name=DBClusterIdentifier,Value=idp-cluster \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 300 --statistics Average

対処

状況対処
security_event パーティションが肥大pg_partman のメンテナンス実行、古いパーティションをアーカイブ
不要なテストデータDELETE FROM security_event WHERE description = 'benchmark-test-data'
Aurora ストレージAurora は自動拡張するが、不要データ削除でコスト削減

このランブックの更新

障害対応のたびに以下を更新する:

□ 新しい障害パターンを追加
□ 既存パターンの対処手順を改善(実際に使って気づいた点)
□ 閾値の調整(アラートが鳴りすぎ or 鳴らなすぎ)
□ 確認コマンドの更新(リソース名の変更等)

関連ドキュメント