Cronによる自動失効とアクセス制御

定期実行で期限切れを検知して非公開化する処理と、失効後アクセスの扱い

Cron自動失効アクセス制御定期実行Vercel
読了時間: 8分

はじめに

有効期限を設定しただけでは、コンテンツは自動では消えません。「期限が来たかどうかを誰かが見張り、時が来たら非公開にする」——この見張り役が必要です。
その役割を、私はVercel Cron(定期実行の仕組み)に任せました。

この記事では、Cronがどうやって期限切れコンテンツを検知し、非公開化するのか。そして失効したページにアクセスが来たとき、何を返すべきなのか。この2つの話を掘り下げます。
「自動で失効する」という体験の裏側で、地味だけど大事な処理が動いています。その全体像を、実装の勘所とあわせて共有します。

Cronによる失効処理

日次実行の設計

失効チェックのCronは、日次(1日1回)で回しています。
キャンペーンやイベントの期限は「◯月◯日まで」という日単位がほとんどで、分単位の即時性は求められません。だから毎分チェックするような高頻度は不要で、1日1回で十分なんです。
実行頻度を上げれば、その分だけ実行回数や監視の手間、コストも増えます。要件に対して過剰にならない頻度を選ぶ——この見極めが、無理のない運用につながります。厳密な即時失効が要る場合だけ、KVのTTLを併用すれば足ります。

Cron失効処理の流れ
Cronが起動

Vercel Cronが日次のスケジュールで失効処理を呼び出す

対象を洗い出す

KVからコンテンツ一覧を取得し、有効期限(expiresAt)を現在時刻と比較

期限切れを非公開化

期限を過ぎたものの公開フラグを下ろす、またはTTLで消滅させる

結果を記録

何を失効させたかをログに残し、後から追跡できるようにする

期限切れの検知ロジック

検知そのものは、拍子抜けするほどシンプルです。
KVに保存された各コンテンツの expiresAt を、現在時刻と比べるだけ。「expiresAt < 今」なら期限切れ、と判定して非公開化の対象に加えます。有効期限をデータ自身が持っているおかげで、判定ロジックが一箇所にまとまるんです。
一覧の取得には、ストレージ側で用意したslugのインデックスを使います。全件を舐めても件数が知れているので、パフォーマンスの心配はほぼありません。素直なつくりが、そのまま保守のしやすさになります。

冪等性を意識する

Cron処理を書くときに私が気をつけているのが、**冪等性(べきとうせい)**です。
これは「同じ処理を何回実行しても、結果が同じになる」という性質のこと。Cronは稀に二重起動したり、途中で失敗して再実行されたりします。そのとき、すでに失効済みのものをもう一度失効させても、おかしなことが起きてはいけません。
「期限切れなら非公開にする」という処理は、もともと何度やっても結果が変わらないので冪等です。この性質を保っておくと、リトライやエラー時の挙動を安心して設計できます。

失効後のアクセス制御

404を返すか、案内を出すか

期限切れのページにアクセスが来たとき、選択肢は大きく2つです。
ひとつは404(ページが存在しない)を返すこと。もうひとつは「このページは公開を終了しました」という案内ページを見せることです。どちらが良いかは、コンテンツの性格によります。
完全に使い捨ての内部向けURLなら404で十分ですが、SNSで拡散されたキャンペーンLPのように、後から善意でクリックされるURLは、案内を出すほうが親切ですよね。失効=即404、と決めつけず、体験まで含めて設計するのがおすすめです。

表示時の二重チェック

Cronは日次実行なので、「期限を過ぎてから、次のCronが回るまで」のわずかな隙間が生まれます。
この隙間に古いページが表示されてしまわないよう、公開ページ側でも表示のたびに有効期限を確認しています。KVからデータを取ってきた瞬間に expiresAt を現在時刻と比べ、過ぎていればその場で失効扱いにするわけです。
Cronは「まとめて掃除する係」、表示時チェックは「その場で判断する係」。この二段構えにしておくと、失効のタイミングに穴が空きません。念のための守りが、信頼性を底上げしてくれます。

アクセス制御と組み合わせる

一時ページの中には、そもそも公開範囲を絞りたいものもあります。
たとえば取引先だけに見せたい資料や、社内向けの一時共有など。こうしたケースでは、有効期限による失効に加えて、推測されにくいslug(URL)を使ったり、簡易な閲覧制限をかけたりして、アクセスそのものを制御します。
「期限で消える」と「限られた人だけが見られる」は、別々の仕組みですが、組み合わせると使い勝手が広がります。期限切れと未公開、どちらのケースでも安全側に倒す設計にしておくと安心です。

まとめ

Cronによる自動失効は、「期限を見張り、非公開にする」という単純な仕事を、人の代わりに黙々とこなしてくれる仕組みです。ポイントは、要件に見合った日次実行、冪等な処理、そして表示時の二重チェックでした。

そして忘れてはいけないのが、失効した後の見せ方です。404で切り捨てるのか、丁寧に案内を出すのか——ここまで含めて設計すると、お客様に不親切な思いをさせずに済みます。

このCronが失効させるデータの持ち方は「KVストレージによる一時コンテンツ管理」で解説しています。また、こうした仕組みがどんな場面で活きるのかは「使い捨てURLの活用シーン」で紹介しています。全体像はハブ記事「期限付きコンテンツの自動失効」からどうぞ。