DynamoDBの各データを自動で削除する機能(TTL:Time to Live)を試してみた

はじめに

サーバーレス開発部の藤井元貴です。通勤しないと運動不足になる気がします。あとポケモンGOの卵が孵化しません……。

DynamoDBのTTL(Time to Live)機能は、レコード毎にデータの有効期限を指定でき、その有効期限を過ぎるとデータが自動削除されます。

そのため、「不要なデータを削除するバッチ処理的な仕組み」が不要になります。これは嬉しいですね!!

具体的にどう設定すれば良いのか分かりにくかったため、実際に試してみました!

おすすめの方

  • DynamoDB TTLについて知りたい

最初にまとめ

  • カラムで指定した有効期限を過ぎると、自動でデータが消える
  • 有効期限はNumber型のUnixtime(ミリ秒無し)を指定する
  • 有効期限は日本時間でOK(東京リージョン)
  • 削除処理はバックグラウンドで動く
  • データの読み込みまたは書き込みのトラフィックに影響を与えない
  • データは48時間以内に削除される

特に知りたかったことは1行目でした。よく見たら公式に書いていました……。

TTL はエポック時間形式で、現在の時間を、項目の Time To Live 属性に保存されている時間と比較します。属性に保存されているエポック時間の値が現在の時間よりも少ない場合、項目は期限切れとマークされ、その後に削除されます。

リアルタイム性が重要でない場合(48時間後に消えてもOKな場合)は、とても有効な機能ですね。

実はこんな会話がありました

1月某日

  • 藤井「S3の不要なオブジェクトが自動で消えたら嬉しいですよね〜」
  • ほげ「ライフサイクル機能があるよ」
  • 藤井「ほう(そういえば見たことあるような)」

2月某日

  • 藤井「DynamoDBも、S3のライフサイクル機能と同じように、不要なレコードが消えたら嬉しいですよね〜」
  • ほげ「TTL機能があるよ」
  • 藤井「なん……だと……」

試してみた

テーブル作成

お試し用のテーブルを作成します。

データ追加

下記のデータを追加します。

{
  "id": 1,
  "datetime": "2019/02/21 00:00:00",
  "unixtime": 1550674800
}
{
  "id": 2,
  "datetime": "2019/02/21 12:00:00",
  "unixtime": 1550718000
}
{
  "id": 3,
  "datetime": "2019/02/22 00:00:00",
  "unixtime": 1550761200
}
{
  "id": 4,
  "datetime": "2019/02/22 12:00:00",
  "unixtime": 1550804400
}

追加後は下記となりました。

TTLの設定

「概要」タブの「有効期限(TTL)属性」から「TTLの管理」を選択します。

Unix時間を扱うカラム名を指定します。今回はunixtimeを指定しました。

また、試しに2019/2/21 18:00:00とした場合のプレビュー結果は、id:1id:2が消えるようです。

設定反映を確認

しばらく待つと反映されます。最大で1時間ほど掛かるようです。

unixtime(TTL)のように(TTL)が付いています。

レコードにカーソルを合わせると下記となっており、削除時間(設定したunixtimeの値)が見えました。

あとは、待ちます。

どうなったか

2019/2/21 10:07

id:1(2019/02/21 00:00:00)のデータが消えました。

2019/2/21 12:56

id:2(2019/02/21 12:00:00)のデータが消えました。

2019/2/22 9:30

id:3(2019/02/22 00:00:00)のデータが消えました。

2019/2/22 12:17

id:4(2019/02/22 12:00:00)のデータが消えました。

さいごに

これは便利ですね。プライベートで運用しているサーバーレスなシステムにも適用しようと思います!!

参考