DynamoDB TTL attribute must be a Number

TL;DR — DynamoDBs Time to Live löscht ein Item nur dann, wenn sein festgelegtes TTL-Attribut eine Zahl enthält, die einen Unix-Epoch-Zeitstempel in Sekunden darstellt. Ein String wie "1735689600", ein Millisekundenwert, ein ISO-8601-Datum oder ein fehlendes Attribut wird stillschweigend ignoriert — das Item läuft nie ab. Speichere den TTL als Epoch-Sekunden-Zahl und schreibe die betroffenen Items neu.

Was es bedeutet

# A second UpdateTimeToLive call within one hour of the first raises:
ValidationException  (TTL settings can only be modified once per table per hour)

# The quieter failure — no error at all, item just never expires:
TTL attribute "expiresAt" = "2026-01-01T00:00:00Z"   ← String, ignored
TTL attribute "expiresAt" = 1735689600000            ← milliseconds: tens of thousands of years away

Das Aktivieren von TTL (UpdateTimeToLive) gelingt selbst dann, wenn das Attribut noch nicht existiert oder den falschen Typ hat — DynamoDB prüft es nicht vorab auf Typ. Der Fehler zeigt sich später: Der Hintergrund-TTL-Prozess löscht ein Item nur, wenn das Attribut eine Zahl ist, die einen Unix-Epoch-Zeitstempel in Sekunden hält, der in der Vergangenheit liegt (und nicht mehr als fünf Jahre in der Vergangenheit). Alles andere wird als „kein Ablauf" behandelt.

Warum es passiert

  • Als String gespeichert — der Wert ist {"S": "1735689600"} statt {"N": "1735689600"}. TTL ignoriert Nicht-N-Typen.
  • Millisekunden statt SekundenDate.now() (JavaScript) gibt Millisekunden zurück; ein 13-stelliger Wert liegt zehntausende Jahre in der Zukunft, sodass das Item praktisch nie abläuft.
  • Ein ISO-8601-/menschenlesbarer Datums-String statt Epoch-Sekunden.
  • Ein Zeitstempel mehr als fünf Jahre in der Vergangenheit — der TTL-Prozess ignoriert ihn, statt das Item zu löschen.
  • Ein anderer Attributname als der bei TTL registrierte (der Name unterscheidet Groß-/Kleinschreibung).
  • UpdateTimeToLive zu früh erneut aufrufen — die Änderung braucht bis zu einer Stunde zur vollständigen Verarbeitung, und jeder zusätzliche UpdateTimeToLive-Aufruf für dieselbe Tabelle während dieser Stunde löst eine ValidationException aus.

So behebst du es

  1. Schreibe den TTL-Wert als Zahl in Epoch-SekundenMath.floor(Date.now() / 1000) + ttlSeconds in JavaScript, int(time.time()) + ttl in Python. Speichere nie Millisekunden.
  2. Nutze den N-Typ, nicht S. Mit dem Low-Level-Client ist das {"N": "1735689600"}; der Document Client marshallt eine native Zahl für dich.
  3. Bringe den registrierten Attributnamen exakt in Übereinstimmung, einschließlich Groß-/Kleinschreibung. Bestätige ihn mit DescribeTimeToLive.
  4. Fülle bestehende Items nach — Items, die vor der Korrektur geschrieben wurden, tragen noch den falschen Wert; schreibe sie mit einer korrekten Epoch-Sekunden-Zahl neu.
  5. Warte eine Stunde zwischen TTL-KonfigurationsänderungenUpdateTimeToLive braucht bis zu einer Stunde zur Verarbeitung, und weitere Aufrufe während dieses Fensters werden mit einer ValidationException abgelehnt.

Willst du den Wire-Typ jedes Attributs sehen, während du eine Tabelle durchsuchst? Die DynoTable-Desktop-App rendert N/S/M-Typ-Tags inline, sodass ein als String gespeicherter TTL ins Auge springt, bevor er dich ein nicht abgelaufenes Item kostet.

FAQ

Warum löscht mein DynamoDB-TTL keine Items? Das TTL-Attribut muss eine Zahl sein, die einen Unix-Epoch-Zeitstempel in Sekunden hält. Ein String-Wert, ein Millisekundenwert, ein ISO-Datum oder ein Name, der nicht zum registrierten TTL-Attribut passt, werden alle stillschweigend ignoriert, sodass das Item nie abläuft. Das Löschen ist auch nicht sofort — DynamoDB entfernt abgelaufene Items typischerweise innerhalb einiger Tage nach ihrer Ablaufzeit.

Validiert DynamoDB den TTL-Attributtyp, wenn ich TTL aktiviere? Nein. UpdateTimeToLive gelingt selbst dann, wenn das Attribut fehlt oder den falschen Typ hat. Die Typanforderung (Zahl, Epoch-Sekunden) wird nur vom Hintergrund-Löschprozess durchgesetzt, weshalb ein falscher TTL leise fehlschlägt.

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.