Le GSI DynamoDB ne projette pas l'attribut demandé
TL;DR — Tu as interrogé un index secondaire global (GSI) et demandé (via ProjectionExpression ou Select=ALL_ATTRIBUTES) un attribut que l'index ne projette pas. Un GSI ne renvoie que ses propres attributs de clé, les attributs de clé de la table de base, et ce que tu as listé dans sa projection — rien d'autre. Soit restreins la requête aux attributs projetés, soit ajoute l'attribut à la projection du GSI, soit interroge la table de base par clé primaire.
Ce que ça signifie
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]Contrairement à un index secondaire local (qui peut récupérer des attributs non projetés depuis l'élément de base à un coût supplémentaire), un GSI est une copie autonome. Il ne stocke physiquement que les attributs de sa projection — la documentation d'AWS est franche : « global secondary index queries cannot fetch attributes from the base table ». Demander à une requête GSI quoi que ce soit en dehors de cet ensemble est insatisfiable, donc DynamoDB rejette la requête (une ValidationException, HTTP 400 — non réessayable) au lieu de renvoyer silencieusement des données partielles.
Pourquoi ça arrive
- Index
ProjectionType: KEYS_ONLYinterrogé pour un attribut non clé. - Index
ProjectionType: INCLUDEinterrogé pour un attribut absent de la listeNonKeyAttributes. Select: ALL_ATTRIBUTESsur un GSI qui n'est pasProjectionType: ALL.- Supposer un comportement de LSI — s'attendre à ce qu'un GSI récupère des attributs non projetés depuis la table de base (seuls les LSI le font).
- Une projection qui a dérivé par rapport aux besoins de la requête à mesure que le schéma d'accès a évolué.
Comment le corriger
- Ne demande que des attributs projetés — restreins
ProjectionExpressionaux clés du GSI + son ensemble projeté, ou abandonneSelect: ALL_ATTRIBUTES. - Ajoute l'attribut à la projection du GSI — pour un nouvel attribut, crée/remplace le GSI avec
ProjectionType: INCLUDE(en le listant) ouALL. Les projections des GSI existants ne peuvent pas être modifiées sur place ; tu ajoutes un nouveau GSI ou tu le recrées. - Récupère depuis la table de base — utilise les clés que le GSI renvoie pour faire un
GetItem/BatchGetItemsur la table de base afin d'obtenir l'élément complet. - Utilise
ProjectionType: ALLsi tu as régulièrement besoin de chaque attribut depuis l'index (en acceptant le coût de stockage/écriture supplémentaire).
Tu veux voir quels attributs un GSI porte réellement avant de l'interroger ? L'application de bureau DynoTable montre la projection de chaque index, pour que tu ne demandes que ce qui est là — aucune surprise de type does not project.
Erreurs liées
- Index not found — le nom de l'index lui-même est incorrect ou en cours de construction.
- Query condition missed key schema element — la condition de clé du GSI est incomplète.
- Exemple de code : Interroger un GSI en Node.js — une requête GSI fonctionnelle à comparer.
- Apprends : Projections d'index · GSI vs LSI · Index
Références
- 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
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.