PowerShellでS3のサーバーアクセスログをTSV形式に変換しEXCELで分析

S3はのサーバのアクセスログを取得することが可能です。

f:id:yomon8:20191125231721p:plain

通情、このログを分析するなら、Athenaが便利です。公式にもわかりやすい手順が出ています。

Athena を使用したアクセスログの分析

ただ、色々な制約でAthenaが使えない、Pandasも使えない、ましてやDrillも使えない。Windows PC標準構成で分析しなければいけない場合があれば、この記事が役立つかもしれません。

※早い処理では無いのと、ViewerがEXCELなので本当に大量のアクセスログの分析には向いてません

Windows標準のPowerShellでサーバーアクセスログをTSV化して、EXCELで読み込ませるまでを書きます。

指定日時のアクセスログをダウンロード

アクセスログは日時をプレフィックスにした名前で出力されます。

f:id:yomon8:20191126082202p:plain

aws s3 sync の場合は以下のように、--exclude *--include オプションを使えば、指定日時のデータをダウンロードできます。

以下は2019年11月10日を取りたいので、 --include "2019-11-10-10-*" とオプションを設定しています。

$ aws s3 sync s3://your-bucket/path/to/your/server_access_logs/ . --exclude "*" --include "2019-11-10-10-*"

PowerShell でTSV化

EXCELで読むためにTSV化します。冒頭で紹介したのAthenaの記事を参考に構造を作成して、正規表現でパースします。

$outFile = "./out.csv"
$concatenatedFile = "./concatenated.log"
$pattern = '([^ ]*) ([^ ]*) \[(.*?)\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*) ?([^ ]*) ?(- |[^ ]*)\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$'

# ファイルを集約(大量のファイルを個別に処理すると遅いので)
Get-Content .\* | Set-Content $concatenatedFile 

# Header書き出し
"BucketOwner`tBuck$paet`tRequestDateTime`tRemoteIP`tRequester`tRequestID`tOperation`tKey`tRequestURI_operation`tRequestURI_key`tRequestURI_httpProtoversion`tHTTPstatus`tErrorCode`tBytesSent`tObjectSize`tTotalTime`tTurnAroundTime`tReferrer`tUserAgent`tVersionId`tHostId`tSigV`tCipherSuite`tAuthType`tEndPoint`tTLSVersion" > $outFile

# Data書き出し
Get-Content $concatenatedFile  | Select-String -Pattern $pattern | ForEach-Object { $_.Matches[0].Groups[1..26] -join "`t" } >> $outFile

EXCELで開く

上記の場合だと out.csv というファイルが出力されています。これがTSVなのでそのままEXCELで開いて作業できます。

f:id:yomon8:20191125232404p:plain