The provided starting key is invalid
TL;DR — Dein ExclusiveStartKey passt nicht zum Schlüsselschema dessen, was du paginierst. Er muss genau die Schlüsselattribute enthalten, die DynamoDB in LastEvaluatedKey zurückgegeben hat — den vollständigen Primärschlüssel plus den Index-Schlüssel, wenn du einen GSI/LSI abfragst — mit denselben Namen und Typen. Gib LastEvaluatedKey unverändert zurück; das Selbst-Zusammenbauen ist der Grund, warum das schiefgeht.
Was es bedeutet
ValidationException: The provided starting key is invalidValidationException: Exclusive Start Key must have same size as table's key schemaExclusiveStartKey sagt einem Query/Scan, wo fortgesetzt werden soll. DynamoDB validiert ihn gegen das Schlüsselschema der Tabelle — oder, bei einer Index-Abfrage, gegen den kombinierten Index-plus-Tabellen-Schlüssel, den LastEvaluatedKey trägt. Fehlende Attribute, zusätzliche Attribute, falsche Namen oder falsche Typen scheitern alle, bevor überhaupt Daten gelesen werden.
Warum es passiert
- Den Schlüssel nur mit dem Partition Key selbst zusammenbauen — eine Tabelle mit zusammengesetztem Schlüssel braucht Partition- und Sort Key im Startschlüssel.
- Einen Index nur mit dem Tabellenschlüssel paginieren —
LastEvaluatedKeybei einer GSI/LSI-Abfrage enthält sowohl die Index-Schlüsselattribute als auch den Primärschlüssel der Tabelle; sie alle müssen zurückgegeben werden. - Typ- oder Namensdrift — der Schlüssel wurde serialisiert (JSON, URL-Parameter, Cache) und kam mit
"42"zurück, woLastEvaluatedKeyeine Zahl hatte, oder mit einem umbenannten Feld. - Einen Schlüssel über Abfragen hinweg wiederverwenden — ein
LastEvaluatedKeyvon einer Tabelle/einem Index, der an eine Abfrage gegen eine andere übergeben wird, oder an dieselbe Abfrage, nachdem sich die Annahme über das Schlüsselschema geändert hat. - Ein Wrapper, der Defaults einschleust — ein ODM, das Attribute einfügt, von denen es glaubt, dass sie zum Schlüssel gehören, kann den Startschlüssel über die Schemagröße hinaus auffüllen.
So behebst du es
LastEvaluatedKeyunverändert durchreichen: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);Serialisiere ihn verlustfrei, wenn er eine Request-Grenze überschreitet — wenn der Paginierungs-Cursor zu einem Browser und zurück geht, kodiere das gesamte
LastEvaluatedKey-Objekt (z. B. base64 seines JSON), statt es aus Item-Feldern zu rekonstruieren, und behalte Zahlen-Typen als Zahlen.Nimm jedes Schlüsselattribut für die Index-Paginierung mit — Index-Partition/Sort-Key und Tabellen-Partition/Sort-Key, exakt so, wie sie zurückgegeben wurden.
Erfinde keinen Startpunkt — DynamoDB-Paginierung hat keinen Offset; wenn du "beginne nahe X" brauchst, drücke das in der
KeyConditionExpression(sk > :x) aus statt in einem selbstgebautenExclusiveStartKey.
Zu prüfen, was LastEvaluatedKey für deine Tabelle oder deinen Index tatsächlich enthält, nimmt das Rätselraten heraus — die DynoTable-Desktop-App blättert durch Abfragen und zeigt den rohen Cursor, und der DynamoDB Expression Builder stellt den Abfrage-Request darum herum zusammen.
Verwandte Fehler
- The provided key element does not match the schema — derselbe Schema-Konflikt bei einem
GetItem-/Schreibschlüssel. - Query key condition not supported
- Code-Beispiel: Alle Items in Node.js abrufen · in Python (boto3) — die LastEvaluatedKey-Paginierungsschleife richtig gemacht.
- Learn: Paginierung in DynamoDB
Referenzen
- Paginating table query results in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.