Amazon-CloudWatch

CloudWatch Logs Insights(分析編)


概要

こんにちは、テクニカルサポートの牛山です。

CloudWatch Logs Insights(集約編)
↑今回は前回、おこないましたEC2からCloudWatchLogsへApacheのログを吐き出すところまでやりましたので、本記事では、吐き出したログを実際に分析していく回となります。

前提条件

  • 前回までの、「CloudWatch Logs Insights(集約編)」を設定済みであること。
  • Apacheログ形式についてある程度、理解していること。
    ※ログ形式は前回記事に記載しております。

指定日時を昇順表示してみる。

サポートされるクエリコマンド詳細説明は以下公式で解説されていますのでご確認ください。
CloudWatch Logs Insights クエリコマンド

~~~

[AWS マネジメントコンソール] → 左上にある検索欄で「cloudwatch」と入力し、一覧に出てくる[CloudWatch]をクリック。
 →[ログプルダウンメニュー]→[Logs Insights]→[ロググループを選択]から「apache_access_log」を選択します。
 →右側にある[ヘルプ]をクリック→コマンド一覧にある[parse]プルダウンメニューを開き[適用]を押します。

クエリ構文が変わりますので、クエリの実行を押してみましょう。
期待する結果ではないので以下のようにクエリ構文を変更してください。

parse '* * * * [*] "* * *" * * * *' as client, proxy1, proxy2, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes, referrer, userAgent
| filter dateTimeString like /(21\/Dec\/2021:21:)/
| sort dateTimeString asc

filter dateTimeString like /(21\/Dec\/2021:21:)/
こちらの箇所で日付を絞っておりますので、調査したい日付へ適宜変更してください。

sort dateTimeString asc
こちらは、日付を昇順にソートする内容となります。

parse 部分の変更差分は、変更前の内容とdiffしてみてください。
* をいくつか追加し、 client, proxy1, proxy2,, , referrer, userAgent をログ形式に合わせて追加しました。

デフォルトでログ対象範囲が、1h(1時間)になっているので、画面右上にあるCustomを選択し、[Absolute]タブ
 →カレンダーが表示されるので[Start date and time]と[End date and time]を適宜変更してください。
※Timezoneが UTC になっている場合、 Local time zone へ変更してください。

変更時のキャプチャ画像は以下の通りです。

上記適用後、クエリの実行を押すといかにも想定していた結果がでていますね。
12/21のアクセスログが上旬にでていてば問題ありません。

client集計

今度は、アクセスログから指定日時の接続元IPを集計してみます。

クエリを以下内容へ変更してください。

stats count( client ) by client
client列のclient項目を集計します。

parse '* * * * [*] "* * *" * * * *' as client, proxy1, proxy2, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes, referrer, userAgent
| stats count( client ) by client

画面右上にあるCustomを選択し、[Absolute]タブから、筆者の場合は「2021-12-21 (00:00:00) > 2021-12-21 (23:59:59)」でログ読み込み範囲を絞り込みます。

その後、クエリの実行を押すと以下キャプチャのようになりました。

何やら、13:00 ~ 13:05 の間アクセス数が多いようです。
この時間、アクセス詳細を次のステップで見ていきます。

時間指定でアクセスの多いリクエスト行をカウントし、clientとlogstreamフィールドを表示

client集計で、アクセスの多い時間帯が分かったので、アクセスの多いリクエスト行をカウントして、アクセス元ipおよびlogstream(ここではインスタンスID)を表示してみます。

クエリを以下内容へ変更してください。

フィルターで、21日の13時00分 ~ 13時05分のアクセスログに絞り、statsでリクエスト行を集計し、アクセス元ipとlogstreamを表示する内容となります。

parse '* * * * [*] "* * *" * * * *' as client, proxy1, proxy2, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes, referrer, userAgent
| filter dateTimeString like /(21\/Dec\/2021:13:0[0-5]:)/
| stats count( url ) by url, client, @logStream

その後、クエリの実行を押すと以下キャプチャのようになりました。

xml***に対してアクセスが多いようです。
サーバの負荷状況を見ると確かに、負荷が上昇しておりました。

まとめ

簡単な、アクセスログ解析をおこなってみましたが、クエリ構文になれていない為、苦戦しました。
一元的にログ分析ができるので、その点は便利だと思いました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA