CloudWatch Logs から S3 へのエクスポートタスクは時間ベースのソートは保証されますか

2024.02.04

困っていること

コスト削減とログの長期保存を両立させるため、CloudWatch Logs から S3 へエクスポートしています。CloudWatch Logs コンソール画面ではログを取り込んだ時刻をソートした状態で表示されるのですが、S3 へエクスポートしたログファイルをダウンロードして開いたところ、順序が異なっていることを確認しました。
S3 へエクスポートする際にタイムスタンプ昇順ソートされた状態で格納するにはどうすれば良いか教えてください。

どう対応すればいいの?

AWS では、CloudWatch Logs から S3 へのエクスポートタスクではログデータの時間ベースのソートは保証されません。
そのためログを時刻順とする場合、Linux ユーティリティ等を使用してエクスポートされたログに対してソート処理を実施する方法をご検討ください。

注記
エクスポートされたファイル内のログデータのチャンクに対する時間ベースのソートは保証されません。Linux ユーティリティを使用して、エクスポートされたログフィールドデータをソートできます。例えば、次のユーティリティコマンドは、1 つのフォルダー内のすべての .gz ファイルのイベントをソートします。

find . -exec zcat {} + | sed -r 's/^[0-9]+/\x0&/' | sort -z
次のユーティリティコマンドは、複数のサブフォルダにある.gz ファイルをソートします。

find ./*/ -type f -exec zcat {} + | sed -r 's/^[0-9]+/\x0&/' | sort -z
さらに、別の stdout コマンドを使用して、ソートされた出力を別のファイルにパイプして保存することもできます。

代替案

CloudWatch Logs からデータを取得する際に時系列にソートする方法の一例として、CloudWatch Logs Insights のクエリを使用して "sort" コマンドを用いて "timestamp" を指定してソートする方法も考えられます。

AWS CLI コマンド例
aws logs start-query --log-group-name 'ロググループ名' --start-time スタート時刻 --end-time 終了時刻 --query-string 'fields @timestamp, @message, @logStream, @log| sort @timestamp asc| limit 20
aws logs get-query-results --query-id クエリID

"StartQuery" にてクエリを発行し、"GetQueryResults" で結果を取得します。
上記にて取得したデータを整形し、"PutObject" 等で S3 へアップロードすることも可能なのでご検討ください。

参考資料