1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

障害調査をスクリプトで効率化してみた 〜AWS・Apache・PHP-FPM・k6で検証〜

1
Posted at

障害調査をスクリプトで効率化してみた〜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に渡すことで、お客様への報告メールの作成時間も短縮できると考えています。

実際の運用ではお客様との調整や作業許可が必要になるため、完全な自動化は難しい部分もありますが、こうした仕組みを活用して障害対応全体の効率化につなげていきたいです。

最後まで読んでいただき、ありがとうございました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?