はじめに
LabEx Corporationでの3日目、プロジェクト「Phoenix」に危機が訪れました!出社すると、Sarah Chenと開発チームが緊急事態に陥っています。昨日あなたが整理を手伝ったアプリケーションが、最初の主要なテストフェーズで重大なエラーを発生させてしまいました。
監視システムには緊急アラートが鳴り響き、ユーザーからはアプリケーションの障害報告が相次ぎ、デプロイパイプラインは完全に停止しています。シニアDevOpsエンジニアが病欠で不在の中、プロジェクトの締め切りが迫っており、Sarahはあなたに助けを求めてきました。
「あなたにこの調査を任せたい」と、Sarahはインシデントレポートを差し出します。「昨日、あなたがファイル整理で見せてくれた体系的なアプローチがまさに今必要なんです。この謎を解き明かしてください」
あなたのミッションは、プロジェクト「Phoenix」のサーバーを深く調査し、ログと設定ファイルを分析して、障害の根本原因を突き止めることです。高度なLinuxコマンドラインツールを駆使して手がかりをつなぎ合わせ、チームが懸命に作り上げたアプリケーションの安定性を取り戻しましょう。プロジェクト「Phoenix」の未来、そしてTechNovaでのあなたのキャリアは、あなたの探偵スキルにかかっています!
アプリケーションログファイルの内容確認
調査官としての最初のステップは、プロジェクト「Phoenix」のアプリケーションログファイルを確認することです。アプリケーションは ~/project/logs/app.log にログを書き出しています。膨大なメッセージの中から、昨日整理を手伝ったシステムで何が起きているのかを理解するために、重大なエラーメッセージを素早く見つけ出す必要があります。
タスク
~/project/logs/app.logファイルをフィルタリングし、ERRORという単語が含まれるすべての行を見つけます。- 抽出した行を
~/project/error_report.txtという名前の新しいファイルに保存します。
要件
- ファイルの検索にはコマンドラインツールを使用してください。
- 検索対象の入力ファイルは
~/project/logs/app.logです。 - 出力は
~/projectディレクトリ内の~/project/error_report.txtというファイルに保存する必要があります。 - 出力ファイルには、
ERRORという単語を含む行のみが含まれている必要があります。
ヒント
grepコマンドは、テキストファイル内のパターン検索に最適です。- コマンドの出力をファイルに保存するには、リダイレクト演算子
>を使用します。これにより、ファイルが存在しない場合は作成され、存在する場合は上書きされます。
例
ログファイルのフィルタリングに成功すると、~/project/error_report.txt ファイルにはエラー行のみが含まれるようになります。
$ cat ~/project/error_report.txt
[2023-10-26 10:00:03] ERROR: Failed to process payment transaction #12345.
[2023-10-26 10:00:05] ERROR: NullPointerException at com.innovatech.Billing.process(Billing.java:101).
ファイルには、タイムスタンプで始まり「ERROR」という単語を含む、正確に2行が含まれているはずです。
システムブートメッセージの調査
アプリケーションのエラーは、より深いハードウェアやカーネルレベルの問題の兆候である可能性があります。このような問題を調査するのに適した場所は、システムの起動プロセスやドライバの動作に関するメッセージが含まれるカーネルリングバッファです。
タスク
- システムのカーネルメッセージを調べ、
failまたはerrorに関連する行を探します。 - これらの調査結果を
~/project/boot_issues.txtという名前のファイルに保存します。
要件
- カーネルメッセージを表示するには
dmesgコマンドを使用してください。 failまたはerrorの検索は大文字と小文字を区別しないようにしてください。- 結果は
~/project/boot_issues.txtというファイルに保存する必要があります。 - 注意:カーネルメッセージにアクセスするには管理者権限(sudo)が必要になる場合があります。
ヒント
dmesgコマンドはカーネルメッセージを表示します。出力を別のコマンドに「パイプ」してフィルタリングできます。- パイプ演算子
|は、あるコマンドの出力を別のコマンドの入力に渡します。 grepコマンドの-iオプションを使用すると、大文字と小文字を区別せずに検索できます。- 複数のパターン(
failまたはerrorなど)を一度に検索するには、grep -E 'pattern1|pattern2'を使用します。 - 注意:「Operation not permitted」というエラーが発生した場合は、
sudoを付けてコマンドを実行し、必要な権限を取得してください。
例
カーネルメッセージのフィルタリングに成功すると、~/project/boot_issues.txt ファイルには関連するシステムメッセージが含まれるようになります。
$ cat ~/project/boot_issues.txt
[ 0.330755] acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge.
[ 1.026520] RAS: Correctable Errors collector initialized.
[ 28.260800] kernel: [ 10.123456] my-driver: probe of 0000:00:1f.0 failed with error -2
ファイルには、「fail」や「error」(大文字小文字を問わない)という単語を含むカーネルメッセージが含まれ、システム起動時の潜在的なハードウェアやドライバの問題が示されているはずです。
Webサーバー設定ファイルの確認
重大なハードウェアの問題は見つかりませんでした。問題はWebサーバーの設定にあるかもしれません。Nginxの設定ファイルを確認して、どのように設定されているかを見てみましょう。ワーカープロセス数が少なすぎるなどの設定ミスは、負荷がかかった際にパフォーマンスのボトルネックとなり、アプリケーションの障害につながることがあります。
タスク
~/project/config/nginx.confにあるWebサーバー設定ファイルを検索します。worker_processesディレクティブを含む行を見つけます。- この行を、最初のステップで作成した
~/project/error_report.txtファイルに 追記 します。
要件
- 入力ファイルは
~/project/config/nginx.confです。 - 結果を
~/project/error_report.txtに 追記 してください(上書きはしないでください)。
ヒント
- このタスクでも
grepを使用できます。 - ファイルを上書きせずに 追記 するには、
>>演算子を使用します。
例
既存のエラーレポートに worker_processes の行を追記すると、~/project/error_report.txt ファイルには元のエラー行と新しい設定行の両方が含まれるようになります。
$ cat ~/project/error_report.txt
[2023-10-26 10:00:03] ERROR: Failed to process payment transaction #12345.
[2023-10-26 10:00:05] ERROR: NullPointerException at com.innovatech.Billing.process(Billing.java:101).
worker_processes 4;
ファイルには合計3行が含まれているはずです:元のエラー行2行と、新しく追加された「worker_processes 4;」の1行です。
ステージング環境と本番環境の設定ファイルの比較
本番環境での問題の一般的な原因は、ステージング環境と本番環境の間の不一致です。ステージングでは完璧に動作する機能が、わずかな設定の違いによって本番環境で失敗することがあります。両方の環境のアプリケーション設定ファイルを比較して、違いを見つけ出しましょう。
タスク
- ステージング設定ファイル
~/project/config/staging/app.confと本番設定ファイル~/project/config/production/app.confを比較します。 - 違いを
~/project/config_diff.txtという名前の新しいファイルに保存します。
要件
diffコマンドを使用する必要があります。- 違いを示す出力は
~/project/config_diff.txtに保存する必要があります。
ヒント
diffコマンドは、2つのファイルを1行ずつ比較するために設計されています。- 基本的な構文は
diff file1 file2で、file1 を file2 と同じにするために必要な変更が表示されます。 - ファイルの順序が重要です!
diff A Bとdiff B Aでは出力が異なります。 grepと同じように、diffの出力もファイルにリダイレクトできます。
例
ステージングと本番の設定ファイルを比較すると、~/project/config_diff.txt ファイルには両環境の違いが表示されます。
$ cat ~/project/config_diff.txt
1,5c1,5
< ## Staging Configuration
< database.url=jdbc:mysql://staging-db:3306/nexus
< api.key=staging_key_abc123
< feature.flag.new_dashboard=true
< timeout.ms=3000
---
> ## Production Configuration
> database.url=jdbc:mysql://prod-db:3306/nexus
> api.key=prod_key_xyz789
> feature.flag.new_dashboard=false
> timeout.ms=5000
diffの出力は、ステージング設定ファイルを本番設定ファイルと一致させるためにどのような変更が必要かを示しています。< で始まる行はステージングファイルのコンテンツ、> で始まる行は本番ファイルのコンテンツを示しています。これにより、本番環境ではステージング環境と比較して、データベースURL、APIキー、機能フラグ、タイムアウト値が異なっていることがわかります。
サーバー間のディレクトリ整合性の検証
設定の違いは有力な手がかりです!本番サーバーには、ステージングサーバーに存在する重要なファイルがいくつか欠落している可能性があります。これはデプロイの失敗が原因かもしれません。2つの異なるサーバーのファイル構造を表す2つのディレクトリを比較して、これをシミュレーションしてみましょう。
タスク
- 2つのディレクトリがあります:
/home/labex/project/server1_files(ステージングサーバーを表す)と/home/labex/project/server2_files(本番サーバーを表す)。 - これら2つのディレクトリを比較し、
server1_filesにのみ存在するファイルを見つけます。 - 比較結果の完全な出力を
/home/labex/project/missing_files.txtという名前のファイルに保存します。
要件
- 2つのディレクトリを比較するには
diffコマンドを使用する必要があります。 - 出力は
/home/labex/project/missing_files.txtに保存する必要があります。
ヒント
diffコマンドは、ファイルパスの代わりにディレクトリパスを指定すると、ディレクトリを比較することもできます。- ディレクトリを比較する際は、
-rまたは--recursiveオプションを使用するのが良い習慣です。これにより、ディレクトリ内のすべてのファイルが再帰的に比較されます。 - ディレクトリに対する
diffの出力形式は、どのファイルが特定のディレクトリに「のみ存在する(Only in)」かを明示的に示します。 - ファイルの場合と同様に、ディレクトリを比較する際も順序が重要です。
diff dir1 dir2は dir1 にあって dir2 にないものを表示し、diff dir2 dir1はその逆を表示します。
例
2つのサーバーディレクトリを比較すると、/home/labex/project/missing_files.txt ファイルには本番サーバーから欠落しているファイルが表示されます。
$ cat /home/labex/project/missing_files.txt
Only in /home/labex/project/server1_files: asset2.js
この出力は、asset2.js が1つ目のディレクトリ(ステージングサーバーを表す server1_files)には存在するが、2つ目のディレクトリ(本番サーバーを表す server2_files)には存在しないことを示しています。ステージングを先に、本番を後に比較することで、本番環境から欠落しているファイルを簡単に特定でき、アプリケーションの障害の一部を説明できる可能性があります。
まとめ
素晴らしい探偵の仕事ぶりでした!あなたはプロジェクト「Phoenix」の重大な障害の根本原因を特定し、Sarah Chenと開発チームに問題を解決するための実用的な情報を提供しました。
体系的な調査を通じて、あなたは以下の必須トラブルシューティングコマンドを習得しました:
grep: ログファイルをフィルタリングし、重大なエラー情報を抽出する。dmesg: システムレベルのハードウェアやカーネルの問題を調査する。diff: 設定ファイルを比較し、環境間の不一致を特定する。- コマンドパイプラインとリダイレクト: 調査結果を効率的に処理し、文書化する。
あなたのログ分析に対するメソッドアプローチは、プロジェクト「Phoenix」を壊滅的な障害から救いました。開発チームは、あなたが発見した設定の不一致や欠落しているデプロイファイルを修正するための明確な方向性を得ました。
Sarah Chenはあなたの調査スキルに非常に感銘を受け、あなたをセキュリティの役割に推薦しようとしています。明日は「要塞の守護者(Fortress Guardian)」として、プロジェクト「Phoenix」のインフラストラクチャを保護し、将来の脅威から守る役割を担うことになります!



