DynamoDB TTL attribute must be a Number
TL;DR — DynamoDB'nin Yaşam Süresi (TTL), yalnızca belirlenen TTL özniteliği saniye cinsinden bir Unix epoch zaman damgasını temsil eden bir Number tuttuğunda bir öğeyi siler. "1735689600" gibi bir String, bir milisaniye değeri, bir ISO-8601 tarihi ya da eksik bir öznitelik sessizce yoksayılır — öğenin süresi asla geçmez. TTL'yi bir epoch-saniye Number olarak saklayın ve etkilenen öğeleri yeniden yazın.
Ne anlama gelir
# 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 awayTTL'yi etkinleştirmek (UpdateTimeToLive), öznitelik henüz yokken ya da yanlış türdeyken bile başarılı olur — DynamoDB onu önceden tür kontrol etmez. Hata daha sonra ortaya çıkar: arka plan TTL süreci bir öğeyi yalnızca öznitelik, geçmişte olan (ve beş yıldan fazla geçmişte olmayan) saniye cinsinden bir Unix epoch zaman damgası tutan bir Number olduğunda siler. Başka her şey "süre bitimi yok" olarak ele alınır.
Neden olur
- String olarak saklanmış — değer
{"N": "1735689600"}yerine{"S": "1735689600"}. TTL,Nolmayan türleri yoksayar. - Saniye yerine milisaniye —
Date.now()(JavaScript) milisaniye döndürür; 13 haneli bir değer gelecekte on binlerce yıldır, dolayısıyla öğenin süresi fiilen asla geçmez. - Epoch saniye yerine bir ISO-8601 / insan tarihi dizesi.
- Beş yıldan fazla geçmişte bir zaman damgası — TTL süreci öğeyi silmek yerine onu yoksayar.
- TTL ile kaydedilenden farklı bir öznitelik adı (ad büyük/küçük harfe duyarlıdır).
UpdateTimeToLive'ı çok erken tekrar çağırmak — değişikliğin tam olarak işlenmesi bir saate kadar sürer ve o saat boyunca aynı tablo için herhangi bir ekUpdateTimeToLiveçağrısı birValidationExceptionfırlatır.
Nasıl düzeltilir
- TTL değerini epoch saniye cinsinden bir Number olarak yazın — JavaScript'te
Math.floor(Date.now() / 1000) + ttlSeconds, Python'daint(time.time()) + ttl. Asla milisaniye saklamayın. Sdeğil,Ntürünü kullanın. Düşük seviyeli istemciyle bu{"N": "1735689600"}'dir; Document Client sizin için yerel bir sayıyı marshal eder.- Büyük/küçük harf dahil kaydedilen öznitelik adını tam eşleştirin.
DescribeTimeToLiveile doğrulayın. - Mevcut öğeleri geri doldurun — düzeltmeden önce yazılan öğeler hâlâ hatalı değeri taşır; onları doğru bir epoch-saniye Number ile yeniden yazın.
- TTL yapılandırma değişiklikleri arasında bir saat bekleyin —
UpdateTimeToLive'ın işlenmesi bir saate kadar sürer ve o pencere içindeki sonraki çağrılar birValidationExceptionile reddedilir.
Bir tabloya göz atarken her özniteliğin kablo türünü mü görmek istiyorsunuz? DynoTable masaüstü uygulaması, N/S/M tür etiketlerini satır içi işler, böylece String olarak saklanmış bir TTL, size süresi geçmemiş bir öğeye mal olmadan önce öne çıkar.
SSS
DynamoDB TTL'im öğeleri neden silmiyor? TTL özniteliği, saniye cinsinden bir Unix epoch zaman damgası tutan bir Number olmalıdır. Bir String değeri, bir milisaniye değeri, bir ISO tarihi ya da kaydedilen TTL özniteliğiyle eşleşmeyen bir ad, hepsi sessizce yoksayılır, dolayısıyla öğenin süresi asla geçmez. Silme de anında değildir — DynamoDB genellikle süresi geçmiş öğeleri sona erme zamanlarından birkaç gün içinde kaldırır.
TTL'yi etkinleştirdiğimde DynamoDB TTL öznitelik türünü doğrular mı?
Hayır. UpdateTimeToLive, öznitelik eksik ya da yanlış türde olsa bile başarılı olur. Tür gereksinimi (Number, epoch saniye) yalnızca arka plan silme süreci tarafından uygulanır, ki bu yüzden hatalı bir TTL sessizce başarısız olur.
İlgili hatalar
- Float / decimal number types not supported — ilgili bir sayı-türleme tuzağı.
- ValidationException (genel bakış)
- Öğrenin: DynamoDB TTL · DynamoDB data types
Kaynaklar
- 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
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.