仕組み: DynamoDB の有効期限 (TTL) - Amazon DynamoDB

仕組み: DynamoDB の有効期限 (TTL)

DynamoDB テーブルで TTL を有効にする場合、項目が有効期限切れになるかどうかを判断するときにサービスが検索する特定の属性名を指定する必要があります。テーブルで TTL を有効にすると、パーティションごとのスキャナーのバックグラウンド処理によって、テーブル内の項目の有効期限ステータスが自動的かつ継続的に評価されます。

スキャナーのバックグラウンド処理では、Unix エポック時間形式の現在の時刻を、項目のユーザー定義属性に保存されている値と単位で比較します。属性が Number データ型の場合、属性の値は Unix エポック時間形式のタイムスタンプ (単位) であり、タイムスタンプ値は現在の時刻より古くても 5 年以上前ではない場合 (TTL 値の形式が正しくないことを原因に誤って削除される可能性を回避するため)、項目は有効期限切れに設定されます。TTL 属性のフォーマットの詳細については、項目の TTL 属性のフォーマット を参照してください。2 番目のバックグラウンドプロセスでは、期限切れの項目をスキャンして削除します。どちらのプロセスもバックグラウンドで自動的に実行され、テーブルへの読み取りまたは書き込みトラフィックに影響を与えることはなく、金銭的なコストも発生しません。

項目がテーブルから削除されると、2 つのバックグラウンドオペレーションが同時に実行されます。

  • 項目は、DeleteItem オペレーションと同じ方法で、ローカルセカンダリインデックスおよびグローバルセカンダリインデックスから削除されます。

  • 各項目の削除オペレーションは DynamoDB ストリームに入りますが、通常の削除ではなく、システム削除のタグが付けられます。このシステム削除の使用方法の詳細については、「DynamoDB ストリームと Time to Live」を参照してください。

重要
  • テーブルのサイズとアクティビティレベルによっては、期限切れの項目の実際の削除オペレーションが異なる場合があります。TTL はバックグラウンドプロセスであることを意図しているため、TTL を介して項目の有効期限切れや削除に使用される容量の性質は可変です (無料)。通常、TTL は期限が切れた項目を期限切れから 48 時間以内に削除します。

  • 有効期限が切れているものの、TTL によってまだ削除されていない項目は、読み取り、クエリ、およびスキャンに表示されます。結果セットが期限切れの項目を含まないようにする場合には、除外する必要があります。そのためには、Time to Live の有効期限の値が現在の時間 (エポック形式) よりも大きい場合にのみ項目を返すフィルタ式を使用します。詳細については、「」を参照してくださいScan のフィルタ式

  • 有効期限を過ぎたものの、まだ削除されていない項目は更新でき、有効期限属性を変更または削除するための正常な更新が適用されます。

テーブルの CloudWatch メトリクスタブで TTL レートをモニタリングし、項目が削除されるタイミングとレートを確認できます。


            TTL と CloudWatch を示すコンソールのスクリーンショット。

有効期限 (TTL) の例

たとえば、ユーザーのセッション履歴を追跡する SessionData という名前のテーブルについて考えてみます。SessionData の各項目は、パーティションキー (UserName) とソートキー (SessionId) によって識別されます。UserNameSessionIdCreationTimeExpirationTime といった追加の属性はセッション情報を追跡します。ExpirationTime 属性は、テーブルの TTL 属性として設定されます (一部表示されていない各項目の属性もあります)。

SessionData
ユーザーネーム SessionId CreationTime ExpirationTime (TTL) SessionInfo
user1 74686572652773 1571820360 1571827560 {JSON ドキュメント} ...
user2 6e6f7468696e67 1571820180 1571827380 {JSON ドキュメント} ...
user3 746f2073656520 1571820923 1571828123 {JSON ドキュメント} ...
user4 68657265212121 1571820683 1571827883 {JSON ドキュメント}
user5 6e6572642e2e2e 1571820743 1571831543 {JSON ドキュメント} ...
... ... ... ... ...

この例で、各項目には作成時に設定される ExpirationTime 属性値があります。次のテーブルの項目を考慮します。

SessionData
ユーザーネーム SessionId CreationTime ExpirationTime (TTL) SessionInfo
user1 74686572652773 1571820360 1571827560 {JSON ドキュメント} ...

この例では、項目 CreationTime は 2019 年 10 月 23 日、水曜日、午前 08:46 (UTC) に設定され、ExpirationTime は 2 時間後の、2019 年 10 月 23 日、水曜日、午前 10:46 (UTC) に設定されます。現在の時刻 (エポック形式) が ExpirationTime 属性の時間よりも大きくなると、項目が期限切れになります。この場合、キー { Username: user1, SessionId: 74686572652773} を持つ項目は午前 10:46 (1571827560) を経過すると期限切れになります。