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 help liste --starting-token, --max-items et --page-size ; aws dynamodb batch-get-item help n'en liste aucun des trois. UnprocessedKeys n'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 UnprocessedKeys non vide se réinjecte directement dans --request-items sans remise en forme, et c'est ce qui rend une boucle while en bash supportable. Attends entre les tentatives ; une relance immédiate retombe sur la même partition throttlée.
  • ProjectionExpression et ConsistentRead se placent dans l'objet propre à chaque table, à côté de "Keys". Les mettre au premier niveau de --request-items est l'erreur de forme la plus courante ici.
  • Garde la map dans un fichier. --request-items file://keys.json contourne 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 call

Le 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

Références

Dernière vérification le 2026-07-28 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.