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 invalidValidationException: Exclusive Start Key must have same size as table's key schemaExclusiveStartKey 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 table —
LastEvaluatedKeysur 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ùLastEvaluatedKeyavait un nombre, ou avec un champ renommé. - Réutiliser une clé entre requêtes — une
LastEvaluatedKeyd'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
Fais un aller-retour de
LastEvaluatedKeysans 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);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
LastEvaluatedKeyentier (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.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.
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 uneExclusiveStartKeyfaite à 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
- The provided key element does not match the schema — le même décalage de schéma sur une clé de
GetItem/écriture. - Query key condition not supported
- Exemple de code : Get all items en Node.js · en Python (boto3) — la boucle de pagination LastEvaluatedKey bien faite.
- En savoir plus : Pagination in DynamoDB
Références
- Paginating table query results in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.