DynamoDB GSI does not project the requested attribute

TL;DR — Você consultou um Global Secondary Index e pediu (via ProjectionExpression ou Select=ALL_ATTRIBUTES) um atributo que o índice não projeta. Um GSI só retorna seus próprios atributos de chave, os atributos de chave da tabela base, e o que quer que você tenha listado em sua projeção — nada mais. Ou estreite a requisição para atributos projetados, adicione o atributo à projeção do GSI, ou consulte a tabela base pela chave primária.

O que significa

ValidationException: One or more parameter values were invalid: Global secondary
index <index_name> does not project <attribute_name>

# or, with Select=ALL_ATTRIBUTES on a KEYS_ONLY / INCLUDE index:
ValidationException: Select type ALL_ATTRIBUTES is not supported for global
secondary index <index_name> because its projection type is not ALL

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: One or more parameter values were invalid: Global secondary index gsi1 does not project [unprojected]

Ao contrário de um Local Secondary Index (que pode buscar atributos não projetados do item base a um custo extra), um GSI é uma cópia autocontida. Ele armazena fisicamente apenas os atributos em sua projeção — os próprios docs da AWS são diretos: "global secondary index queries cannot fetch attributes from the base table." Pedir a uma consulta de GSI qualquer coisa fora desse conjunto é insatisfazível, então o DynamoDB rejeita a requisição (um ValidationException, HTTP 400 — não retentável) em vez de retornar dados parciais silenciosamente.

Por que isso acontece

  • Índice ProjectionType: KEYS_ONLY consultado por um atributo que não é chave.
  • Índice ProjectionType: INCLUDE consultado por um atributo que não está na lista NonKeyAttributes.
  • Select: ALL_ATTRIBUTES em um GSI que não é ProjectionType: ALL.
  • Supor comportamento de LSI — esperar que um GSI busque atributos não projetados da tabela base (apenas LSIs fazem isso).
  • Uma projeção que desviou das necessidades da consulta conforme o padrão de acesso evoluiu.

Como corrigir

  1. Solicite apenas atributos projetados — restrinja ProjectionExpression às chaves do GSI + seu conjunto projetado, ou remova Select: ALL_ATTRIBUTES.
  2. Adicione o atributo à projeção do GSI — para um novo atributo, crie/substitua o GSI com ProjectionType: INCLUDE (listando-o) ou ALL. As projeções de GSIs existentes não podem ser editadas no lugar; você adiciona um novo GSI ou o recria.
  3. Busque da tabela base — use as chaves que o GSI de fato retorna para fazer um GetItem/BatchGetItem na tabela base para o item completo.
  4. Use ProjectionType: ALL se você rotineiramente precisa de todo atributo do índice (aceitando o custo extra de armazenamento/escrita).

Quer ver quais atributos um GSI de fato carrega antes de consultá-lo? O app desktop DynoTable mostra a projeção de cada índice para que você solicite apenas o que está lá — sem surpresa de does not project.

Erros relacionados

Referências

Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.