運用時のログ調査に便利!CloudFrontのアクセスログをマネージメントコンソールから手っ取り早く確認してみる

どうも!大阪オフィスの西村祐二です。

S3 Select がリリースされたことにより、マネージメントコンソールからS3に保存されているファイルに対してSQLを実行できるようになりました。

今回、このS3 Selectを使ってCloudFrontのアクセスログをマネージメントコンソールから簡単に確認する方法を紹介したいと思います。

どういう場面で使う?

運用時にCloudFrontなどのアクセスログの調査を行うことはよくあると思います。 その場合は、ある特定の時間のログを確認することが多いと思います。

そんなとき、手っ取り早くアクセスログを確認したいときに便利かと思います。

事前準備

CloudFrontの構築とログの出力設定を行っておき、S3にアクセスログを出力させておいてください。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#ChangeSettings

さっそくやっていきましょう!

アクセスログをプレビュー表示させる

S3に保存されたCloudFrontのアクセスログファイルをクリックすると下記のような画面が表示されるかと思います。そのときに、「S3 Select」のタブをクリックします。

下記のようなに設定します。(これからは下記設定がされている前提で話を進めます。)

  • ファイル形式:CSV
  • 区切り記号:タブ(表示させたい形式はカンマ区切りです)
  • 圧縮:GZIP

「ファイルプレビューの表示」をクリックすると、ファイルの中身がマネージメントコンソール上に表示され、CloudFrontのアクセスログを確認することができます。

※最初の10行分だけ表示されます。

画像右下の「次へ」をクリックすることでSQL入力画面が表示されます。次からはそこに入力するSQLを紹介していきます。

アクセスログにSQLを実行し調査する

S3 Selectで利用できるSQLは下記ドキュメントをご確認ください。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/s3-glacier-select-sql-reference.html

アクセスログすべて表示させる

※ファイルサイズなど考慮した上で実行してください。

select * from s3object s

制限したい場合は「limit 10」など指定して制限することができます。

select * from s3object s limit 10

上記はプレビュー表示と同じ結果になります。

IPアドレスとステータスコードだけ表示させる

不要な情報を除き、確認したい情報のみ表示させたいことがあるかと思います。

select s._5, s._9 from s3object s limit 10

_5_9はどういう意味かというとカンマ区切りの前から何番目かを表しています。

つまり、CloudFrontのログフォーマットの前から5番目の「IPアドレス」、前から9番目の「ステータスコード」が指定され、このような表示結果になりました。

CloudFrontのログフォーマットの詳細については下記をご確認ください。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#LogFileFormat

特定のIPからアクセスがあるか調べる

ログファイル内にIPが含まれているか確認したいことがあるかと思います。

select * from s3object s where s._5 = '124.xxx.xxx.xxx' limit 5

where句を使うことができます。

特定のIPを除外して表示させる

ヘルスチェックのIPなどIPを除外したいことがあるかと思います。

select * from s3object s where s._5 != '124.xxx.xxx.xxx' limit 5

「!=」でノットイコールを表現することができます。

ステータスコード200を除外して表示させる

正常なアクセスログを除外したいことがあるかと思います。

select * from s3object s where s._9 != '200' limit 10

特定のIPレンジだけ表示させる

IPレンジを指定して表示させたいことがあるかと思います。

select * from s3object s where s._5 like '219.100.139.%' limit 10

上記の場合は「219.100.139.xxx」にマッチするIPが全て表示されます。前につけることも可能です。

特定の区間だけ表示させる

時間指定して表示させたいことがあるかと思います。

select * from s3object s where s._2 like '02:20:3%' limit 10

上記の場合は「02:20:30 - 02:20:39」の間のアクセスログが表示されます。

※時刻 (UTC) なので注意

特定の時間だけ表示させる

ある時刻のアクセスログを確認したいことがあるかと思います。

select * from s3object s where s._2 IN ('02:20:34', '02:20:35') limit 10

上記の場合は「02:20:34 と 02:20:35」の時刻のアクセスログだけ表示されます。

ログファイル内のアクセスログの総数を表示させる

ログファイルの中にどれアクセスログが保存されているのか確認したいことがあるかと思います。

select count(*) from s3object s

SQL関数のcountを使うことで行数の和が表示されます。

特定のIPがログファイル内に含まれる総数を表示させる

特定のIPがどれだけ含まれているか確認したいことがあるかと思います。

select count(*) from s3object s where s._5 = '54.xxx.xxx.xxx'

さいごに

いかがだったでしょうか。

S3 Selectを使ってCloudFrontのアクセスログをマネージメントコンソールから簡単に確認する方法を紹介しました。

現状、ログフォーマットの関係上timestamp型に変換できなかったり、ソートできなかったりしますが簡易的なログ確認においては十分使えるのではないでしょうか。

個人的にはCloudFrontのログ出力設定でタイムスタンプの形式をユーザでカスタマイズできると嬉しいんですが、今後のアップデートに期待したいです。

今回、対象をCloudFrontログとしましたが、S3 Selectは他にもいろいろと使えそうです。

誰かの参考になれば幸いです。