#まえがき
仕事でCloudwatch Logs上に出力したVPCフローログから必要な情報を抽出したい、という要望がありました。
S3のフローログを整理したことはありましたが、CWLではやったことなかったので個人的なメモ。
Cloudwatch logs insightsを使用します。
#手順
まずquery-idを変数に格納。
開始時間、終了時間はそれぞれUNIXTIMEで指定します。
--query-stringでフィルタパターンを使用します。
詳しくはドキュメント参照。
ID取得
$ query_id=`aws logs start-query \
--log-group-name {Log_Group_Name} \
--start-time 1234567890 \
--end-time 1234567890 \
--query-string "fields @message | filter @message like /NODATA/" \
--output text`
取得したquery-idを使用して、出力結果を確認します。
jqで不要な情報(@ptrとか)は無くしました。
ID取得
$ aws logs get-query-results --query-id $query_id | jq -r '.results[] | .[] | select(.field == "@message") | .value'
実行結果
2 123456789123 eni-123456789abcdef - - - - - - - 1234567890 1234567890 - NODATA
2 unknown eni-123456789abcdef - - - - - - - 1234567890 1234567890 - NODATA
2 123456789123 eni-123456789abcdef - - - - - - - 1234567890 1234567890 - NODATA
#jqについて
.results[] | .[] は不要じゃね?って感じですが、入れないとエラーになります。
もう少しキレイに書ける方法あれば教えてください。
エラー
$ aws logs get-query-results --query-id $query_id | jq -r '.results[] | select(.field == "@message")'
jq: error (at <stdin>:820): Cannot index array with string "field"