DynamoDB BatchGetItem con la AWS CLI

aws dynamodb batch-get-item recupera fino a 100 Item per chiave primaria in un solo comando. Due cose lo distinguono da query e scan sulla riga di comando: le chiavi sono JSON DynamoDB annidato che deve sopravvivere al quoting della shell, e la CLI non svuota UnprocessedKeys al posto tuo. I limiti e le regole sui risultati parziali sono in operazioni batch in DynamoDB.

Codice

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"}}
      ]
    }
  }'

In forma abbreviata, l'output associa a ogni tabella gli Item trovati più gli eventuali resti. L'esecuzione completa e letterale è più avanti nella pagina:

{
    "Responses": {
        "Music": [
            {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}, ...}
        ]
    },
    "UnprocessedKeys": {}
}

Spiegazione

  • La CLI non ha alcun meccanismo di paginazione per questo comando. aws dynamodb query help elenca --starting-token, --max-items e --page-size; aws dynamodb batch-get-item help non ne elenca nessuno dei tre. UnprocessedKeys non è un token di paginazione e la CLI tratta la chiamata come one-shot, quindi svuotarlo è il tuo loop di shell, non un flag.
  • La mappa dei resti è già nel formato di input. Un UnprocessedKeys non vuoto può essere reimmesso direttamente come --request-items senza rimodellarlo, ed è ciò che rende tollerabile un loop while in bash. Attendi tra un tentativo e l'altro; una ri-esecuzione immediata colpisce la stessa partizione sottoposta a throttling.
  • ProjectionExpression e ConsistentRead vanno dentro l'oggetto della singola tabella, accanto a "Keys". Metterli al livello superiore di --request-items è l'errore di forma più comune qui.
  • Tieni la mappa in un file. --request-items file://keys.json aggira completamente il quoting della shell, ed è l'unica opzione sensata oltre una manciata di chiavi. È anche il modo in cui tocchi il tetto delle 100 chiavi senza accorgertene.

Cosa stampa davvero il comando

Il blocco qui sopra, eseguito alla lettera su DynamoDB Local 3.3.0 con tutti e tre i brani presenti (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": {}
}

(Ogni mappa di attributi ripiegata su una sola riga; tutto il resto è com'è stato stampato.) Il comando ha chiesto Cubano Chant per primo e l'ha ricevuto per ultimo. Nulla della risposta è posizionale, quindi un'espressione jq che indicizza .Responses.Music[0] sta leggendo l'Item che al servizio è andato di restituire per primo. Filtra invece sugli attributi di chiave.

Due richieste le rifiuta di netto, stampate su stderr con stato di uscita 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

Il prefisso aws: [ERROR]: viene dal wrapper della CLI v2; il testo che segue è il messaggio del servizio stesso. Un loop di retry che tratta qualunque uscita diversa da zero come throttling girerà all'infinito su entrambi, quindi ramifica sul messaggio prima di applicare il backoff.

Scrivere a mano quel JSON annidato dentro apici singoli è da dove arriva la maggior parte degli errori. Il DynamoDB Expression Builder assembla mappe di chiave tipizzate e copia un comando pronto da eseguire, il che almeno toglie il quoting dalla lista dei sospetti.

Per rileggere un insieme di chiavi e vedere gli Item senza il giro attraverso il JSON, scarica DynoTable.

Esempi correlati

Riferimenti

Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.