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.

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

DynoTable est un client de bureau rapide pour DynamoDB — parcours les tables, exécute des requêtes de style SQL et édite les items en local.