DynamoDB GSI does not project the requested attribute

TL;DR — Consultaste un índice secundario global (GSI) y pediste (mediante ProjectionExpression o Select=ALL_ATTRIBUTES) un atributo que el índice no proyecta. Un GSI solo devuelve sus propios atributos de clave, los atributos de clave de la tabla base y lo que listaras en su proyección — nada más. O acotas la solicitud a los atributos proyectados, añades el atributo a la proyección del GSI, o consultas la tabla base por clave primaria.

Qué 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]

A diferencia de un índice secundario local (que puede obtener atributos no proyectados del Item base con un coste extra), un GSI es una copia autocontenida. Almacena físicamente solo los atributos de su proyección — los propios documentos de AWS son tajantes: "global secondary index queries cannot fetch attributes from the base table." Pedirle a una consulta de GSI cualquier cosa fuera de ese conjunto es insatisfacible, así que DynamoDB rechaza la solicitud (un ValidationException, HTTP 400 — no reintentable) en lugar de devolver datos parciales en silencio.

Por qué ocurre

  • Índice ProjectionType: KEYS_ONLY consultado por un atributo que no es clave.
  • Índice ProjectionType: INCLUDE consultado por un atributo que no está en la lista NonKeyAttributes.
  • Select: ALL_ATTRIBUTES en un GSI que no es ProjectionType: ALL.
  • Asumir el comportamiento de un LSI — esperar que un GSI obtenga atributos no proyectados de la tabla base (solo los LSI hacen eso).
  • Una proyección que se desvió de las necesidades de la consulta a medida que el patrón de acceso evolucionó.

Cómo solucionarlo

  1. Pide solo los atributos proyectados — restringe ProjectionExpression a las claves del GSI + su conjunto proyectado, o quita Select: ALL_ATTRIBUTES.
  2. Añade el atributo a la proyección del GSI — para un atributo nuevo, crea/reemplaza el GSI con ProjectionType: INCLUDE (listándolo) o ALL. Las proyecciones de los GSI existentes no se pueden editar in situ; añades un GSI nuevo o lo recreas.
  3. Obtén desde la tabla base — usa las claves que el GSI devuelve para hacer un GetItem/BatchGetItem en la tabla base y traer el Item completo.
  4. Usa ProjectionType: ALL si necesitas rutinariamente cada atributo del índice (aceptando el coste extra de almacenamiento/escritura).

¿Quieres ver qué atributos lleva realmente un GSI antes de consultarlo? La aplicación de escritorio DynoTable muestra la proyección de cada índice para que pidas solo lo que hay — sin sorpresas de does not project.

Errores relacionados

Referencias

Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.