👻

DynamoDB TTL を設定して WCU を消費せずアイテムを削除する

2024/01/31に公開

DynamoDB を使用して、以下のようなデータを取り扱っており、ある期間を過ぎたら削除・無効化・アーカイブをしたい場合があると思います。

  • セッションデータ
  • ログデータ
  • 一時的なキャッシュデータ

今回は、DynamoDB のテーブルに TTL(Time to Live: 有効期限)を設定して、指定した期限を迎えたらアイテムを削除する方法について学んだのでまとめます。

概要

DynamoDB テーブルで TTL を有効にし、アイテムに TTL 用の項目としてタイムスタンプをセットするようにするだけで、利用することができます。
指定した時間を迎えたときに、自動でそのアイテムは削除されます。ただし、ベストエフォート方式で必ずしも指定した期限を迎えた瞬間にアイテムが削除されるわけではなく、数日以内の削除となる場合もあるため、そこの点には注意です。

このプロセスはバックグラウンドで実行され、書き込みキャパシティーユニットを消費しないので、無料かつ既存のトラフィックに影響を及ぼすことがなく経済的にパフォーマンスの向上を見込むことができます。

また、TTL により削除されたアイテムは、DynamoDB Streams でも拾うことができます。
そのため、Lambda と組み合わせることで、 TTL によって削除された項目を S3 にバックアップしたり、別テーブルに書き込んだりすることができます。
そのため、法律により保管が義務付けられているデータ(参照することはほぼないけど、どこかしらに保管はしていないといけない)などに対しても有効に利用することができます。

利用方法

たいてい、一つか二つのステップで完了します。

1. テーブルに対して TTL を有効化する

AWS コンソールにて、DynamoDB -> テーブル一覧から任意のテーブルの詳細画面に行き、「TTL をオンにする」を選択します。

TTL の設定画面に移動するので、TTL として設定したい属性の名前を入力します。
すでに存在する属性でも構いませんが、数値型の UNIX time のタイムスタンプである必要があります。また、すでに存在する属性を指定し、それが有効な UNIX time であった場合、プレビューから正しく動作しているかを確認することができます。

よければ、「TTL をオンにする」を選択してください。
既に存在する属性をした場合、すべてのアイテムに TTL が有効化されるまで、時間がかかる場合があります。

テーブルアイテム探索画面にて、TTL 属性は下記のように、属性名(TTL) と表示されます。

2. 既存アイテムに対して TTL 属性を追加する

新しく、TTL 用に属性を作った場合は、既存アイテムに対し TTL 属性を追加する必要があります。

数値型の秒単位の UNIX time タイムスタンプである必要があります。

https://repost.aws/ja/knowledge-center/ttl-dynamodb

また、過去の日付を TTL とした場合は put_item ができないという話もあるそうです。
https://blog.serverworks.co.jp/tech/2020/06/25/post-87641/

過去データに関してはスクリプトを使って一律で同じ TTL を設定したりする必要がありそうです。
新しくできるアイテムに関しては、TTL も設定するようにしましょう。

さいごに

とても簡単なステップでアイテムに有効期限を設定することができました。
以前ログテーブルとして使用していた際に、バックアップをとって削除しようとしたときにキャパシティーがリミットを迎えてしまったことがあったのでそんなときに使えそうです。

参考

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/TTL.html
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html
https://repost.aws/ja/knowledge-center/ttl-dynamodb
https://repost.aws/ja/knowledge-center/dynamodb-expired-ttl-not-deleted
https://blog.serverworks.co.jp/tech/2020/06/25/post-87641/

Discussion