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_ONLYconsultado por un atributo que no es clave. - Índice
ProjectionType: INCLUDEconsultado por un atributo que no está en la listaNonKeyAttributes. Select: ALL_ATTRIBUTESen un GSI que no esProjectionType: 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
- Pide solo los atributos proyectados — restringe
ProjectionExpressiona las claves del GSI + su conjunto proyectado, o quitaSelect: ALL_ATTRIBUTES. - Añade el atributo a la proyección del GSI — para un atributo nuevo, crea/reemplaza el GSI con
ProjectionType: INCLUDE(listándolo) oALL. Las proyecciones de los GSI existentes no se pueden editar in situ; añades un GSI nuevo o lo recreas. - Obtén desde la tabla base — usa las claves que el GSI sí devuelve para hacer un
GetItem/BatchGetItemen la tabla base y traer el Item completo. - Usa
ProjectionType: ALLsi 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
- Index not found — el nombre del índice en sí es incorrecto o aún se está construyendo.
- Query condition missed key schema element — la condición de clave del GSI está incompleta.
- Ejemplo de código: Consultar un GSI en Node.js — una consulta de GSI funcional con la que comparar.
- Aprende: Proyecciones de índice · GSI vs LSI · Índices
Referencias
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Managing Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.