TTL

データやキャッシュの有効期限を設定し、自動的に削除・更新する仕組み

キャッシュデータベース

TTL とは

TTL (Time to Live) は、データやパケットに有効期限を設定し、期限切れ後に自動的に削除・無効化する仕組みである。キャッシュ、DNS、データベース、ネットワークなど、ソフトウェアのあらゆる層で使われる基本概念だ。

TTL がなければ、古いデータが永遠に残り続ける。キャッシュは際限なく肥大化し、DNS の変更は伝播せず、セッションは永久に有効になる。TTL はデータの鮮度とリソースの有限性を保証する。

使われる場面と設定値の目安

場面 典型的な TTL 設定場所
ブラウザキャッシュ 1 時間〜1 年 Cache-Control: max-age=3600
CDN キャッシュ 1 分〜24 時間 CloudFront のキャッシュポリシー
DNS レコード 300 秒〜86400 秒 Route 53 のレコード設定
DynamoDB アイテム 1 時間〜90 日 アイテムの TTL 属性
Redis キャッシュ 5 分〜1 時間 SET key value EX 300
JWT トークン 15 分〜1 時間 exp クレーム
セッション 30 分〜24 時間 Cookie の Max-Age

DynamoDB の TTL

DynamoDB の TTL は、アイテムに Unix エポック秒のタイムスタンプ属性を設定し、期限切れアイテムを自動削除する機能だ。削除は非同期で行われ、追加コストはかからない。

// TTL 属性付きでアイテムを保存
const ttl = Math.floor(Date.now() / 1000) + 60 * 60 * 24; // 24時間後

await ddb.send(new PutCommand({
  TableName: 'Sessions',
  Item: {
    sessionId: 'sess-abc123',
    userId: 'user-456',
    expiresAt: ttl,  // TTL 属性 (Unix エポック秒)
  },
}));

注意点: DynamoDB の TTL 削除は「期限切れ後 48 時間以内」に実行される。即座に削除されるわけではないため、クエリ時にも TTL を条件に含めるのが安全だ。

// TTL 切れアイテムを除外するクエリ
const now = Math.floor(Date.now() / 1000);
await ddb.send(new QueryCommand({
  TableName: 'Sessions',
  KeyConditionExpression: 'sessionId = :sid',
  FilterExpression: 'expiresAt > :now',
  ExpressionAttributeValues: { ':sid': sessionId, ':now': now },
}));

CloudFront の TTL

CloudFront のキャッシュ TTL は、オリジンへのリクエスト頻度とコンテンツの鮮度のトレードオフだ。

  • 静的アセット (JS, CSS, 画像): 長い TTL (1 年) + ファイル名にハッシュを含める
  • HTML ページ: 短い TTL (数分〜数時間) またはキャッシュ無効化
  • API レスポンス: TTL 0 (キャッシュしない) または短い TTL
Cache-Control: public, max-age=31536000, immutable  ← 静的アセット
Cache-Control: public, max-age=300                   ← HTML ページ
Cache-Control: no-store                              ← API レスポンス

DNS の TTL

DNS レコードの TTL は、リゾルバがレコードをキャッシュする秒数だ。TTL が長いとキャッシュヒット率が上がるが、レコード変更の反映が遅くなる。

  • 通常運用: 300〜3600 秒
  • 切り替え前: TTL を短く (60 秒) に変更し、反映を待ってから切り替え
  • 切り替え後: 問題なければ TTL を元に戻す

よくある失敗パターン

TTL を設定し忘れる

キャッシュに TTL を設定しないと、古いデータが永遠に返り続ける。「デプロイしたのに変更が反映されない」の原因の大半はキャッシュの TTL 問題だ。

TTL が短すぎる

TTL を 1 秒に設定すると、キャッシュの意味がなくなり、オリジンに負荷が集中する。アクセス頻度とデータの鮮度要件から適切な値を決める。

TTL が長すぎる

TTL を 1 年に設定した HTML ページは、修正をデプロイしてもユーザーに届かない。HTML は短い TTL、静的アセットは長い TTL + ファイル名ハッシュが定石だ。

全体像を把握するには関連書籍も有用。

関連用語