DynamoDB TTL attribute must be a Number
TL;DR — Time to Live DynamoDB hanya menghapus item ketika atribut TTL yang ditentukannya menyimpan Number yang merepresentasikan Unix epoch timestamp dalam detik. String seperti "1735689600", nilai milidetik, tanggal ISO-8601, atau atribut yang hilang diam-diam diabaikan — item tidak pernah kedaluwarsa. Simpan TTL sebagai Number epoch-seconds dan tulis ulang item yang terkena.
Apa artinya
# 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 awayMengaktifkan TTL (UpdateTimeToLive) berhasil bahkan ketika atribut belum ada atau tipe salah — DynamoDB tidak memeriksa tipenya di awal. Kegagalan muncul kemudian: proses TTL latar belakang hanya menghapus item ketika atribut adalah Number yang menyimpan Unix epoch timestamp dalam detik yang berada di masa lalu (dan tidak lebih dari lima tahun di masa lalu). Apa pun yang lain diperlakukan sebagai "tidak ada kedaluwarsa".
Mengapa itu terjadi
- Disimpan sebagai String — nilainya
{"S": "1735689600"}alih-alih{"N": "1735689600"}. TTL mengabaikan tipe non-N. - Milidetik alih-alih detik —
Date.now()(JavaScript) mengembalikan milidetik; nilai 13-digit adalah puluhan ribu tahun di masa depan, jadi item secara efektif tidak pernah kedaluwarsa. - String tanggal ISO-8601 / manusia alih-alih epoch seconds.
- Timestamp lebih dari lima tahun di masa lalu — proses TTL mengabaikannya alih-alih menghapus item.
- Nama atribut berbeda dari yang terdaftar dengan TTL (nama peka huruf besar-kecil).
- Memanggil
UpdateTimeToLivelagi terlalu cepat — perubahan memakan waktu hingga satu jam untuk diproses penuh, dan panggilanUpdateTimeToLivetambahan apa pun untuk tabel yang sama selama jam itu memunculkanValidationException.
Bagaimana cara memperbaikinya
- Tulis nilai TTL sebagai Number dalam epoch seconds —
Math.floor(Date.now() / 1000) + ttlSecondsdi JavaScript,int(time.time()) + ttldi Python. Jangan pernah menyimpan milidetik. - Gunakan tipe
N, bukanS. Dengan klien low-level itu{"N": "1735689600"}; Document Client me-marshal number native untuk Anda. - Cocokkan nama atribut terdaftar persis, termasuk huruf besar-kecil. Konfirmasi dengan
DescribeTimeToLive. - Backfill item yang ada — item yang ditulis sebelum perbaikan masih membawa nilai buruk; tulis ulang dengan Number epoch-seconds yang benar.
- Tunggu satu jam antar perubahan konfigurasi TTL —
UpdateTimeToLivememakan waktu hingga satu jam untuk diproses, dan panggilan lebih lanjut selama jendela itu ditolak denganValidationException.
Ingin melihat tipe wire setiap atribut saat menelusuri tabel? Aplikasi desktop DynoTable merender tag tipe N/S/M inline, jadi TTL yang disimpan sebagai String menonjol sebelum ia merugikan Anda item yang tidak kedaluwarsa.
FAQ
Mengapa TTL DynamoDB saya tidak menghapus item? Atribut TTL harus berupa Number yang menyimpan Unix epoch timestamp dalam detik. Nilai String, nilai milidetik, tanggal ISO, atau nama yang tidak cocok dengan atribut TTL terdaftar semua diam-diam diabaikan, jadi item tidak pernah kedaluwarsa. Penghapusan juga tidak segera — DynamoDB biasanya menghapus item kedaluwarsa dalam beberapa hari setelah waktu kedaluwarsanya.
Apakah DynamoDB memvalidasi tipe atribut TTL saat saya mengaktifkan TTL?
Tidak. UpdateTimeToLive berhasil bahkan jika atribut hilang atau tipe salah. Persyaratan tipe (Number, epoch seconds) hanya diberlakukan oleh proses penghapusan latar belakang, itulah mengapa TTL buruk gagal secara diam-diam.
Kesalahan terkait
- Float / decimal number types not supported — jebakan penulisan-tipe number terkait.
- ValidationException (ikhtisar)
- Pelajari: DynamoDB TTL · DynamoDB data types
Referensi
- 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
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.