CloudWatch Logsの転送に失敗する4つのパターン

#インフラ
written by ネモ

どうも、こだわりのない男、ネモです。

こだわりがないので好きなブランドとかないんですが、そろそろ好きなブランド作ろうと
MARGARET HOWELLのバッグと財布(真ん中左)を買ってみました。
※バッグの方は画像見つかりませんでしたが、共にブライドルレザーで揃えました。

経年変化が楽しみです。

さてさて、それでは早速本日も書いていきましょう。技術ブログ。

本日はCloudWatch Logsでログ転送に失敗するパターン4選です。
まだまだ原因などはありますが、今回はAgent側の設定でどうにかなるトラブルをあげていきます。

ログ転送失敗パターン4選

転送するログ1行分の容量が大きい

転送するログの1行分の容量は256KB以内ではないとログ転送が行えません。
なお、この際に同一行のリトライは行われず、転送がスキップされます。
エラー出力直前にpipeしたログで失敗している場合が多いので、そのログをローテするなどにより対処可能となっています。

これに関しては、以下リンクに記載があります。
CloudWatch Logs クォータCloudWatch Logs クォータ

イベントサイズ
256 KB (最大)。このクォータは変更できません。

CloudWatchに出力されるログ

TZ E! [outputs.cloudwatchlogs] InvalidParameterException: Log event too large: bytes exceeds limit of 262144, will not retry the request

1度に転送するログ全体の容量が大きい

転送するログ全体で1MBという制約があります。
1秒毎にログストリーム単位で5リクエストまでを実施でき、最大で5MBまでの転送ができることになっていますが、
1リクエスト1MBまでとなっておりますので、周期毎に膨大な量のログを出力する、もしくはログローテーションを実装しておらず、ひとつのログの容量が大きいものなどを扱っている場合はログ転送に失敗する場合があります。
なお、この際に各ログイベント毎に26byte加算された状態で計算されます。
こちらもエラー出力直前にpipeしたログで失敗している場合が多いので、そのログをローテするなどにより対処可能となっています。
CloudWatch Logs クォータ

PutLogEvents
1 秒、1 ログストリームあたり 5 リクエスト。追加のリクエストは調整されます。このクォータは変更できません。
PutLogEvents の最大バッチサイズは 1 MB です。

CloudWatchに出力されるログ

TZ E! [outputs.cloudwatchlogs] InvalidParameterException: Upload too large: bytes exceeds limit of 1048576, will not retry the request

14日以上前のタイムスタンプのログ

ログイベントのタイムスタンプが14日以上過去のログはスキップされます。
ログイベント用のタイムスタンプは13桁(ミリ秒まで含む)で記載する必要があります。
PutLogEvents

The log events in the batch must be in chronological order by their timestamp. The timestamp is the time the event occurred, expressed as the number of milliseconds after Jan 1, 1970 00:00:00 UTC. (In AWS Tools for PowerShell and the AWS SDK for .NET, the timestamp is specified in .NET format: yyyy-mm-ddThh:mm:ss. For example, 2017-09-15T13:45:30.)

ログイベントのタイムスタンプが2時間以上未来の場合

ログイベントのタイムスタンプが2時間以上未来の場合、ログ転送に失敗し、スキップされます。
収集対象のタイムスタンプを設定し直すことで問題なく収集できるようになります。
PutLogEvents

None of the log events in the batch can be more than 2 hours in the future.

まとめ

CloudWatchでできることは色々ありますが、まずはログ収集で失敗する時の色々なパターンについて纏めてみました。
CloudWatchでログ収集を行う際に、ログローテ未実装によるエラーなどなどさまざまな要因があるかと思います。
あまりこの件について書かれているサイトがなかったので、このブログがお力になれば幸いです。