スキップしてコンテンツを表示

GetLogEvents APIでCloudWatch Logsのログイベント取得時にストリームの終端が検知できない

0

GetLogEventsAPIで、CloudWatch Logsの特定のロググループ、ログストリームの全イベントを順方向で収集しようとしています。 下記サンプルに示す実装をしましたが、いくつかのストリームが一晩中「res.NextForwardToken == req.NextToken」とならない(結果的に無限ループとなりプログラムが終了しない)状態が発生しています。

私の CloudWatch Logs 環境は、21個のロググループ内に合計11249のストリームがあります。 すべてのストリームについて検証していませんが、検証したストリームでは問題が発生したのはごくわずか(0.1%)です。 また、問題が発生するストリームでは現象が再現します。

  • 問題が発生するストリーム=4
  • 問題が発生しなかったストリーム=2672
  • 未実施のストリーム=8573

この状況を解消したく、下記観点で情報をご教示いただけないでしょうか。

  • API の使用方法に誤りがある?

  • API の使用方法は正しいが、発生しうる?

  • だとしたら、発生条件は?

  • その場合、ストリームの終端の判断方法は?

    【サンプル実装(c#)】

      bool logEventDone = false;
      var req = new GetLogEventsRequest
      {
          LogGroupName = ロググループ名,
          LogStreamName = ストリーム名,
          StartFromHead = true,
      };
    
      do
      {
          var res = await client.GetLogEventsAsync(req);
          res.Events.ForEach(ev =>
          {
              // イベント毎の処理。ファイルに出力など
          });
    
          // res.NextForwardToken == req.NextTokenを満たすとき、ストリームの終端
          if (res.NextForwardToken == req.NextToken)
          {
              logEventDone = true;
          }
          else
          {
              req.NextToken = res.NextForwardToken;
          }
      }
      while (!logEventDone);
    
質問済み 1年前192ビュー
1回答
0
承認された回答

GetLogEvents APIの使用方法に明らかな誤りは見られませんが、この状況は発生する可能性があります。

APIの使用方法は基本的に正しいですが、CloudWatch Logsの性質上、特定の条件下でこのような状況が起こり得ます。主な理由として以下が考えられます:

  1. ログストリームへの継続的な書き込み: ログストリームに新しいイベントが継続的に追加されている場合、NextForwardTokenが常に更新され、終端に到達しないことがあります。

  2. 大量のログデータ: 非常に大量のログデータがある場合、APIの呼び出し制限やタイムアウトにより、全てのデータを取得する前にトークンが更新される可能性があります。

  3. ログの保持期間: ログの保持期間が短く設定されている場合、古いログが削除されると同時に新しいログが追加され、終端の検出が困難になることがあります。

この状況を解消するためには、以下の方法を検討してください:

  1. タイムスタンプによる制限: 開始時刻と終了時刻を指定して、特定の期間のログのみを取得します。

  2. イベント数の制限: 取得するイベントの最大数を設定し、一定数のイベントを取得したら処理を終了します。

  3. 実行時間の制限: プログラムの実行時間に制限を設けて、一定時間経過後に処理を終了します。

  4. 重複チェック: 取得したイベントのタイムスタンプやメッセージを確認し、重複が発生した場合に処理を終了します。

これらの方法を組み合わせることで、ストリームの終端を効果的に判断し、無限ループを回避することができます。また、問題が発生するストリームが少数であることを考慮すると、それらのストリームに対して個別の対応を行うことも検討できます。
Sources
GetLogEvents - Amazon CloudWatch Logs
Community | Unlocking the Potential: Generative AI and Cloud Security Possibilities

回答済み 1年前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。