1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Vercelでcronジョブを作成する方法

1
Last updated at Posted at 2026-03-24

Vercel便利ですよね~。
なによりアプリエンジニアとしては、デプロイが超楽なので最高です。

そんな中、Vercelでcronジョブを組む方法です。

cronジョブの解説・補足事項

cronジョブとは?

cronジョブは定期的なスケジュールでスクリプトやAPI、実行ファイルなどを動作してくれるものです。
このスケジュールについては

  • 毎日のh時
  • m分間隔
  • d日とd日
  • 毎週d曜日

以上のような形で実行できるので、非常に便利です。
Vercel環境では対象のAppに組み込まれてるAPIを実行してくれるものとなります。

無料版は制限あり!
VercelのHobbyプランでは満足に利用できないので、その点だけ注意してください。

コーディング

APIとして記述するので、Webアプリを作成するようにAPIのRouteを作成します。
この辺は要領がほぼ変わらないのでいいですね~。

コーディング:認証

とはいえAPIとして公開されてる以上、外部からKickできるものは防がないといけません。
ぼくはこのような形でコーディングしました。

/lib/cron-helper.ts
import crypto from 'crypto';

const forbidden = (res: NextApiResponse) => {
  res.status(403).end();
  return false;  
}

export const isAuthencicationByCron = (req: NextApiRequest, res: NextApiResponse) => {
  if (process.env.MODE !== 'production') return true;

  // Authorizationの存在チェック
  if (req.headers.authorization == null || req.headers.authorization === '') {
    return forbidden(res);
  }

  // Bearer Tokenの存在・認証チェック
  const [bearer, token] = req.headers.authorization.split(' ');
  if (bearer !== 'Bearer') return forbidden(res);

  // TOKENの一致チェック&タイミング攻撃対策
  if (!crypto.timingSafeEqual(
    Buffer.from(token),
    Buffer.from(process.env.CRON_SECRET ?? ''),
  )) {
    return forbidden(res);
  }
  return true;
}

isAuthencicationByCron trueを返却したものを正常処理として判定します。

コーディング:実装部分

実装部分はこのような形。今回はPage Routerで組んでいますので、App Routerの場合は適時それに対応した形で修正してください。

/api/cron.ts

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse,
) {
  if (!isAuthencicationByCron(req, res)) {
    return;
  }
  // 処理・・・
  // ここからお好きな処理を実施してください。

  // 最後はきちんと200を返さないとダメ🙅
  res.status(200);
  res.end();

コーディング:cron設定

こちらがVercel上でKICKするAPIができました。
これからcronの設定を実施していきます。

vercel.json
{
  "crons": [
    {
      "path": "/api/cron",
      "schedule": "0 10 * * 1-5"
    }
  ]
}

配列なので、複数ジョブを設定できるのがいいですね。
cronは限定的なORしか使用できないので、複雑になった際は別のオブジェクトを追加しましょう。
同一のAPIも設定できますので、便利です。

pathはAPIのパス、scheduleはcronジョブを設定します。

cronジョブの読み方や変換はツールを使いましょう。
ChatGPTなどに聞いてもいいですが、ぼくはこのツールを古くから使用しています。
(覚える為に使ってますが、一向に覚えられない)

0 10 * * 1-5これだと平日(月~金)の19時になります。(VercelはUTCなので-9時間計算)

設定できたらVercelにデプロイしましょう。

Vercel側の設定

cronの設定

これもめちゃ簡単です。

スクリーンショット 2026-03-19 150546.png

添付のように表示されていればOKです。
Enabledにチェックが入ってなければONにしてあげる必要があります。

また、cronの設定が意図しないものになっていればこの画面でチェックができます。

環境変数設定

環境変数の設定も楽です。

スクリーンショット 2026-03-19 151233.png

先程の実装の際に使用した環境変数のCRON_SECRETをセットしてあげるだけです。
このシークレットは外部に漏らさないような対策が必須となります。

さいごに

よく忘れてしまうので、備忘録として記載しました。
非常に便利なcronが簡単にできるのはいいですね。皆さんもぜひ使ってみてください。


オブジェクティブグループではXの投稿も平日毎日行っています!
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?