The provided starting key is invalid

TL;DR — Ta ExclusiveStartKey ne correspond pas au schéma de clé de ce que tu parcours. Elle doit contenir exactement les attributs de clé que DynamoDB a renvoyés dans LastEvaluatedKey — la clé primaire complète, plus la clé d'index quand tu interroges un GSI/LSI — avec les mêmes noms et types. Renvoie LastEvaluatedKey telle quelle ; la fabriquer à la main, c'est ce qui casse.

Ce que ça signifie

ValidationException: The provided starting key is invalid
ValidationException: Exclusive Start Key must have same size as table's key schema

ExclusiveStartKey indique à un Query/Scan où reprendre. DynamoDB la valide par rapport au schéma de clé de la table — ou, pour une requête sur index, par rapport à la clé combinée index-plus-table que porte LastEvaluatedKey. Des attributs manquants, des attributs en trop, des noms erronés ou des types erronés échouent tous avant qu'aucune donnée ne soit lue.

Pourquoi ça arrive

  • Fabriquer la clé avec seulement la clé de partition — une table à clé composite a besoin de la clé de partition et de la clé de tri dans la clé de départ.
  • Paginer un index avec seulement la clé de tableLastEvaluatedKey sur une requête GSI/LSI contient à la fois les attributs de la clé d'index et la clé primaire de la table ; tous doivent être renvoyés.
  • Dérive de type ou de nom — la clé a été sérialisée (JSON, paramètre d'URL, cache) et est revenue avec "42" là où LastEvaluatedKey avait un nombre, ou avec un champ renommé.
  • Réutiliser une clé entre requêtes — une LastEvaluatedKey d'une table/index passée à une requête sur une autre, ou à la même requête après que l'hypothèse de schéma de clé a changé.
  • Un wrapper qui injecte des valeurs par défaut — un ODM qui remplit des attributs qu'il croit appartenir à la clé peut gonfler la clé de départ au-delà de la taille du schéma.

Comment le corriger

  1. Fais un aller-retour de LastEvaluatedKey sans y toucher :

    let ExclusiveStartKey;
    do {
      const page = await docClient.send(
        new QueryCommand({
          TableName,
          KeyConditionExpression,
          ExpressionAttributeValues,
          ExclusiveStartKey
        })
      );
      items.push(...(page.Items ?? []));
      ExclusiveStartKey = page.LastEvaluatedKey; // verbatim — no rebuild
    } while (ExclusiveStartKey);
  2. Sérialise-la sans perte si elle traverse une frontière de requête — quand le curseur de pagination part vers un navigateur puis revient, encode l'objet LastEvaluatedKey entier (par ex. base64 de son JSON) au lieu de le reconstruire à partir des champs de l'élément, et garde les types nombre en nombres.

  3. Inclus chaque attribut de clé pour la pagination d'index — clé de partition/tri de l'index et clé de partition/tri de la table, exactement telles que renvoyées.

  4. N'invente pas un point de départ — la pagination DynamoDB n'a pas d'offset ; si tu as besoin de « commencer près de X », exprime-le dans la KeyConditionExpression (sk > :x) plutôt que dans une ExclusiveStartKey faite à la main.

Inspecter ce que LastEvaluatedKey contient réellement pour ta table ou ton index enlève toute incertitude — l'application desktop DynoTable parcourt les requêtes page par page et affiche le curseur brut, et le DynamoDB Expression Builder compose la requête autour.

Interroge dans DynoTable

Pagine une Query dans DynoTable et inspecte le curseur LastEvaluatedKey brut entre deux pages — ouvre la table avec ⌘K, lance une Query, et copie le jeton de pagination tel quel dans ta boucle SDK. Le panneau de requête montre exactement quels attributs de clé DynamoDB attend.

Sers-toi du Query Builder pour générer un programme de Query paginé avec une gestion correcte de l'ExclusiveStartKey. Change de profil avec ⌘P ; Test Connection dans Settings → Profiles. Vois Se connecter à AWS et Installation.

Sources

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.