DynamoDB GSI projiziert das angeforderte Attribut nicht

TL;DR — Du hast einen Global Secondary Index abgefragt und (per ProjectionExpression oder Select=ALL_ATTRIBUTES) ein Attribut angefordert, das der Index nicht projiziert. Ein GSI gibt nur seine eigenen Key-Attribute, die Key-Attribute der Basistabelle und alles zurück, was du in seiner Projektion aufgeführt hast — sonst nichts. Grenze entweder die Anfrage auf projizierte Attribute ein, füge das Attribut zur Projektion des GSI hinzu oder frage die Basistabelle per Primärschlüssel ab.

Was es bedeutet

ValidationException: One or more parameter values were invalid: Global secondary
index <index_name> does not project <attribute_name>

# or, with Select=ALL_ATTRIBUTES on a KEYS_ONLY / INCLUDE index:
ValidationException: Select type ALL_ATTRIBUTES is not supported for global
secondary index <index_name> because its projection type is not ALL

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: One or more parameter values were invalid: Global secondary index gsi1 does not project [unprojected]

Anders als ein Local Secondary Index (der nicht-projizierte Attribute zu Extrakosten aus dem Basis-Item holen kann) ist ein GSI eine eigenständige Kopie. Er speichert physisch nur die Attribute seiner Projektion — AWS' eigene Doku ist unverblümt: "global secondary index queries cannot fetch attributes from the base table." Eine GSI-Abfrage nach irgendetwas außerhalb dieses Satzes ist nicht erfüllbar, deshalb lehnt DynamoDB die Anfrage ab (eine ValidationException, HTTP 400 — nicht wiederholbar), statt stillschweigend unvollständige Daten zurückzugeben.

Warum es passiert

  • ProjectionType: KEYS_ONLY-Index, der nach einem Nicht-Key-Attribut abgefragt wird.
  • ProjectionType: INCLUDE-Index, der nach einem Attribut abgefragt wird, das nicht in der NonKeyAttributes-Liste steht.
  • Select: ALL_ATTRIBUTES auf einem GSI, der nicht ProjectionType: ALL ist.
  • Annahme von LSI-Verhalten — erwarten, dass ein GSI nicht-projizierte Attribute aus der Basistabelle holt (nur LSIs tun das).
  • Eine Projektion, die abgedriftet ist von dem, was die Abfrage braucht, während sich das Zugriffsmuster weiterentwickelt hat.

So behebst du es

  1. Fordere nur projizierte Attribute an — beschränke ProjectionExpression auf die Keys des GSI + seinen projizierten Satz, oder lass Select: ALL_ATTRIBUTES weg.
  2. Füge das Attribut zur GSI-Projektion hinzu — für ein neues Attribut erstelle/ersetze den GSI mit ProjectionType: INCLUDE (und liste es auf) oder ALL. Die Projektionen bestehender GSIs lassen sich nicht in-place bearbeiten; du fügst einen neuen GSI hinzu oder erstellst ihn neu.
  3. Hol aus der Basistabelle — verwende die Keys, die der GSI tatsächlich zurückgibt, um ein GetItem/BatchGetItem auf der Basistabelle für das vollständige Item durchzuführen.
  4. Verwende ProjectionType: ALL, wenn du routinemäßig jedes Attribut aus dem Index brauchst (und die zusätzlichen Speicher-/Schreibkosten akzeptierst).

Willst du sehen, welche Attribute ein GSI tatsächlich trägt, bevor du ihn abfragst? Die DynoTable-Desktop-App zeigt die Projektion jedes Index an, sodass du nur anforderst, was vorhanden ist — keine does not project-Überraschung.

Verwandte Fehler

Referenzen

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.