Consistent reads are not supported on global secondary indexes

요약 — 글로벌** 보조 인덱스를 대상으로 하는 Query 또는 ScanConsistentRead: true를 설정했습니다. GSI는 기본 테이블에서 비동기적으로 복제되며 최종적 일관성 읽기만 제공합니다 — 이 플래그는 선호 사항이 아니라 하드 오류입니다. 플래그를 제거하거나, 진정으로 쓰기 후 읽기 일관성이 필요하다면 기본 테이블을 읽으세요(또는 키를 LSI에 설계하세요).**

무엇을 의미하나요

ValidationException: Consistent reads are not supported on global secondary indexes

GSI는 물리적으로 자체 파티션과 용량을 가진 독립적인 인덱스 구조입니다. DynamoDB는 기본 테이블 쓰기를 여기에 비동기적으로 전파합니다. 방금 쓴 항목이 아직 인덱스에 도착하지 않았을 수 있기 때문에, DynamoDB는 그에 대한 강력한 일관성 읽기를 보장할 수 없습니다 — 그래서 GSI IndexName과 결합된 ConsistentRead: true는 즉시 거부됩니다. AWS 문서는 명시적입니다: ConsistentRead를 true로 설정해 GSI를 쿼리하면 ValidationException을 받습니다.

로컬 보조 인덱스는 다릅니다: LSI는 기본 테이블과 파티션을 공유하므로 거기서는 ConsistentRead: true가 지원됩니다.

왜 발생하나요

  • 플래그가 전역적으로 설정됨 — 공유 쿼리 헬퍼나 클라이언트 래퍼가 모든 읽기에 ConsistentRead: true를 기본값으로 두는데, 한 호출 경로가 GSI를 가리키는 IndexName을 추가합니다.
  • LSI가 GSI가 됨 — 로컬 인덱스(플래그가 합법인 곳)용으로 작성된 코드가 글로벌 인덱스를 가리켰습니다.
  • 복사-붙여넣기한 기본 테이블 쿼리 — 테이블에서 정당하게 강력한 일관성을 사용한 쿼리가 IndexName이 추가된 채 재사용되었습니다.

어떻게 고치나요

  1. GSI 읽기에서 ConsistentRead를 제거하세요(또는 기본값인 false로 설정):

    await client.send(
      new QueryCommand({
        TableName: 'Orders',
        IndexName: 'status-index',
        KeyConditionExpression: '#s = :open',
        // ConsistentRead: true  ← delete this line for a GSI
        ExpressionAttributeNames: {'#s': 'status'},
        ExpressionAttributeValues: {':open': {S: 'OPEN'}}
      })
    );
  2. 쓰기 후 읽기가 필요한가요? ConsistentRead: true기본 테이블을 쿼리하세요 — 조회하는 키가 테이블 자체의 파티션 키일 때 언제나 가능합니다.

  3. 같은 파티션 키, 다른 정렬? 일관성 읽기를 지원하는 LSI(테이블 생성 시 생성)로 모델링하세요.

  4. 또는 애플리케이션에서 지연을 흡수하세요 — GSI 전파는 일반적으로 빠릅니다. UI 흐름의 경우 인덱스를 다시 읽는 것보다 이미 가진 방금 쓴 데이터를 반환하는 것이 낫습니다.

DynoTable 데스크톱 앱은 각 테이블의 인덱스를 보여주고 직접 쿼리하게 해줍니다 — 그리고 어느 인덱스가 글로벌이고 어느 것이 로컬인지 알기 때문에, 이 부류의 오류는 애초에 발생하지 않습니다.

관련 오류

References

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

Console 없이 DynamoDB 작업하기

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