Too many items requested for the BatchGetItem call
TL;DR — BatchGetItem が1回の呼び出しで取得できるのは最大100アイテム(かつ 16 MB 以下のデータ)です。100を超えるキーを要求したため、DynamoDB がリクエストを拒否しました。キーを100以下のチャンクに分割し、チャンクごとに BatchGetItem を1回ずつ発行してください。
意味
ValidationException: 1 validation error detected: Value at 'RequestItems.<table-name>.member.Keys' failed to satisfy constraint: Member must have length less than or equal to 100
# on DynamoDB Local the same call is rejected with a shorter sentence:
ValidationException: Too many items requested for the BatchGetItem callBatchGetItem は1つ以上のテーブルにまたがってプライマリキーでアイテムを取得しますが、1回の呼び出しは 100キー と、返されるデータ 16 MB に制限されています。100を超えるキーを要求すると、DynamoDB は呼び出し全体を拒否します。制限内であっても、レスポンスが要求より少ないアイテムしか返さないことがあり(16 MB の上限)、残りは UnprocessedKeys で報告されます。上限超過のケースは HTTP 400 の ValidationException で、サイズを直すまでリトライしても無駄です。
発生する理由
- 大きなキー集合を1回の呼び出しで要求している — 数百のキーをそのまま
BatchGetItemに渡している。 - チャンクの上限が100を超えている — 件数でバッチ化しているが BatchWrite の25件制限と取り違えている、あるいはオフバイワンで101件が通ってしまう。
- テーブル数を数えていて、キー数を数えていない — 100の制限はリクエスト内の全テーブルにわたるキーの合計です。
UnprocessedKeysをページングしていない — 1回の呼び出しですべて返ると思い込み、そもそもチャンク分割していない。
修正方法
- キーを100以下のグループにチャンク分割し、チャンクごとに
BatchGetItemを1回送ります。 UnprocessedKeysを処理します — 返ってきたキーは指数バックオフで再試行します。これは有効な100キーのバッチ内でも、16 MB の上限に当たれば発生します。- レスポンスを 16 MB 未満に保ちます — アイテムが大きい場合は、1回あたり100より少ない数を要求します。
- SDK が何をしてくれるかを把握します — 低レベルクライアントと JavaScript のドキュメントクライアントは、大きすぎるキーリストを 分割しません。自分で100にチャンク分割する必要があります。一部の高レベルクライアント(Java SDK の Enhanced Client と v1 の DynamoDBMapper)は、少なくとも未処理アイテムを自動で再試行します。
再現方法
上限を1つ超えて、101キーを要求する BatchGetItem です。
const Keys = Array.from({length: 101}, (_, i) => ({pk: {S: `K#${i}`}, sk: {S: 'META'}}));
await client.send(new BatchGetItemCommand({RequestItems: {orders: {Keys}}}));実際の出力:
ValidationException: Too many items requested for the BatchGetItem call
HTTP 400これはリクエストの形の時点で即座に失敗します — 部分的な読み取りは発生せず、UnprocessedKeys にも何も入りません。そこが、部分的な結果を返す 16 MB のレスポンス上限超過との違いです。
DynoTable から
デバッグ中は、DynoTable で 1 回あたり 100 件未満のキーをバッチ読み取りしましょう — ⌘K でテーブルを開き、対象のキー集合に絞り込み、コードで分割した BatchGetItem を組む前にアイテムが存在することを確認します。アイテムが大きい場合、アイテムサイズ計算ツールが安全なチャンクサイズを選ぶのに役立ちます。
まずはクエリビルダーで単一キーの読み取りを試作しましょう。プロファイルの切り替えは ⌘P、Settings → Profiles では Test Connection を実行します。AWS に接続するとインストールを参照してください。
出典
- BatchGetItem — Amazon DynamoDB API Reference (2026-07-13 時点で検証)
- Quotas in Amazon DynamoDB (2026-07-13 時点で検証)
関連するエラー
- Too many items requested for the BatchWriteItem call — 書き込み側の制限(25アイテム)。
- Provided list of item keys contains duplicates — 1回の BatchGetItem に同じキーが2回。
- ProvisionedThroughputExceededException — UnprocessedKeys として表面化するスロットリング。
- Code example: BatchGetItem in Node.js · in Python (boto3) — UnprocessedKeys のリトライ付きチャンク読み取り。
- 学習: DynamoDB のバッチ操作
参考資料
- BatchGetItem — Amazon DynamoDB API Reference
- BatchWriteItem — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
2026-07-26 に DynamoDB Local 2.x と AWS SDK for JavaScript v3.1095.0 で再現しました — 上記の出力はそのままの逐語です。