CloudWatch Logs Insightsを試す


CloudWatch Logs Insights

今年のRe;Inventで公開されました。
New – Amazon CloudWatch Logs Insights – Fast, Interactive Log Analytics | Amazon Web Services

簡単にまとめると、CloudWatch Logsのロググループに対してSQLを用いたクエリーを投げ、ログを集計することができるサービスです。
今まで、CloudwatchLogs見れたものではなかったのでとても素晴らしいアップデートだと思います。

東京リージョンでもう使えるようになってます。
お値段についてですが

you pay $0.005 per GB in US East (N. Virginia), with similar prices in the other regions.

とあるので、Athena等を使用するときと同様期間で区切って不要なログの走査をしないように気をつける必要があります。

サンプル画面から試すと一瞬なのが

  • VPCフローログ
  • CloudTrailログ

なんかです。

今回はRDSの監査ログを参考に設定を入れてみたので紹介します。

Aurora監査ログの仕様

監査ログの詳細

上記ドキュメントに記載されている通りの形式でログファイルがCloudWatchLogsに連携されます。

今回は連携されたログのObjectセクションに記載されているQueryのうちSELECTの件数を5分毎に集計してダッシュボードに表示してみます。

 手順

マネジメントコンソールからCloudwatchへ移動し、[ログ - インサイト]を選択する。

上部の検索窓から対象のロググループを選択する
今回は監査ログを使用したのでデフォルトだと/aws/rdsからはじまるロググループです。

Query
fields @message
  | parse "*,*,*,*,*,*,*,*,'*',*" as timestamp, serverhost, username, host, connectionid, queryid, operation, database, object,retcode
    | filter object like /SELECT/
    | fields username, object, timestamp
    | stats count(*) by bin(5m)

もともと入ってきたCloudWatchLogsのフィールドが自動的に
@logStream
@message
@timestamp

と解析されます。その中からログ本文である@messageparseを使用してパースしていきます。
,で区切られてobjectフィールドのみ''でくくられているので、それがわかるように記載します。また、各フィールドの名前をつけます。
その後、objectに対して文字列のパターンマッチングを行い、5分感覚で件数を集計しました。

可視化のタブを押すとグラフが表示されます。
Alertの実装なんかは現状ひと手間加えないと無理そうですが、今後拡張されてそのままSNSに通知できるとかになれば手軽でいいですね。

limit of four concurrent CloudWatch Logs Insights queries.

Queryは同時に4つまでしかダメっぽいです

ドキュメント記載が見当たりませんが(2018/11/28 18時現在)
logs配下のstart-queryがAPIエンドポイントになっているようです。CLIを更新したところhelpで確認できました

command
aws logs start-query \ # クエリを開始する時間。
  --log-group-name \ # 対象のロググループ名
  --end-time \ # このクエリがまだ実行されている場合は、このクエリを終了する時間。UNIX秒の秒数で指定
  --query-string # Query文字列(UNIXタイム) 

参考

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AnalyzingLogData.html
https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html