障害調査をスクリプトで効率化してみた〜AWS・Apache・PHP-FPM・k6で検証〜
はじめに
はじめまして、エンジニア1年目のりーやんと申します!
現在、AWSを中心としたMSP企業でサーバーの運用・監視を担当しています。
まだまだ技術的に学ぶことは多いですが、まずは自分で手を動かし、実際に試しながら理解を深めていくことを大切にしています!
今回したいこと
普段の業務では、サーバーに高負荷が発生した際、お客様への報告に向けて原因調査を行っています。
報告にあたっては、どのプロセスがリソースを消費していたのか、どのIPアドレスからアクセスが集中していたのか、クローラなどの自動アクセスなのか、一般ユーザーによる通常のアクセスなのか、といった情報を確認する必要があります。
特にアクセス集中が原因の場合、複数のコマンドを実行して情報を集める必要があり、調査に手間がかかります。
そこで今回は、こうした調査を効率化するため、サーバーのリソース状況やApacheのアクセスログをまとめて解析できるスクリプトを作成してみました。
さらに、スクリプトで出力した調査結果を、あらかじめ報告の定型文やルールを設定したAIに渡すことで、お客様への報告メールの作成時間も短縮できると考えています。
1. 今回の構成
AWS上にEC2を2台用意しました。
| EC2 | 役割 |
|---|---|
| 監視対象EC2 | Apache・PHP-FPMを動かすWebサーバー |
| 負荷発生用EC2 | k6で負荷テストを実施 |
負荷発生用EC2
└─ k6
│
│ HTTPリクエスト
▼
監視対象EC2
├─ Apache
├─ PHP-FPM
├─ アクセスログ
└─ 調査スクリプト
2. 調査スクリプトの作成
今回はBashをベースに、Linuxのリソース情報とApacheのアクセスログをまとめて調査できるスクリプトを作成しました。
スクリプトの構成は以下のとおりです。
Bashによるリソース情報の取得
-
uptime:Load Averageの確認 -
ps:CPU使用率の高いプロセスの確認 -
free:メモリ使用状況の確認 -
df:ディスク使用状況の確認 -
sar:CPUやLoad Averageの推移を確認
PythonによるApacheアクセスログの解析
- アクセス元IP別のリクエスト数
- アクセス先URL
- User-Agent
- HTTPステータスコード
- HTTPメソッド
- 1分ごとのリクエスト数
Bashで各種コマンドを実行し、Pythonでアクセスログを解析する構成にしています。
それぞれの調査結果を一つのレポートにまとめ、実行日時付きのログファイルとして保存する仕組みです。
3. 負荷テスト
負荷テストにはGrafana k6を使用しました。
今回は同時ユーザー数50、実行時間30秒でテストします。
負荷発生用EC2で実行します。
k6 run --vus 50 --duration 30s -e TARGET_URL=http://<監視対象EC2のIP>/ - <<'EOF'
import http from 'k6/http';
export default function () {
http.get(__ENV.TARGET_URL);
}
EOF
50人の仮想ユーザーが、それぞれ繰り返しHTTPリクエストを送信します。
4. スクリプトの実行
監視対象EC2に以下のスクリプトを作成しました。
/usr/local/bin/incident-check.sh
監視対象EC2で実行します。
/usr/local/bin/incident-check.sh
デフォルトでは過去10分間を調査します。
引数を指定すれば、対象期間を変更できます。
/usr/local/bin/incident-check.sh 30
調査結果は以下のディレクトリに保存されます。
/var/log/incident-check/
5. 検証結果
同時ユーザー数50、30秒間の負荷テストを実施した結果です。
サーバーリソース
| 項目 | 結果 |
|---|---|
| CPUコア数 | 2 |
| Load Average(1分) | 7.43 |
| Load Average(5分) | 5.27 |
| Load Average(15分) | 2.13 |
| メモリ使用量 | 238MiB |
| メモリAvailable | 532MiB |
Load Averageは一時的に高い値を記録していました。
一方、調査時点ではCPU使用率はほぼ0%で、メモリにも大きな逼迫はありませんでした。
Apacheアクセス状況
| 項目 | 結果 |
|---|---|
| 総リクエスト数 | 272,022件 |
| 最大リクエスト数 | 141,765件/分 |
| 接続元IP | 13.208.216.59 |
| アクセス先 | / |
| HTTPステータス | 200 |
User-Agentからもk6によるアクセスであることを確認できました。
Grafana k6/2.3.0
アクセスログの解析エラーは0件でした。
6. まとめ
今回は、Linuxのリソース情報とApacheのアクセスログを一括で取得・解析できるスクリプトを作成しました。
複数のコマンドを個別に実行する必要がなくなり、調査結果もレポート形式で保存できるようになりました。
今後は、閾値を超えた際に調査スクリプトを自動実行できるようにするなど、さらに発展させてみたいと思います。
また、今回のスクリプトで出力した調査結果を、あらかじめ報告の定型文やルールを設定したAIに渡すことで、お客様への報告メールの作成時間も短縮できると考えています。
実際の運用ではお客様との調整や作業許可が必要になるため、完全な自動化は難しい部分もありますが、こうした仕組みを活用して障害対応全体の効率化につなげていきたいです。
最後まで読んでいただき、ありがとうございました!