Transfer FamilyのログがJSON形式になってうれしいことを確認してみた

2023.07.05

こんにちは、シマです。

先日、AWS Transfer Familyのログにおいて、 JSONログ形式がサポートされました。

上記では従来のフラットな形式のログから、JSON形式になることでCloudWatch Logs Insightsを使用したログ解析が簡単になることが謳われていますが、具体的にはどのように簡単になっているのか確認してみました。

やってみた

AWS Transfer Familyを構築し、SFTPで通信した時のログをCloudWatch Logsへ出力します。

出力されたログに対してCloudWatch Logs Insightsを使用して、ログから要素を抽出するクエリを実行し確認してみます。

従来のフラットな形式の場合

フラットな形式のログの場合、parseを使って@messageから必要な値を自分で抽出します。今回は一例として、以下でクエリを実行しました。

fields @timestamp, @message, @logStream, @log
| parse @message "* * Path=* *" as logStream, `activity-type`, path, message2
| parse message2 "Mode=*" as mode
| parse message2 "BytesIn=*" as `bytes-in`
| parse message2 "BytesOut=*" as `bytes-out`
| filter @message like 'file02.txt'
| display @timestamp, `activity-type`, path, mode, `bytes-in`, `bytes-out`, @message
| sort @timestamp desc
| limit 20

結果は以下のようになり、@messageから抽出した値が表示されています。

新しいJSON形式の場合

JSON形式のログの場合、自分で値を抽出する必要はなく、keyを指定することですぐ抽出できます。前述のフラットな形式の例と同じ出力をするためには以下のようなクエリを実行します。

fields @timestamp, `activity-type`, path, mode, `bytes-in`, `bytes-out`, @message
| filter @message like 'file02.txt'
| sort @timestamp desc
| limit 20

結果は以下のようになり、同様の結果が表示されています。

上記クエリのようにJSON形式なおかげで最初から要素に分かれているため、前処理が不要でクエリがコンパクトになっていることがわかります。これにより、例えば以下クエリのようにpath毎の処理回数をカウントするような統計処理も一撃で実行できるようになったということです。

stats count(*) as cnt by path
| sort cnt desc
| limit 20

最後に

今回のアップデートでAWS Transfer Familyのログにおいて、CloudWatch Logs Insightsを使用したログ解析が簡単になっていることを確認しました。自分で抽出する手間や抽出の誤りがなくなったので、とても良いアップデートだったと感じました。
本記事がどなたかのお役に立てれば幸いです。