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 + ファイル名ハッシュが定石だ。
全体像を把握するには関連書籍も有用。