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 away

Mengaktifkan 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 detikDate.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 UpdateTimeToLive lagi terlalu cepat — perubahan memakan waktu hingga satu jam untuk diproses penuh, dan panggilan UpdateTimeToLive tambahan apa pun untuk tabel yang sama selama jam itu memunculkan ValidationException.

Bagaimana cara memperbaikinya

  1. Tulis nilai TTL sebagai Number dalam epoch secondsMath.floor(Date.now() / 1000) + ttlSeconds di JavaScript, int(time.time()) + ttl di Python. Jangan pernah menyimpan milidetik.
  2. Gunakan tipe N, bukan S. Dengan klien low-level itu {"N": "1735689600"}; Document Client me-marshal number native untuk Anda.
  3. Cocokkan nama atribut terdaftar persis, termasuk huruf besar-kecil. Konfirmasi dengan DescribeTimeToLive.
  4. Backfill item yang ada — item yang ditulis sebelum perbaikan masih membawa nilai buruk; tulis ulang dengan Number epoch-seconds yang benar.
  5. Tunggu satu jam antar perubahan konfigurasi TTLUpdateTimeToLive memakan waktu hingga satu jam untuk diproses, dan panggilan lebih lanjut selama jendela itu ditolak dengan ValidationException.

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

Referensi

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.