DynamoDB Streams: TrimmedDataAccessException
TL;DR — DynamoDB Streams conserva los registros durante 24 horas; los registros más antiguos se recortan y desaparecen del stream. Esta excepción significa que pediste una posición que ha sido recortada — un checkpoint de más de un día, normalmente de un consumidor que estaba caído o se quedó atrás. No puedes recuperar esos registros del stream: reanuda desde TRIM_HORIZON (el registro superviviente más antiguo) y reconcilia el hueco desde la propia tabla.
Qué significa
TrimmedDataAccessException: The data you are trying to access has been trimmed.A diferencia de un iterador caducado — donde solo tu identificador de posición quedó obsoleto — los datos recortados se eliminan de verdad. Solicitar un iterador de shard en un SequenceNumber recortado, o leer un shard cuyos registros han envejecido, lanza esto. El stream es un búfer móvil de 24 horas, no un archivo.
Por qué ocurre
- El consumidor estuvo caído más de 24 horas — una interrupción, un worker en pausa, un trigger deshabilitado olvidado — y su checkpoint apunta ahora a territorio recortado.
- El retraso de procesamiento superó la retención — el consumidor se ejecuta, pero más lento que la tasa de escritura, y se desvió más de un día.
- Un checkpoint almacenado obsoleto — reiniciar un consumidor antiguo con un
SequenceNumberpersistido hace semanas. - Leer un shard antiguo de extremo a extremo — recorrer el linaje de shards de un stream de larga duración y solicitar rangos anteriores a la retención.
Cómo solucionarlo
Reanuda desde el registro disponible más antiguo y acepta el hueco:
const {ShardIterator} = await streams.send( new GetShardIteratorCommand({ StreamArn: streamArn, ShardId: shardId, ShardIteratorType: 'TRIM_HORIZON' // oldest untrimmed record }) );Usa
LATESTen su lugar si solo importa la actividad nueva.Reconcilia la ventana perdida desde la fuente de verdad — la tabla aún tiene el estado actual de cada Item. Un
Scan/Queryacotado sobre las claves afectadas (o una exportación para tablas grandes) reconstruye lo que los registros recortados te habrían dicho, menos las versiones intermedias.Alerta sobre el retraso del consumidor — monitoriza la antigüedad de los registros que estás procesando (o la métrica
IteratorAgede Lambda) y avisa mucho antes de que se acerque a las 24 horas.¿Necesitas más retención? Vierte el stream en un búfer duradero a medida que llegan los registros (p. ej. Kinesis Data Streams mediante patrones del adaptador de Kinesis, o persiste tú mismo los registros procesados) — DynamoDB Streams en sí no se puede extender más allá de las 24 horas.
Reconstruir el estado tras un hueco significa mirar lo que hay realmente en la tabla ahora — la aplicación de escritorio DynoTable convierte esa pasada de reconciliación en una consulta navegable en lugar de un script. ¿Dimensionando la lectura de recuperación? La calculadora de precios de DynamoDB estima el coste en RCU.
Errores relacionados
- ExpiredIteratorException — la prima recuperable: posición obsoleta, datos aún presentes.
- Stream not enabled
- Invalid StreamArn
- Aprende: 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
Última verificación el 2026-07-13 con la documentación oficial de AWS enlazada arriba.