The provided starting key is invalid
TL;DR — ExclusiveStartKey が、ページングしているものの キースキーマと一致しません。DynamoDB が LastEvaluatedKey で返したキー属性 — 完全なプライマリキー、そして GSI/LSI を照会しているときはインデックスキーも — を、同じ名前と型で正確に含む必要があります。LastEvaluatedKey をそのまま渡してください。手作業で組み立てるのがこれが壊れる原因です。
意味
ValidationException: The provided starting key is invalidValidationException: Exclusive Start Key must have same size as table's key schemaExclusiveStartKey は、Query/Scan にどこから再開するかを伝えます。DynamoDB はそれをテーブルのキースキーマ — またはインデックスクエリでは、LastEvaluatedKey が運ぶインデックス + テーブルの結合キー — に対して検証します。属性の欠落、余分な属性、誤った名前、誤った型はすべて、データが読まれる前に失敗します。
発生する理由
- パーティションキーだけでキーを手作り — 複合キーのテーブルは、開始キーにパーティション と ソートキーが必要です。
- テーブルキーだけでインデックスをページング — GSI/LSI クエリの
LastEvaluatedKeyは、インデックスキー属性とテーブルのプライマリキーの両方を含みます。そのすべてが返される必要があります。 - 型または名前のドリフト — キーがシリアライズされ(JSON、URL パラメータ、キャッシュ)、
LastEvaluatedKeyが数値だった場所に"42"で戻ってきた、または名前が変わったフィールドで。 - クエリ間でのキーの再利用 — あるテーブル/インデックスの
LastEvaluatedKeyを別のものに対するクエリに渡した、または同じクエリでもキースキーマの仮定が変わった後に。 - デフォルトを注入するラッパー — キーに属すると考える属性を埋める ODM が、開始キーをスキーマサイズを超えて水増しできる。
修正方法
LastEvaluatedKeyを手を触れずに往復させます: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);リクエスト境界を越える場合はロスなくシリアライズします — ページネーションカーソルがブラウザに行って戻るとき、アイテムのフィールドから再構築するのではなく、
LastEvaluatedKeyオブジェクト全体をエンコード(例: その JSON の base64)し、数値型は数値のまま保ちます。インデックスのページングにはすべてのキー属性を含めます — インデックスのパーティション/ソートキー と テーブルのパーティション/ソートキーを、返されたとおり正確に。
開始点をでっち上げないでください — DynamoDB のページネーションにオフセットはありません。「X の近くから開始」が必要なら、手作りの
ExclusiveStartKeyではなくKeyConditionExpression(sk > :x)で表現します。
LastEvaluatedKey がテーブルやインデックスで実際に何を含むかを検査すると、推測が不要になります。DynoTable デスクトップアプリ はクエリをページ送りして生のカーソルを表示し、DynamoDB Expression Builder はその周りにクエリリクエストを組み立てます。
関連するエラー
- The provided key element does not match the schema —
GetItem/書き込みキーでの同じスキーマの不一致。 - Query key condition not supported
- Code example: Get all items in Node.js · in Python (boto3) — 正しく行われた LastEvaluatedKey のページネーションループ。
- Learn: Pagination in DynamoDB
References
- Paginating table query results in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。