はるさめ.dev

Vercel の Cron Jobs で定期実行する

投稿日:Sat Jan 27 2024 08:56:32 GMT+0000 (Coordinated Universal Time)

設定方法

Vercel では API を定期実行する事ができる Cron Jobs という機能が提供されていています。
設定方法は簡単でプロジェクトルートに verce.json ファイルを作成し、以下のような設定ファイルを書くだけ。

{
  "crons": [
    {
      "path": "/api/cron1",
      "schedule": "0 5 * * *"
    },
    {
      "path": "/api/cron2",
      "schedule": "0 6 * * *"
    }
  ]
}

path には API を設定し、 schedule には cron 形式でスケジュールを設定してデプロイすると定期実行されるようになります。
cron 形式のスケジュール作成には crontab guru がおすすめ。

なお、以下の点は注意が必要です。

  • path は / から始まること
  • スケジュールは常に UTC 時刻で実行される(設定で JST とかに変更できない)
  • 定期実行は production でのみ実行される

セキュリティー

API に保護をかけないと外部から勝手に呼び出し放題になってしまうので、Cron Jobs からのみ API をセキュアに実行する方法が用意されています。

Vercel > 対象のプロジェクト > Settings > Environment VariablesCRON_TOKEN という環境変数にトークンを設定すると Cron Jobs が API を実行する際に authorization ヘッダーにトークンを設定して呼び出してくれるので API 側でauthorization ヘッダーと設定したトークンが一致するかを確認するだけです。

なお、以下の例は next.js app router の例ですが、基本的には他のフレームワークでも同じです。

import type { NextRequest } from 'next/server';
 
export function GET(request: NextRequest) {
  const authHeader = request.headers.get('authorization');

  // ※ authorization ヘッダーには “Bearer ” がプレフィクスにつくことに注意
  if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) { 
    return new Response('Unauthorized', {
      status: 401,
    });
  }
 
  return Response.json({ success: true });
}

あとがき

少し前まではセキュリティー機能がなく、 searchParams にトークンを設定する方法が紹介されていたので、プライベートなリポジトリでしか使いづらい機能でしたが、セキュリティー機能が実装されたことでかなり使いやすくなりました。Web サービスでは定期実行したいケースはよくあると思いますが、外部のサービスを利用すること無く Vercel で完結できるようになったのはとても嬉しいですね。 Vercel 使い倒していきましょう!

参考

コメント