DynamoDB Streams: TrimmedDataAccessException
In breve — DynamoDB Streams conserva i record per 24 ore; i record più vecchi vengono tagliati (trimmed) e spariscono dallo stream. Questa eccezione significa che hai chiesto una posizione che è stata tagliata — un checkpoint di più di un giorno, di solito da un consumer che era spento o è rimasto indietro. Non puoi recuperare quei record dallo stream: riprendi da TRIM_HORIZON (record sopravvissuto più vecchio) e riconcilia la lacuna dalla tabella stessa.
Cosa significa
TrimmedDataAccessException: The data you are trying to access has been trimmed.A differenza di un iterator scaduto — dove solo il tuo handle di posizione è diventato obsoleto — i dati tagliati sono genuinamente rimossi. Richiedere uno shard iterator a un SequenceNumber tagliato, o leggere uno shard i cui record sono scaduti, genera questo. Lo stream è un buffer scorrevole di 24 ore, non un archivio.
Perché accade
- Il consumer è stato spento per più di 24 ore — un'interruzione, un worker in pausa, un trigger disabilitato dimenticato — e il suo checkpoint ora punta in territorio tagliato.
- Il ritardo di elaborazione ha superato la ritenzione — il consumer è in esecuzione, ma più lento del tasso di scrittura, ed è derivato di più di un giorno indietro.
- Un checkpoint memorizzato obsoleto — riavviare un vecchio consumer con un
SequenceNumberpersistito settimane fa. - Leggere un vecchio shard end-to-end — percorrere la discendenza degli shard di uno stream di lunga durata e richiedere intervalli che precedono la ritenzione.
Come correggerlo
Riprendi dal record disponibile più vecchio e accetta la lacuna:
const {ShardIterator} = await streams.send( new GetShardIteratorCommand({ StreamArn: streamArn, ShardId: shardId, ShardIteratorType: 'TRIM_HORIZON' // oldest untrimmed record }) );Usa invece
LATESTse conta solo l'attività nuova.Riconcilia la finestra persa dalla fonte di verità — la tabella ha ancora lo stato attuale di ogni Item. Uno
Scan/Querydelimitato sulle chiavi interessate (o un export per tabelle grandi) ricostruisce ciò che i record tagliati ti avrebbero detto, meno le versioni intermedie.Allerta sul ritardo del consumer — monitora l'età dei record che stai elaborando (o la metrica
IteratorAgedi Lambda) e invia un alert molto prima che si avvicini alle 24 ore.Ti serve una ritenzione più lunga? Fai lo stream in un buffer durevole man mano che i record arrivano (es. Kinesis Data Streams tramite i pattern del Kinesis adapter, o persisti tu stesso i record elaborati) — DynamoDB Streams stesso non può essere esteso oltre le 24 ore.
Ricostruire lo stato dopo una lacuna significa guardare cosa c'è effettivamente nella tabella ora — l'app desktop DynoTable rende quel passaggio di riconciliazione una query navigabile invece di uno script. Stai dimensionando la lettura di recupero? Il calcolatore dei prezzi DynamoDB stima il costo in RCU.
Errori correlati
- ExpiredIteratorException — il cugino recuperabile: posizione obsoleta, dati ancora presenti.
- Stream not enabled
- Invalid StreamArn
- Impara: 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
Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.