← ハンズオン一覧に戻る

AWS Hands-on / Database

期限が来たデータを、自分で消さずに任せる

DynamoDB の TTL(Time to Live)機能を使い、一時的なデータに「有効期限」を設定します。期限が過ぎた項目が、削除の操作をしなくても自動的に消えていく様子を確認します。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 30〜45 分 コンソールのみで完結
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須DynamoDB でテーブルを作成し、項目を出し入れした経験があること
  • あると良い「UNIX タイムスタンプ」(基準日からの経過秒数で時刻を表す形式)という言葉を聞いたことがある

※ コマンドラインや SSH などの操作は一切ありません。自動削除の確認には、数分〜1 時間程度の時間差をおく必要がある点に注意してください。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

一時的なログイン情報や、キャンペーンの期限付きクーポンなど、「いつか自動的に消えてほしい」データがあります。毎回プログラムで「期限切れのデータを探して消す」処理を書くのは手間ですし、消し忘れるとデータが溜まり続けてしまいます。

DynamoDB の TTL(Time to Live、有効期限)を使うと、項目ごとに「有効期限(時刻)」を属性として持たせるだけで、期限が過ぎた項目を自動的に削除してくれます。今回は、実際にこの仕組みを使って、データが自然に消えていく様子を確認します。

期限が来た瞬間にすぐ消えるの?

いいえ、必ずしも即時ではありません。TTL による削除は、期限が過ぎたあとバックグラウンドで処理されるため、実際に消えるまでに多少の時間差(数分〜48 時間程度)が生じることがあります。厳密なタイミングでの削除が必要な処理には向きません。

有効期限はどんな形式で指定するの?

UNIX タイムスタンプ(1970 年 1 月 1 日からの経過秒数)の数値で指定します。日付や時刻をそのまま文字列で入れるのではない点に注意が必要です。

Goal

TTL 属性を設定したテーブルに、近い将来の時刻を有効期限として持つ項目と、遠い将来の時刻を持つ項目を登録し、時間が経過したあとに前者だけが自動的に削除されていることを確認する。

04 — Architecture

つくる構成

今回は構成図ではなく、TTL の中心となる「UNIX タイムスタンプ」の考え方と、データが消えるまでの時間の流れをイメージで確認します。

UNIX タイムスタンプとは

1970 年 1 月 1 日 0 時(協定世界時)を基準(0)として、そこから何秒経過したかを表す数値です。例えば 2024 年 1 月 1 日 0 時(協定世界時)は 1704067200 という数値になります。日付や時刻の文字列を直接入れるのではなく、この数値に変換してから使います。

変換には、ブラウザで検索できるオンラインの UNIX タイムスタンプ変換ツールを使うと便利です。

時間の流れのイメージ

  1. 項目を登録する

    「数分後」の時刻と「数時間後」の時刻を、それぞれ ExpireAt(例)属性に持つ 2 件の項目を登録します。登録した時点では、どちらの項目も一覧に表示されています。

  2. 「数分後」の期限が経過する

    現在時刻が「数分後」に設定した有効期限を過ぎます。この時点ではまだ、バックグラウンドでの削除処理が行われていない可能性があります。

  3. バックグラウンドで削除される

    期限が過ぎてから、数分〜最大 48 時間程度のうちに、DynamoDB が自動的にその項目を削除します。「数時間後」の項目は、まだ有効期限が来ていないため残り続けます。

05 — Requirements

要件

以下の要件を満たし、TTL によって項目が自動的に削除されることを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2パーティションキーを持つテーブルを 1 つ作成する(テーブル名・パーティションキー名は自由、例:テーブル名 TempSessions、パーティションキー名 SessionId)。
3テーブルの「TTL」を有効化し、有効期限を表す属性名を決める(例:ExpireAt)。
4「数分後」の時刻と「数時間後」の時刻を UNIX タイムスタンプに変換し、それぞれを ExpireAt 属性に持つ項目を 1 件ずつ登録する(オンラインの UNIX タイムスタンプ変換ツールを利用する)。
5数分〜1 時間程度待ったあと、「数分後」の項目が一覧から自動的に消えていることを確認する。「数時間後」の項目はまだ残っていることも確認する。
06 — Steps

構築の進め方

「テーブルを作る → TTL を有効化する → 期限付きの項目を登録する → 時間を置いて確認する」という順番で進みます。

  1. マネジメントコンソールにサインインし、リージョンを東京に合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  2. DynamoDB コンソールでテーブルを作成する

    DynamoDB コンソールを開き、「テーブルを作成」からテーブルを作成します。テーブル名・パーティションキー名は自由に決めてください(例:TempSessions / SessionId)。

    設定はシンプルでよい

    ソートキーや細かい容量設定は今回は不要です。デフォルトの設定のまま作成して構いません。

  3. TTL を有効化する

    作成したテーブルの詳細画面で、「追加設定」または「TTL」のタブを開き、TTL を有効化します。有効期限を表す属性名を決めて入力します(例:ExpireAt)。

    属性名はまだ存在しなくてよい

    この時点では、テーブルにその属性を持つ項目はまだ 1 件もありません。あとから登録する項目に、ここで決めた属性名と同じ名前で値を入れることで、TTL の対象になります。

  4. 現在時刻から「数分後」「数時間後」の UNIX タイムスタンプを求める

    手元のブラウザでタイムスタンプ変換ツールを検索して使い、現在時刻から数分後の時刻と、数時間後の時刻を、それぞれ UNIX タイムスタンプ(秒)に変換します。

  5. 2 件の項目を登録する

    「項目を作成」から、パーティションキーの値と、ExpireAt 属性(数値型、手順 4 で得たタイムスタンプ)を持つ項目を 2 件登録します。1 件は「数分後」の値、もう 1 件は「数時間後」の値を入れます。

    属性の型に注意

    ExpireAt の値を入力するとき、型を「数値(N)」に設定してください。文字列型のままだと TTL の対象として認識されません。

  6. 時間を置いて、項目の一覧を確認する

    数分〜1 時間ほど経過したあと、「項目を探索」で一覧を更新します。「数分後」の項目が一覧から消えていること、「数時間後」の項目はまだ残っていることを確認します。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — 待っても項目が消えない

「数分後の項目が、1 時間経っても残っている」

TTL による削除は即時ではなく、期限が過ぎたあとバックグラウンドで処理されるため、数分〜48 時間程度のばらつきが生じることがあります。すぐに消えなくても異常ではありません。気長に確認し、しばらく時間を置いてから一覧を再読み込みしてみましょう。

Pitfall 02 — TTL が機能しない

「いつまでも 2 件とも消えない」

ExpireAt 属性を登録するとき、型をよく見直してみましょう。TTL の対象になる属性は数値型(UNIX タイムスタンプの秒)である必要があります。文字列型で登録してしまっていないか確認してください。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。DynamoDB コンソールを開いて、次を順に確かめましょう。

  • テーブルの「TTL」タブで、TTL が有効化されており、設定した属性名(例:ExpireAt)が表示されている。
  • 項目を登録した直後は、「項目を探索」の一覧に 2 件の項目が表示されている。
  • 時間経過後に一覧を更新すると、「数分後」の値を持つ項目が一覧から消えている。
  • 「数時間後」の値を持つ項目は、まだ一覧に残っている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. TTL による削除が即時ではないことは、どんな用途には向いていて、どんな用途には向いていないでしょうか。
    ヒント
    「いつかは消えてほしいが、消えるタイミングが多少ずれても困らない」データと、「期限の瞬間に厳密に処理を行いたい」データを比べてみましょう。一時的なセッション情報やキャッシュと、決済の締め切りのような処理を例に考えてみると分かりやすいです。
  2. アプリケーションのコードで毎回「期限切れのデータを探して消す」処理を書く方法と比べて、TTL を使う方法はどんな点で楽になるでしょうか。
    ヒント
    定期的に実行するバッチ処理や、それを動かすための仕組み(スケジューラーなど)を自分で用意し、削除のロジックを書いて保守し続ける必要があるかどうかを比べてみましょう。誰が「探して消す」作業を担当しているかに注目してください。
  3. もし ExpireAt 属性に過去の時刻(すでに過ぎた時刻)を入れて項目を作ったら、その項目はどうなりそうでしょうか。
    ヒント
    TTL は「現在時刻が属性の値を過ぎているかどうか」を基準に削除対象を判断します。登録した時点ですでに過去の時刻になっている項目は、削除の判断基準においてどう扱われるかを考えてみましょう。
10 — Clean up

後片づけ

確認が終わったら、作成したテーブルを削除して片づけましょう。

  1. 作成したテーブルを削除する:DynamoDB コンソールの「テーブル」一覧から、今回作成したテーブル(例:TempSessions)を選び、削除する。
Caution — 他で使っているテーブルは消さない

削除するのは、このハンズオンで自分が作ったテーブルだけ

テーブルの一覧には、すでに別の用途で使っているテーブルも並んでいるかもしれません。間違えて削除しないよう、このハンズオンのために付けた名前のテーブルだけを選んで削除してください。

コストに関する注意: DynamoDB はオンデマンドモードであれば、使った分だけの課金となり、今回程度の少量の読み書きは無料利用枠の範囲内に収まることが多いです。TTL による削除そのものに追加料金はかかりません。一方で、テーブルを削除せずに放置すると、保存しているデータ量に応じた料金がわずかに発生し続けますので、確認が終わったら後片づけの手順に従ってテーブルを削除することをおすすめします。