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_ONLY interrogé pour un attribut non clé.
  • Index ProjectionType: INCLUDE interrogé pour un attribut absent de la liste NonKeyAttributes.
  • Select: ALL_ATTRIBUTES sur un GSI qui n'est pas ProjectionType: 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

  1. Ne demande que des attributs projetés — restreins ProjectionExpression aux clés du GSI + son ensemble projeté, ou abandonne Select: ALL_ATTRIBUTES.
  2. Ajoute l'attribut à la projection du GSI — pour un nouvel attribut, crée/remplace le GSI avec ProjectionType: INCLUDE (en le listant) ou ALL. Les projections des GSI existants ne peuvent pas être modifiées sur place ; tu ajoutes un nouveau GSI ou tu le recrées.
  3. Récupère depuis la table de base — utilise les clés que le GSI renvoie pour faire un GetItem/BatchGetItem sur la table de base afin d'obtenir l'élément complet.
  4. Utilise ProjectionType: ALL si 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

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.