DynamoDB Streams: TrimmedDataAccessException

TL;DR — DynamoDB Streams はレコードを 24 時間 保持します。それより古いレコードはトリムされ、ストリームから消えます。この例外は、トリムされた位置を要求したことを意味します。1 日以上前のチェックポイントで、通常はダウンしていたか遅れをとったコンシューマーからです。それらのレコードをストリームから取り戻すことはできません。TRIM_HORIZON(生き残った最も古いレコード)から再開し、ギャップをテーブル自体から調整してください。

意味

TrimmedDataAccessException: The data you are trying to access has been trimmed.

位置ハンドル だけが古くなった 期限切れイテレーター とは異なり、トリムされたデータは本当に削除されます。トリムされた SequenceNumber でシャードイテレーターを要求する、またはレコードが古くなったシャードを読むと、これがスローされます。ストリームはアーカイブではなく、ローリングの 24 時間バッファです。

発生する理由

  • コンシューマーが 24 時間以上ダウンしていた — 障害、一時停止したワーカー、忘れられた無効化トリガー — そのチェックポイントが今トリムされた領域を指している。
  • 処理の遅れが保持を超えた — コンシューマーは実行されるが、書き込みレートより遅く、1 日以上後ろにドリフトした。
  • 古い保存されたチェックポイント — 数週間前に永続化された SequenceNumber で古いコンシューマーを再起動する。
  • 古いシャードを端から端まで読む — 長寿命のストリームのシャード系譜を歩き、保持より前の範囲を要求する。

修正方法

  1. 利用可能な最も古いレコードから再開し、ギャップを受け入れます:

    const {ShardIterator} = await streams.send(
      new GetShardIteratorCommand({
        StreamArn: streamArn,
        ShardId: shardId,
        ShardIteratorType: 'TRIM_HORIZON' // oldest untrimmed record
      })
    );

    新しいアクティビティだけが重要なら、代わりに LATEST を使います。

  2. 見逃したウィンドウを信頼できる情報源から調整します — テーブルには依然としてすべてのアイテムの 現在の 状態があります。影響を受けたキーに対する境界付きの Scan/Query(大きなテーブルには エクスポート)が、中間バージョンを除いて、トリムされたレコードが教えてくれたであろうものを再構築します。

  3. コンシューマーの遅れをアラートします — 処理しているレコードの経過時間(または Lambda の IteratorAge メトリクス)を監視し、24 時間に近づくずっと前に呼び出します。

  4. より長い保持が必要ですか? レコードが到着したら耐久性のあるバッファにストリームします(例: Kinesis アダプターパターン経由の Kinesis Data Streams、または自分で処理済みレコードを永続化)。DynamoDB Streams 自体は 24 時間を超えて延長できません。

ギャップの後に状態を再構築するには、今テーブルに実際に何があるかを見る必要があります。DynoTable デスクトップアプリ は、その調整パスをスクリプトではなく閲覧可能なクエリにします。キャッチアップ読み取りのサイズを設定していますか?DynamoDB 料金計算ツール が RCU コストを見積もります。

関連するエラー

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。