DynamoDB BatchGetItem avec l'AWS CLI
aws dynamodb batch-get-item récupère jusqu'à 100 éléments par clé primaire en une seule commande. Deux choses le distinguent de query et scan en ligne de commande : les clés sont du JSON DynamoDB imbriqué qui doit survivre au quoting du shell, et la CLI ne vide pas UnprocessedKeys à ta place. Les limites et les règles de résultat partiel sont dans les opérations batch dans DynamoDB.
Code
aws dynamodb batch-get-item \
--request-items '{
"Music": {
"Keys": [
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "A Mis Abuelos"}},
{"Artist": {"S": "Ella Fitzgerald"}, "SongTitle": {"S": "Misty"}}
]
}
}'Abrégée, la sortie associe chaque table aux éléments trouvés plus les éventuels restes. L'exécution complète, telle quelle, se trouve plus bas sur la page :
{
"Responses": {
"Music": [
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}, ...}
]
},
"UnprocessedKeys": {}
}Explication
- La CLI n'a aucune mécanique de pagination pour cette commande.
aws dynamodb query helpliste--starting-token,--max-itemset--page-size;aws dynamodb batch-get-item helpn'en liste aucun des trois.UnprocessedKeysn'est pas un token de pagination et la CLI traite l'appel comme un one-shot : le vider est donc ta boucle shell, pas un flag. - La map des restes est déjà au format d'entrée. Un
UnprocessedKeysnon vide se réinjecte directement dans--request-itemssans remise en forme, et c'est ce qui rend une bouclewhileen bash supportable. Attends entre les tentatives ; une relance immédiate retombe sur la même partition throttlée. ProjectionExpressionetConsistentReadse placent dans l'objet propre à chaque table, à côté de"Keys". Les mettre au premier niveau de--request-itemsest l'erreur de forme la plus courante ici.- Garde la map dans un fichier.
--request-items file://keys.jsoncontourne entièrement le quoting du shell, et c'est la seule option raisonnable au-delà d'une poignée de clés. C'est aussi comme ça que tu atteins le plafond de 100 clés sans t'en rendre compte.
Ce que la commande affiche réellement
Le bloc ci-dessus, exécuté tel quel contre DynamoDB Local 3.3.0 avec les trois morceaux présents (aws-cli/2.36.9) :
{
"Responses": {
"Music": [
{
"Artist": {"S": "Arturo Sandoval"},
"AlbumTitle": {"S": "Danzon"},
"Year": {"N": "1994"},
"SongTitle": {"S": "A Mis Abuelos"}
},
{
"Artist": {"S": "Ella Fitzgerald"},
"AlbumTitle": {"S": "Ella in Berlin"},
"Year": {"N": "1960"},
"SongTitle": {"S": "Misty"}
},
{
"Artist": {"S": "Arturo Sandoval"},
"AlbumTitle": {"S": "Danzon"},
"Year": {"N": "1994"},
"SongTitle": {"S": "Cubano Chant"}
}
]
},
"UnprocessedKeys": {}
}(Chaque map d'attributs repliée sur une seule ligne ; tout le reste est tel qu'affiché.) La commande a demandé Cubano Chant en premier et l'a reçu en dernier. Rien dans la réponse n'est positionnel : une expression jq qui indexe .Responses.Music[0] lit donc l'élément que le service a eu envie de renvoyer en premier. Filtre plutôt sur les attributs de clé.
Deux requêtes qu'il rejette d'emblée, affichées sur stderr avec le statut de sortie 254 :
aws: [ERROR]: An error occurred (ValidationException) when calling the BatchGetItem operation: Provided list of item keys contains duplicates
aws: [ERROR]: An error occurred (ValidationException) when calling the BatchGetItem operation: Too many items requested for the BatchGetItem callLe préfixe aws: [ERROR]: vient du wrapper CLI v2 ; le texte qui suit est le message du service lui-même. Une boucle de reprise qui traite tout statut de sortie non nul comme du throttling tournera indéfiniment sur l'une comme sur l'autre : branche donc sur le message avant d'appliquer un backoff.
Écrire ce JSON imbriqué à la main entre guillemets simples est la source de la plupart des erreurs. Le DynamoDB Expression Builder assemble des maps de clés typées et copie une commande prête à exécuter, ce qui retire au moins le quoting de la liste des suspects.
Pour relire un ensemble de clés et voir les éléments sans passer par le JSON, télécharge DynoTable.
Exemples liés
- DynamoDB BatchGetItem en Node.js — la même lecture batch avec l'AWS SDK v3.
- DynamoDB BatchGetItem en Python — la même lecture batch avec boto3.
- DynamoDB GetItem avec l'AWS CLI — la lecture d'un seul élément que celle-ci regroupe.
- Les opérations batch dans DynamoDB — limites, échec partiel, et quand le batch est rentable.
- "Too many items requested for the BatchGetItem call" — plus de 100 clés dans une seule requête.
- "Provided list of item keys contains duplicates" — la même clé deux fois dans un batch.
Références
- BatchGetItem — Amazon DynamoDB API Reference
- batch-get-item — AWS CLI Command Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.