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 invalid
ValidationException: Exclusive Start Key must have same size as table's key schema

ExclusiveStartKey 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 paginierenLastEvaluatedKey bei 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, wo LastEvaluatedKey eine Zahl hatte, oder mit einem umbenannten Feld.
  • Einen Schlüssel über Abfragen hinweg wiederverwenden — ein LastEvaluatedKey von 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

  1. LastEvaluatedKey unverä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);
  2. 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.

  3. 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.

  4. 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 selbstgebauten ExclusiveStartKey.

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

Referenzen

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.