【vercel】Cron Jobs使ってみた
投稿日: 2025年01月07日
定期実行するためのCron Job、色んなサービスで提供されているようですが今回はvercelのCron Jobsを使ってみました。
やること自体は簡単なのですが、よく読まないとミスっちゃいそうだなと思うことがいくつかあったので、そのあたりを中心にまとめてみます。
個人開発第一弾のSleep便利なアプリであることは自信もって言えるのですが、ベビーの月齢14ヶ月頃になってくると昼寝の回数が2~1回に減ってくる子が多く、時間が決まってくるので次の寝かしつけ時刻の算出という機能は必要なくなってきます。
我が子も当然同じことで現在19カ月でずいぶん前から睡眠記録付ける必要なくなってきています。
頑張って作ったのですがもう不要・・でも実際に使ってくださっている方がいらっしゃるので公開しておきたいですし、ゲストログイン機能を作っていて我が子の睡眠記録を見れるようにしていたのです。
なのに私が記録つけるの辞めたらゲストログインされた方が睡眠時間300時間とかそんな数値を目にすることになり、登録をサボっているのか、バグなのかわからず使いたいという気にもならないと思います。
でも、つけなくていい記録を毎日するのも手間なのでその処理を今回は自動化することにしました。
Cron Jobは、指定した時間に自動的に特定の処理を実行するための仕組みです。
例えば、毎日決まった時間にデータをバックアップしたり、定期的にメールを送信したりする場合に使われるようです。
以前、github Actionsで定期的に指定した処理を実行する方法は記事にしました。
この時はvercelのCron Jobsがhobbyプランだと1日1回しか実行できないためgithub Actionsをつかったのですが、今回は1日1回の実行で良いのでvercelのCron Jobsを使ってみました。
公式詳しく書いてありますので読みながらやりました。
よく読んでなくてPOSTメソッドで書いていたので最初の実行は405エラーになっていました。
気を付けて下さい。
ただここで私が気になったのが、以前私がハマったGETリクエストだとキャッシュが返ってきて中の処理が実行されないという点です。
めちゃくちゃ時間溶かしたのでGETで大丈夫なん??登録したいんやけど大丈夫なん?って警戒しまくりました。
公式のサンプルコードにこれがポイントなのでは??ということを見つけました。
export const dynamic = 'force-dynamic'; // static by default, unless reading the request
export function GET(request: Request) {
return new Response(`Hello from ${process.env.VERCEL_REGION}`);
}
最初のこの記述です。
export const dynamic = 'force-dynamic';
ページの動的な動作を完全に静的または完全に動的に変更するための記述です。
Next.jsではデフォルトが'force-dynamic'ではなく'auto’になっており、autoは可能な限りキャッシュするようになっています。
'force-dynamic'を指定することによりキャッシュせずに毎回処理が実行されるようになるのだと思います。
環境変数にCRON_SECRET
を設定しておく必要があります。
少なくとも 16 文字のランダムな文字列が推奨されています。
この値は、vercel側が処理を実行する際にheaderに自動的に設定してくれるので、その値で認可処理を入れておけばOKです。
import type { NextRequest } from 'next/server';
export function GET(request: NextRequest) {
const authHeader = request.headers.get('authorization');
if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) {
return new Response('Unauthorized', {
status: 401,
});
}
return Response.json({ success: true });
}
公式のサンプルコードがそのまま使えちゃう感じでありがたいです。。
上記以外が普通にしたい処理を書けばOKです。簡単♪
実行するエンドポイントと実行スケジュールの定義をします。
この時刻はUTCなので9時間の時差を考慮して記述する必要があります。
{
"crons": [
{
"path": "/api/hoge",
"schedule": "0 5 * * *"
}
]
}
私は毎日7時ごろ(hobbyプランは7時~7時59分の間に実行されます)がいいかなと思ったので、
"schedule": "0 22 * * *"
で設定しました。
この内容でデプロイするとProject→Settings→Cron Jobsで設定できていることが確認できます!
いくつかポイントさえ押さえておけば簡単に設定できると感じました。
Github Actionsはメソッドも自由だったのですが、vercelはGETのみだったり、LINE Messaging APIのwebhookはPOSTのみだったり公式よく読まないといけないなと思いました。
Next.jsは進化も激しいイメージがあるので、ネットの二次情報やAIより公式が一番頼れる存在だなと思います。
必要そうなところだけ探して読みがちなのですが、そのせいでGETリクエストのみだと気付かなかったりしたので、そのセクションは全体一度読む癖付けたい。。。って思います。(前も同じこと言ったようなw)