Cronによる自動失効とアクセス制御 — 期限を見張って非公開にする

定期実行で期限切れのページを見つけて非公開にする流れと、失効後にアクセスが来たときの返し方

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

はじめに

有効期限を入力しただけでは、ページは自動で消えません。「期限が来たかどうかを誰かが見張り、時が来たら非公開にする」という役目を、別に用意する必要があります。その見張り役を任せたのが、Vercel Cron(決めた時刻になると処理を自動で呼び出してくれる、定期実行の仕組み)です。

この記事では、その定期実行が期限切れのページをどうやって見つけ、どう非公開にしているのかを説明します。あわせて、失効したページにアクセスが来たときに何を返すべきかも扱います。自動で消えるという体験の裏側では、目立たないけれど大事な処理が動いています。運用の判断に直結する部分なので、頻度の決め方から順に見ていきましょう。

期限を見張る定期実行をどう組んだか

1日1回のチェックで足りると判断した理由

失効チェックの定期実行は、1日1回にしています。キャンペーンやイベントの期限は「◯月◯日まで」という日単位がほとんどで、分単位の正確さを求められる場面はまずありません。設定としては、毎日決まった時刻に処理を呼び出してほしい、という指定を書いておくだけです。

頻度を上げれば、そのぶん実行の回数も、動いているかを確認する手間も、費用も増えます。要件に対して過剰にならない頻度を選ぶのは、仕組みを軽く保つための判断のうち。秒単位で確実に止めたいコンテンツがあるときだけ、保存時に寿命を指定して自動削除する方式を併用すれば足ります。

定期実行が失効させるまでの流れ
決まった時刻に起動する

毎日1回、設定した時刻に失効処理が自動で呼び出される

対象を洗い出す

保存してあるコンテンツの一覧を取り出し、それぞれの有効期限を今の時刻と比べる

期限切れを非公開にする

期限を過ぎているものは公開の目印を外す。消してよいものはそのまま削除する

結果を記録する

何をいつ失効させたかを残し、あとから追いかけられるようにする

図の流れを一言でいうと、毎日決まった時刻に全件を見比べて、期限を過ぎたものだけ公開を止め、その記録を残している、ということです。

期限切れの判断は、日時を比べるだけ

判断そのものは拍子抜けするほど単純です。保存してある各ページの有効期限を、今の時刻と比べる。期限のほうが過去なら失効、それだけです。有効期限をデータ自身が持っているおかげで、判断のルールが一箇所にまとまります。

一覧の取り出しには、保存側で用意しておいたslugの索引を使います。全件を順に見ていく形ですが、一時ページの件数はたかが知れているので、速度の心配はほとんどありません。凝った工夫を入れないぶん、あとから読んでも何をしているか分かる状態を保てます。

何度動いても結果が変わらないようにしておく

定期実行の処理を組むときに気をつけているのが、同じ処理を何回実行しても結果が同じになるようにしておくことです。専門的には冪等性(べきとうせい)と呼ばれる性質ですが、名前は覚えなくても構いません。

定期実行はまれに二重で起動したり、途中で失敗して自動でやり直されたりします。そのとき、すでに失効済みのものをもう一度失効させて、おかしなことが起きては困ります。「期限を過ぎていたら公開を止める」という処理は、もともと何度やっても結果が変わらない形なので、この性質を満たしています。ここを崩さずに作っておくと、やり直しやエラー時の動きを安心して設計できます。

失効した後、ユーザーに何を見せるか

404で終わらせるか、案内を出すか

期限切れのページにアクセスが来たとき、選択肢は大きく2つです。404(そのページは存在しない、という応答)を返すか、「このページは公開を終了しました」という案内を見せるか。どちらが適切かは、そのコンテンツの性格で決まります。

社内向けの完全な使い捨てURLなら404で十分です。ただ、SNSで拡散されたキャンペーンページのように、終了後も善意でクリックされるURLは、案内を出したほうが親切ですよね。失効イコール即404と決めつけず、終わり方まで含めて決めておくと、無用な戸惑いを減らせます。

表の要点は、そのURLが外部に出回っているかどうかで、返すべきものが変わるということです。

表示のたびに、もう一度期限を確かめる

定期実行は1日1回なので、「期限を過ぎてから、次の実行が回るまで」のあいだに時間の隙間ができます。この隙間に古いページが見えてしまわないよう、公開ページ側でも表示のたびに有効期限を確認しています。

データを取り出した直後に期限と今の時刻を比べ、過ぎていればその場で失効扱いにする。定期実行はまとめて片付ける係、表示時のチェックはその場で判断する係、という二段構えです。念のための確認を一枚挟んでおくだけで、失効のタイミングに穴が空かなくなります。

「期限で消える」と「限られた人だけが見られる」を組み合わせる

一時ページの中には、そもそも見せる相手を絞りたいものもあります。取引先だけに渡す資料や、社内向けの一時共有などがそれにあたります。こうしたケースでは、有効期限による失効に加えて、推測されにくいslugを使ったり、簡単な閲覧制限をかけたりして、アクセスそのものを制御します。

期限で消えることと、限られた人だけが見られることは、別々の仕組みです。ただ、組み合わせると使える場面がぐっと広がります。期限切れのときも、まだ公開していないときも、どちらも安全な側に倒れるように作っておくと安心です。

まとめ

定期実行による自動失効は、期限を見張って非公開にするという単純な仕事を、人の代わりに毎日こなしてくれる仕組みです。押さえるところは、要件に見合った1日1回という頻度、何度動いても結果が変わらない処理、そして表示のたびの二重チェック。この3つが揃えば、消し忘れによる表示のずれはほぼ起きなくなります。

そして忘れずに決めておきたいのが、失効した後の見せ方です。404で切り上げるのか、案内を出して次の行き先を示すのか。ここまで含めて決めておくと、終了後にアクセスしたユーザーにも不親切な思いをさせずに済みます。

この定期実行が見張るデータの持ち方や、実際にどんな場面で活きるのかは、次の記事で扱っています。