設問と適用コンテキスト
09:10、あるリージョンでチェックアウト機能のパフォーマンスが低下しました。5xxエラー率が0.3%から5.2%に上昇し、p95レイテンシーが280ミリ秒から2.6秒に増加しました。また、その10分前にリリースが完了しています。データ損失は確認されていません。最初の30分間において、重大度の評価、影響の封じ込め、範囲の絞り込み、仮説の検証、復旧の確認、および根本原因分析(RCA)のための証拠保全をどのように進めるか説明してください。
これは、ソフトウェアエンジニア、SRE、DevOpsエンジニア、プラットフォームエンジニア、テクニカルサポートエンジニアを対象としたクロスレイヤーのトラブルシューティングに関する質問です。障害の原因があらかじめクライアント、サービス、データベース、ネットワーク、サードパーティ依存関係のいずれかにあると決めつけられているわけではありません。核心となるスキルは、運用リスクを制御しながら、証拠を用いて事象(症状)から障害境界へと絞り込んでいくことです。
記載されている時刻、エラー率、レイテンシーは面接のシナリオ上の入力値であり、普遍的なアラート閾値ではありません。サービスの復旧と根本原因の証明は切り離して考えてください。深刻なインシデントの最中、チームはログ、トレースサンプル、変更履歴を保全しつつ、テスト済みの可逆的な緩和策を適用することがあります。根本原因の特定には、競合する仮説を識別できる証拠が依然として必要です。
面接官が評価するポイント
第1の評価シグナルは、正確な問題定義です。「システムが遅い」という表現では適切なアクションを導けません。優れた回答では、期待される挙動と実際の挙動、発生時刻、影響を受けるユーザーやリージョン、継続的か断続的か、ビジネス損失、データの整合性、セキュリティリスクを明確にします。これらの事実に基づいて、インシデントを宣言するかどうかが決定されます。
第2のシグナルは優先順位付けです。ユーザーへの影響が現在進行形で発生している場合、当面の目標は影響を安全に軽減することです。データベースの変更に互換性がない場合、フォールバックのキャパシティが不足している場合、またはプロトコルが乖離している場合、ロールバック、機能無効化、トラフィックシフト、機能縮退(デグラデーション)によってインシデントが拡大することもあります。選択した緩和策について、適用条件、承認者、切り戻し手順、復旧シグナルを述べてください。
第3のシグナルは仮説駆動型の診断です。ログ、メトリクス、トレースは証拠の種類であり、それ自体が一連の決まった手順ではありません。優れた回答では、反証可能な仮説の候補を少数提示し、それぞれが発生させるであろう証拠を予測した上で、それらを区別するための最も低リスクな検証を選択します。発生時刻に近いリリースは仮説の1つの優先度を上げますが、時間的相関関係は因果関係を証明するものではありません。
第4のシグナルはインシデントの連携体制です。複数人が同時に設定変更、インスタンスの再起動、詳細ログの有効化などを行うと、現場の状況が変わり、原因の特定が不可能になります。成熟した回答では、インシデントリード、オペレーター、コミュニケーターを指名し、無関係な変更を凍結した上で、すべてのアクションと観察結果を記録します。所定のタイミングで本番環境を変更できるのは、明示的に承認された単一の経路のみです。
最後に、面接官は検証ループを確認します。トラフィックが減少したためにエラー率が低下した可能性や、再起動によってメモリリークが一時的に隠蔽された可能性があります。正常な対照群(コントロール)と復旧状態を比較し、レイテンシー、エラー、飽和度、バックログ、ビジネス成功率を検査した上で、重複請求や注文欠落の照合を個別に実施します。目先の復旧と長期的な防止策には、それぞれ異なる終了基準(Exit Criteria)が必要です。
回答前に確認すべき明確化のための質問
- 手法を問う設問か、過去の経験を問う設問か? 手法を問う設問であれば提示されたシナリオを使用します。自身の経験を問われた場合は、検証可能な実インシデントに切り替え、自身の権限とチームの役割を明確にし、架空の本番作業を捏造しないようにします。
- ユーザーへの影響と重大度はどの程度か? アクセス数の少ない内部ツールであれば静観が許される場合もあります。チェックアウトの大規模な失敗、データ破損、セキュリティイベントの場合は、即時のエスカレーション、変更の制限、大規模な対応チームの招集が必要です。
- データやセキュリティが侵害されている可能性はあるか? レイテンシーの上昇のみであれば、一部のトラフィックは安全なまま維持できる可能性があります。二重請求、不正アクセス、データ破損の可能性がある場合は、書き込みの一時停止や経路の隔離が必要となり、復旧承認のハードルが高くなります。
- リリースには何が含まれていたか? コード、設定、データベースマイグレーション、依存関係のバージョン、インフラの変更によって、ロールバックに伴うリスクは異なります。互換性のないスキーマ書き込み後にアプリケーションをロールバックすると、インシデントが悪化する可能性があります。
- 正常な対照群(コントロール)はどこにあるか? 別のリージョン、旧バージョンのインスタンス、対象機能が無効なテナント、または同一リージョン内の他のエンドポイントを比較することで、バージョン、リージョン、入力データ、依存関係による要因を切り分けることができます。対照群が存在しない場合は、低リスクなシンセティックリクエストや読み取り専用のチェックを作成します。
- 自身の役割と権限は何か? インシデントリードは全体状況を把握し、オペレーターはシステムを変更し、コミュニケーターはステークホルダーへ状況を共有します。調査担当者は本番権限を越権することなく、証拠を提示してエスカレーションを行うべきです。
- どの緩和策が安全と確認されているか? フィーチャーフラグ、トラフィックシフト、安定した別スタックへの切り替え、機能縮退、ロールバックなどは、キャパシティ、状態の互換性、切り戻し手順が確認されて初めて有効な選択肢となります。
30秒回答フレームワーク
「まず、影響範囲、データリスク、重大度を特定し、必要に応じてインシデントを宣言して無関係な変更を凍結します。ユーザー影響が出ている間は、十分なキャパシティを持つテスト済みの可逆的な緩和策を選択し、証拠を保全します。時間、リージョン、バージョン、リクエスト群、依存関係を比較し、いくつかの反証可能な仮説を立てます。メトリクスで範囲を、トレースで遅延境界を、ログで具体的な障害内容を特定します。文書化された変数を1回に1つずつ変更します。復旧の判断には、健全なSLI、ビジネス成功率、バックログの解消、データの照合が必要であり、その後に根本原因分析と予防策へと進みます。」
この冒頭部分により秩序立った対応を示せます。掘り下げた回答では、判断条件や仮説を棄却するための証拠についても述べる必要があります。
ステップごとの詳細な回答
まず、チーム全員が同一の問題を調査できるよう、事象の前提(症状の定義)を整理します。
- 期待値と実績値: 5xxエラー率のベースラインは0.3%、p95は280ミリ秒。現在の値は5.2%と2.6秒。
- 時刻: 10分前にリリースが完了した後、09:10に検知。真の発生開始時刻と、障害が継続的か断続的かを特定する。
- 範囲: 現在は1つのリージョンでのみ確認。エンドポイント、バージョン、テナント、デバイス、リクエスト入力値ごとにさらに切り分けを進める。
- 影響: 失敗したチェックアウト件数とビジネス損失を集計し、ユーザー側の回避策が存在するか確認する。
- 整合性: 重複請求、注文未生成の課金、イベント欠落、不正アクセスを個別に確認する。「未確認」は「問題が存在しないことの証明」ではない。
影響がインシデントの基準値を超える場合は、統制プレーンを1つ確立します。インシデントリードが優先順位と決定ログを管理し、オペレーターが本番環境の変更を実施し、コミュニケーターがユーザー影響、既知の事実、現在のアクション、次回の更新予定時刻を定期的に共有します。無関係なリリースを凍結します。タイムライン、ダッシュボードのスナップショット、代表的なトレースID、変更バージョン、実施した各介入措置を記録します。証拠の保全が緩和策の妨げになってはなりませんが、盲目的な再起動はインメモリの証拠を消去し、その後の観察結果を変化させてしまいます。
さらなる診断を進める前に、緩和措置を講じるべきかを判断します。明確な比較基準を用います。「現在の被害は、緩和策に伴う想定され得る最大のリスクよりも大きいか?」 データ破損の可能性がある場合は、書き込みを停止するか経路を隔離します。直前の変更が安全にロールバック可能であり、安定版のターゲットに十分なキャパシティがある場合は、ロールバックまたはトラフィックシフトを実施します。スキーマ、メッセージ形式、外部への副作用が変更されている場合は、フィーチャーフラグ、レートリミット、または互換性確保用のパスを優先します。すべての緩和策には、期待されるシグナル、観察期間、切り戻し手順が必要です。
最も長いログファイルを漫然と眺めるのではなく、対比を用いた診断を開始します。5つの次元において、片側だけが異常な境界を見つけ出します。
- 時間: 発生時刻の前後に、どのようなコード、設定、証明書、トラフィック、依存関係の状態が変化したか?
- リージョン: 同じバージョンが他リージョンでは正常に稼働しているか。また、影響を受けているリージョンでは旧バージョンも異常な状態になっているか?
- バージョン: 単一のリージョン内で、新旧インスタンス間でエラー率やレイテンシーに差異があるか?
- リクエスト: エンドポイント、テナント、決済手段、デバイスバージョン、入力サイズなどによって障害が集中しているか?
- 依存関係: 遅延時間はクライアント、エッジ、アプリケーション、データベース、キャッシュ、サードパーティ呼び出しのどこで蓄積しているか?
原因の候補をチャット上に散乱させず、仮説管理表(Hypothesis Ledger)にまとめます。
| 仮説 | 正しい場合の予測 | 最も低リスクな検証 | 結果によって方針をどう変更するか |
|---|---|---|---|
| 新リリースのリグレッション | 対象リージョン内で新バージョンのみが失敗し、旧バージョンは正常 | バージョンごとにSLIを分割し、同一入力に対するトレースを比較 | 両方のバージョンで失敗している場合、この仮説の優先度を下げる |
| リージョン固有の設定または依存関係 | 同一バージョンが特定の1リージョンでのみ失敗 | 設定のダイジェスト値およびダウンストリームのスパンレイテンシーを比較 | 他リージョンでも失敗している場合、入力データまたはグローバルな依存関係に焦点を移す |
| 特定のリクエスト群(コホート)が引き金 | 特定可能なリクエストグループにエラーが集中 | 機密性のないフィールドでセグメント化し、マスキング済みサンプルをリプレイ | 均等に分散している場合、共有リソースの問題に焦点を移す |
| キャパシティまたはキューの滞留 | 飽和度、キュー長、テールレイテンシーが同時に上昇 | トラフィック、並行性、プール待ち時間、リソースパーセンタイルを比較 | リソースがアイドル状態の場合、ロック、タイムアウト、依存関係に焦点を移す |
検証の優先順位は、確からしさ、ユーザー影響、結果判明までの時間、本番リスクに基づいて決定します。メトリクスは問題が「いつ」「どこで」始まったかを特定します。分散トレースは単一のリクエストが「どこで」時間を費やしたかを示します。構造化ログは具体的なエラー、リトライ、状態遷移の理由を説明します。コード、設定、デプロイ履歴は「何が」変わったかを示します。1行のログから全体を推測することはできず、集計値から単一のステートマシンを説明することはできません。リクエストIDと同一の時間枠を用いてこれらを関連付けます。
1回の実験につき変更する変数は1つとし、結果によってどのように仮説が反証されるかを事前に明文化します。旧設定を通じて制限されたシンセティックリクエストを送信することで、設定に起因するものか入力データに起因するものかを区別できます。本番環境全体で詳細ログ(verbose log)を有効化すると、I/Oやレイテンシーが増加し、機密データが露出し、障害の挙動自体が変わってしまう恐れがあります。正常なレプリカ、ステージング環境、または限定的なトラフィックを用いて、最も可能性が高く、安全で、識別力の高いテストから順に実施します。安全な再現が不可能な場合は、相関関係を安易に確定事実とせず、「最も可能性の高い原因」という表現に留めます。
修正や緩和策を実施した後は、その作業から独立したシグナルを用いて検証します。5xx、p50/p95/p99、チェックアウト成功率、リソース飽和度、コネクションプールおよびキューのバックログ、ダウンストリームのエラー、リトライ、アラートの状態などを確認します。少なくとも1つの正常なリージョンまたは安定バージョンと比較し、通常の変動範囲をカバーするのに十分な長さの所定の期間観察します。注文データと決済データを照合し、二重請求、注文の欠落、スタックした状態がないか確認します。ユーザー体験が回復し、バックログが解消され、整合性チェックに合格した後にのみ、緩和措置を終了します。
システムの安定化後に根本原因分析を完了させます。直接的なトリガー、影響を拡大させた技術的要因、検知を遅らせたプロセスの不備を切り分けます。予防策には、担当者、期限、検証方法を明確に定めます。リージョン設定のカナリアリリース、依存関係に対するシンセティックプローブ、エンドツーエンドのリクエストID、自動フォールバック基準、訓練されたランブックなどが挙げられます。担当者のいない10個の推奨事項よりも、検証済みの2つの改善策の方が有用です。
高品質な回答例
以下の調査結果および数値は、すべて面接シナリオ用の架空のデータです。口頭での回答例を示すものであり、実際のインシデントや普遍的な閾値ではありません。
「私はこれをチェックアウト機能のアクティブなインシデントとして扱います。5xxは0.3%から5.2%に上昇し、p95は280ミリ秒から2.6秒に悪化しており、ユーザーへの影響が継続しています。直ちに重複請求、注文欠落、セキュリティリスクの有無を確認します。これらが排除されるまでは、『データ損失は確認されていない』という状態は安全を保証するものではありません。無関係なリリースを凍結し、インシデントリード1名、本番オペレーター1名、コミュニケーター1名を指名し、トレースサンプルと変更記録を保全します。
直近のリリースは優先度の高い仮説ですが、結論ではありません。影響を受けているリージョン内で新旧のインスタンスを比較し、さらに正常なリージョンを第2の対照群として使用します。例えば、影響を受けているリージョンのv42で5xxが5.4%、v41で5.0%である一方、別リージョンのv42では0.4%だったとします。これによりコードバージョン単体に起因する可能性は低くなり、リージョン固有の設定または依存関係の問題が浮上します。
次に、同一のチェックアウトコホートに対するトレースを検査します。失敗の91%が決済トークン化サービスの呼び出しでタイムアウトしており、p95が影響リージョンでは2.3秒、正常リージョンでは180ミリ秒だったとします。変更ログを確認すると、リージョン設定v17が09:00にリリースされ、その呼び出しが新しいプロキシパスに変更されていました。代表的な証拠を保全し、v17からv16への互換性、ロールバックの権限、既存コネクションの挙動を確認した上で、該当するリージョン設定のみをロールバックします。コードのロールバック、再起動、スケーリングを同時に行うことはしません。
ロールバック後にダッシュボードが1つグリーンになっただけでは不十分です。その後15分間で5xxが0.4%に低下し、p95が320ミリ秒に改善し、キューが解消され、チェックアウト件数が回復したとします。また、注文と決済の照合により、重複請求、注文欠落、スタックした状態がないことも確認します。制御された設定の切り戻しとこれらの独立したシグナルにより、プロキシパスが直接のトリガーであったことが裏付けられます。それでもステージング環境で事象を再現させ、なぜリージョン設定にカナリアリリースや依存先レイテンシーのガードレールが存在しなかったのかを検証します。
再発防止策としては、リージョン設定の少流量トラフィックでの段階的ロールアウト、決済トークン化に対するリージョンごとのシンセティックプローブとテールレイテンシーアラート、エラーとレイテンシーの双方をカバーする自動フォールバック基準、設定ロールバックおよびデータ照合用のランブックの整備を含めます。各項目に担当者と期日を設定し、インシデント対応訓練の実施を受入条件とします。」
よくある間違い
- 直近のリリースを根本原因と決めつける → トラフィックの急増、証明書の更新、ダウンストリームの変更が偶然重なることがあります → バージョンとリージョンの対照群を作成し、予測が反証され得る検証を実行してください。
- 手当たり次第にログを開く → 時間、範囲、仮説がないままデータ量を増やしても、無関係な異常値が増えるだけです → 症状を定量化し、メトリクスとトレースを用いてコンポーネントと対象コホートを絞り込んでください。
- 無条件にロールバックを実行する → スキーマ、メッセージ、状態の変更後には、旧バージョンとの互換性が失われている可能性があります → 緩和策を選択する前に、状態の互換性、キャパシティ、切り戻し手順を確認してください。
- 全員が思い思いに修正を試みる → 同時並行の変更は原因の特定を不可能にし、インシデントを拡大させる恐れがあります → 役割を割り当て、記録権限を持つ単一の窓口を通じて本番環境への変更を行ってください。
- 再起動を根本原因と呼ぶ → 再起動はキュー、コネクション、メモリをリセットするだけであり、状態がクリアされたことしか証明していません → その状態を作り出した原因を突き止め、再発・蓄積しないかを監視してください。
- 平均レイテンシーのみを確認する → 深刻なテールレイテンシーの悪化は、平均値の中に埋もれて見えなくなることがあります → 影響を受けているコホートでセグメント化し、エラー、レイテンシーのパーセンタイル、トラフィック、飽和度を検査してください。
- リスク評価なしに詳細ログを有効化する → ログ出力の増加はI/Oやレイテンシーを悪化させ、機密フィールドを露出させるリスクがあります → 対象インスタンス、期間、出力項目を限定し、自動停止機能を設けてください。
- ダッシュボード復旧後のデータ照合を省略する → タイムアウトによるリトライが、二重請求、注文欠落、バックログの滞留を引き起こしている可能性があります → ビジネスデータと外部への副作用を明示的に照合してください。
- 振り返りを「モニタリングの改善」で終わらせる → メトリクス、担当者、閾値、テスト方法が定まっていなければ、検証可能な改善とは言えません → 実行可能なアクションを作成し、訓練や障害注入テストを通じて有効性を確認してください。
追加の質問と回答例
追加質問1: ロールバックが完了したものの、障害が改善しません。次に何をしますか?
ロールバックが正常に完了したことを記録し、トラフィックが実際に旧バージョンに到達していることを確認します。到達していない場合、「ロールバックの失敗」自体がデプロイシステムの障害である可能性があります。旧バージョンでも異常が続く場合は、コードリグレッションの仮説の優先度を下げ、リージョン設定、依存関係のスパン、証明書、DNS、トラフィックの内訳、共有リソースを比較します。元に戻す明確なメリットとリスク評価がない限り、即座に新バージョンを再デプロイしてはなりません。
追加質問2: データの破損が疑われる場合、対応はどう変わりますか?
封じ込めの優先順位が上がります。該当する書き込み処理を停止するか、影響を受けるテナントを隔離するか、あるいは読み取り専用モードに切り替えます。監査ログと生のイベントデータを保全し、復旧の承認にはデータ担当者やセキュリティ責任者の参画を必須とします。データの複製や隔離された環境で修復手順を検証し、影響範囲を棚卸しして照合を行い、可逆的な修正を適用します。単にサービスのレスポンスが正常に戻ったという理由だけで書き込みを再開してはなりません。
追加質問3: ログは散在しているものの分散トレーシングが存在しない場合、どう対応しますか?
ゲートウェイのアクセスログ、タイムスタンプ、インスタンス、リクエストタイプ、既存の相関フィールドを用いて境界を推測します。既知の識別子を持つ低リスクなシンセティックリクエストを各ステップに送信します。本番環境全体でリクエストボディをログ出力するような対応は避けてください。インシデント収束後、重要な境界においてエッジから依存先に至るリクエストID、レイテンシー、ステータス、バージョンのフィールドを追加します。オブザーバビリティの欠如は影響を拡大させた要因として扱い、担当者と受入テストを割り当てます。
追加質問4: 複数のチームが互いに「相手のシステムに原因がある」と主張しています。どのように進めますか?
インシデントリードは組織的な責任の押し付け合いではなく、ユーザー影響に基づいて各コンポーネントの調査を割り当てます。全員が単一のタイムラインと仮説管理表に基づいて作業し、「このリクエストは自社サービスを120ミリ秒で正常に通過したが、次のスパンで2秒かかった」といった検証可能な予測と証拠を提出します。本番環境への変更権限は一元化された状態を維持し、各チームが勝手にシステムを変更しないようコミュニケーターが事実を統合します。
追加質問5: 問題が断続的であり、確実に再現させることができません。どのように根本原因を確定しますか?
まずは安全な受動的証拠の収集を拡大します。成功例と失敗例をサンプリングし、バージョンや入力の次元を保持し、リソースと依存関係の状態を記録します。仮説を切り分けられる自然な対照群を探します。確証を得るために本番環境でリスクの高い状態を作ることは避け、隔離環境で障害注入やトラフィックリプレイを実施します。証拠が確率的なものに留まる場合は、最も可能性の高い要因と依然として不明な点を明記した上で、再発時の影響を軽減するガードレールとオブザーバビリティを追加します。