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 awayDas 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 Sekunden —
Date.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).
UpdateTimeToLivezu früh erneut aufrufen — die Änderung braucht bis zu einer Stunde zur vollständigen Verarbeitung, und jeder zusätzlicheUpdateTimeToLive-Aufruf für dieselbe Tabelle während dieser Stunde löst eineValidationExceptionaus.
So behebst du es
- Schreibe den TTL-Wert als Zahl in Epoch-Sekunden —
Math.floor(Date.now() / 1000) + ttlSecondsin JavaScript,int(time.time()) + ttlin Python. Speichere nie Millisekunden. - Nutze den
N-Typ, nichtS. Mit dem Low-Level-Client ist das{"N": "1735689600"}; der Document Client marshallt eine native Zahl für dich. - Bringe den registrierten Attributnamen exakt in Übereinstimmung, einschließlich Groß-/Kleinschreibung. Bestätige ihn mit
DescribeTimeToLive. - 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.
- Warte eine Stunde zwischen TTL-Konfigurationsänderungen —
UpdateTimeToLivebraucht bis zu einer Stunde zur Verarbeitung, und weitere Aufrufe während dieses Fensters werden mit einerValidationExceptionabgelehnt.
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
- Float / decimal number types not supported — eine verwandte Zahlen-Typisierungsfalle.
- ValidationException (Überblick)
- Learn: DynamoDB TTL · DynamoDB-Datentypen
Referenzen
- Using time to live (TTL) in DynamoDB — Amazon DynamoDB Developer Guide
- Computing time to live (TTL) in DynamoDB — Amazon DynamoDB Developer Guide
- Enable time to live (TTL) in DynamoDB — Amazon DynamoDB Developer Guide
- UpdateTimeToLive — Amazon DynamoDB API Reference
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.