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 away

TTL'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, N olmayan türleri yoksayar.
  • Saniye yerine milisaniyeDate.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 ek UpdateTimeToLive çağrısı bir ValidationException fırlatır.

Nasıl düzeltilir

  1. TTL değerini epoch saniye cinsinden bir Number olarak yazın — JavaScript'te Math.floor(Date.now() / 1000) + ttlSeconds, Python'da int(time.time()) + ttl. Asla milisaniye saklamayın.
  2. S değil, N türünü kullanın. Düşük seviyeli istemciyle bu {"N": "1735689600"}'dir; Document Client sizin için yerel bir sayıyı marshal eder.
  3. Büyük/küçük harf dahil kaydedilen öznitelik adını tam eşleştirin. DescribeTimeToLive ile doğrulayın.
  4. 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.
  5. TTL yapılandırma değişiklikleri arasında bir saat bekleyinUpdateTimeToLive'ın işlenmesi bir saate kadar sürer ve o pencere içindeki sonraki çağrılar bir ValidationException ile 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

Kaynaklar

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.