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で古いコンシューマーを再起動する。 - 古いシャードを端から端まで読む — 長寿命のストリームのシャード系譜を歩き、保持より前の範囲を要求する。
修正方法
利用可能な最も古いレコードから再開し、ギャップを受け入れます:
const {ShardIterator} = await streams.send( new GetShardIteratorCommand({ StreamArn: streamArn, ShardId: shardId, ShardIteratorType: 'TRIM_HORIZON' // oldest untrimmed record }) );新しいアクティビティだけが重要なら、代わりに
LATESTを使います。見逃したウィンドウを信頼できる情報源から調整します — テーブルには依然としてすべてのアイテムの 現在の 状態があります。影響を受けたキーに対する境界付きの
Scan/Query(大きなテーブルには エクスポート)が、中間バージョンを除いて、トリムされたレコードが教えてくれたであろうものを再構築します。コンシューマーの遅れをアラートします — 処理しているレコードの経過時間(または Lambda の
IteratorAgeメトリクス)を監視し、24 時間に近づくずっと前に呼び出します。より長い保持が必要ですか? レコードが到着したら耐久性のあるバッファにストリームします(例: Kinesis アダプターパターン経由の Kinesis Data Streams、または自分で処理済みレコードを永続化)。DynamoDB Streams 自体は 24 時間を超えて延長できません。
ギャップの後に状態を再構築するには、今テーブルに実際に何があるかを見る必要があります。DynoTable デスクトップアプリ は、その調整パスをスクリプトではなく閲覧可能なクエリにします。キャッチアップ読み取りのサイズを設定していますか?DynamoDB 料金計算ツール が RCU コストを見積もります。
関連するエラー
- ExpiredIteratorException — 回復可能ないとこ: 位置が古い、データはまだある。
- Stream not enabled
- Invalid StreamArn
- Learn: DynamoDB Streams
References
- GetRecords — Amazon DynamoDB Streams API Reference
- GetShardIterator — Amazon DynamoDB Streams API Reference
- Change data capture for DynamoDB Streams — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。