DynamoDB Streams: TrimmedDataAccessException

요약 — DynamoDB Streams는 레코드를 24시간 동안 유지합니다. 더 오래된 레코드는 잘려나가 스트림에서 사라집니다. 이 예외는 잘려나간 위치 — 하루 넘게 오래된 체크포인트, 보통 다운되었거나 뒤처진 소비자에서 — 를 요청했다는 뜻입니다. 그 레코드를 스트림에서 되찾을 수 없습니다: TRIM_HORIZON(살아남은 가장 오래된 레코드)에서 재개하고 격차를 테이블 자체에서 조정하세요.

무엇을 의미하나요

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

위치 핸들 만 오래된 만료된 이터레이터와 달리, 잘려나간 데이터는 진짜로 제거됩니다. 잘려나간 SequenceNumber에서 샤드 이터레이터를 요청하거나, 레코드가 오래되어 사라진 샤드를 읽으면 이것이 발생합니다. 스트림은 아카이브가 아니라 롤링 24시간 버퍼입니다.

왜 발생하나요

  • 소비자가 24시간 넘게 다운됨 — 장애, 일시 중지된 워커, 잊힌 비활성화된 트리거 — 그리고 그 체크포인트가 이제 잘려나간 영역을 가리킵니다.
  • 처리 지연이 보존을 초과함 — 소비자가 실행되지만 쓰기 속도보다 느려 하루 넘게 뒤처졌습니다.
  • 오래된 저장된 체크포인트 — 몇 주 전에 지속된 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

공식 AWS 문서(위 링크)를 기준으로 2026-07-13에 마지막으로 검증되었습니다.

Console 없이 DynamoDB 작업하기

DynoTable은 DynamoDB를 위한 빠른 데스크톱 클라이언트입니다 — 테이블을 탐색하고, SQL 스타일 쿼리를 실행하고, 항목을 로컬에서 편집하세요.