Too many items requested for the BatchWriteItem call

En bref — BatchWriteItem accepte au plus 25 actions put/delete par appel (et ≤16 Mo au total). Tu en as envoyé plus de 25, donc DynamoDB a rejeté toute la requête. Découpe tes éléments en lots de 25 ou moins et émets un BatchWriteItem par lot.

Ce que ça signifie

ValidationException: 1 validation error detected: Value '<your request>' at 'requestItems' failed to satisfy constraint: Map value must satisfy constraint: [Member must have length less than or equal to 25, Member must have length greater than or equal to 1]

# on DynamoDB Local the same call is rejected with a shorter sentence:
ValidationException: Too many items requested for the BatchWriteItem call

Le service recopie toute ta requête sérialisée à l'emplacement de <your request> — environ 12 000 caractères pour un lot de 26 éléments.

BatchWriteItem regroupe des actions PutRequest/DeleteRequest individuelles sur une ou plusieurs tables — mais un seul appel est strictement plafonné à 25 actions et 16 Mo de données. Franchis l'une ou l'autre limite et DynamoDB rejette toute la requête avant d'écrire quoi que ce soit. C'est un HTTP 400 ValidationException, côté client, et non réessayable tant que tu ne redimensionnes pas le lot.

Pourquoi ça arrive

  • Écrire une grande collection en un seul appel — passer un tableau de centaines d'éléments directement dans BatchWriteItem sans découper.
  • Une boucle de découpage avec la mauvaise borne — batcher par nombre mais utiliser une limite supérieure à 25, ou une erreur de décalage qui laisse passer 26.
  • Compter les tables, pas les actions — la limite de 25 est le total des actions sur toutes les tables de la requête, pas par table.
  • Charge utile surdimensionnée — même à ≤25 actions, tout le lot est rejeté si un seul élément dépasse 400 Ko ou si la requête totale dépasse 16 Mo.

Comment le corriger

  1. Découpe en groupes de ≤25 actions et envoie un BatchWriteItem par groupe.
  2. Gère UnprocessedItemsBatchWriteItem peut renvoyer des éléments qu'il n'a pas traités (throttling) ; réessaie-les avec un backoff exponentiel. C'est normal, même dans un lot valide de 25 éléments.
  3. Garde chaque lot sous 16 Mo — avec de gros éléments, il te faudra peut-être moins de 25 par appel.
  4. Utilise un utilitaire qui met en tampon pour toi — le Table.batch_writer() de boto3 découpe les écritures et renvoie automatiquement les éléments non traités (l'Enhanced Client / le DynamoDBMapper v1 du SDK Java réessaient aussi les éléments non traités). Les clients bas niveau et le document client JavaScript ne découpent pas un lot surdimensionné.

Mesure dans DynoTable

Avant un chargement en masse, vérifie ponctuellement la taille des éléments dans DynoTable — ouvre un élément d'exemple avec ⌘K et confirme que chacun tient sous 400 Ko. Le calculateur de taille d'élément estime la taille de la charge utile d'un lot, de quoi choisir une taille de lot sûre avant que ton chargeur ne tourne.

Sers-toi du staging (⌘S) pour tester une petite écriture par lot sur une table de dev avant de lancer l'import complet. Change de profil avec ⌘P ; configure-les sous Settings → Profiles avec Test Connection. Vois Se connecter à AWS et Installation.

Sources

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.