Serverlessスケジューリング:Vercel Cron Jobs実践

このAIと現代Web開発の時代において、私たちはほとんどNext.jsなどのフレームワークを使用してフルスタックサイトを構築し、Vercelプラットフォームにデプロイしています。

以前、Next.jsをVercelにデプロイして「毎日深夜0時にデータベース統計を取る」ようなタスクを実行したい場合、第2章で教えたように自らcron-job.orgに登録してAPIを叩く必要がありました。しかしVercelは開発者の声を受け、今ではネイティブにVercel Cron Jobs機能を提供しています!

Vercel Cron Jobsを使用する利点は:プロジェクトとの深い統合、外部サービス登録不要、強力なセキュリティ保護が標準装備されていることです。

Vercel Cron Jobs実装の3ステップ

Next.js(App Router)でVercel Cronを実装するのは非常に簡単です。通常のAPIエンドポイントを準備し、設定ファイルでVercelにいつ呼び出すかを指示するだけです。

ステップ1:API Routeの作成

まず、Next.jsプロジェクト内にCronjob専用のAPIエンドポイントを作成します。 例:src/app/api/cron/daily-report/route.tsファイルを作成:

import { NextResponse } from 'next/server';

export async function GET(request: Request) {
  // セキュリティチェック(後述のステップで説明)
  const authHeader = request.headers.get('authorization');
  
  // 安全のため、呼び出された時間をログに記録
  console.log(`[Cron Job Triggered] Time: ${new Date().toISOString()}`);

  try {
    // ============================================
    // ここにビジネスロジックを記述!
    // 例:Supabaseから昨日の注文を取得し、Emailレポートを送信
    // await generateAndSendDailyReport();
    // ============================================

    return NextResponse.json(
      { success: true, message: 'Daily report processed successfully' },
      { status: 200 }
    );
  } catch (error) {
    console.error('Cron job error:', error);
    return NextResponse.json(
      { success: false, message: 'Failed to process job' },
      { status: 500 }
    );
  }
}

ステップ2:vercel.json設定ファイルの追加

次に、プロジェクトのルートディレクトリpackage.jsonと同じ階層)にvercel.jsonという名前のファイルを作成します。

このファイルはVercel専用の設定ファイルで、ここにcronスケジュールを宣言します:

{
  "crons": [
    {
      "path": "/api/cron/daily-report",
      "schedule": "0 8 * * *"
    }
  ]
}

この設定は非常に直感的です:

  • path:Vercelに時間になったら呼び出すAPIの相対パスを指定
  • schedule:Crontab構文を使用。ここでは毎朝8時(タイムゾーンはデフォルトでUTCです!台湾時間の朝8時はUTC 0 0 * * *に相当します)

[!TIP] Vercel Hobby(無料版)の制限 無料アカウントの場合、Vercelは1日に最大1回しかCron jobを実行できません(つまり1日1回が上限)。 毎時実���する必要があるスクリプトの場合、Vercel Pro(月額$20)にアップグレードするか、または以前解説したcron-job.orgを使用する必要があります。

ステップ3:セキュリティ保護(CRON_SECRET)

これはVercel Cron Jobsの最も気の利いた機能です!

もしAPI URL(例:/api/cron/daily-report)がネットワーク上に公開されると、誰でもリクエストを送信してレポート生成をトリガーできてしまい、非常に危険です。

この問題を解決するため、Vercelがvercel.jsonを読み取ってCronjobを作成する際、自動的にプロジェクトの環境変数に超複雑なパスワード:CRON_SECRETを注入します。

Vercelが自動的にAPIをトリガーするたびに、HTTP Headerにこのキーが含まれます: Authorization: Bearer <あなたの_CRON_SECRET>

したがって、ステップ1のAPIにこの強固な保護層を追加する必要があります:

import { NextResponse } from 'next/server';

export async function GET(request: Request) {
  // 1. リクエストからAuthorization Headerを取得
  const authHeader = request.headers.get('authorization');
  
  // 2. Vercel環境にCRON_SECRETが設定されていることを確認
  const cronSecret = process.env.CRON_SECRET;
  
  // 3. 厳密な比較!キーが一致しない場合、直ちにアクセス拒否
  if (!cronSecret || authHeader !== `Bearer ${cronSecret}`) {
    return NextResponse.json(
      { success: false, message: 'Unauthorized Request' },
      { status: 401 }
    );
  }

  // 4. キーが正しい場合、コアロジックの実行を許可
  console.log("認証成功、スケジュールタスクを開始...");
  
  return NextResponse.json({ success: true });
}

テストと本番環境への展開

コードをGitHubにプッシュし、Vercelが自動デプロイを完了したら、Vercelのプロジェクトダッシュボードにアクセスできます。

上部メニューの**"Settings"** → 左側の**"Cron Jobs"をクリック。 ここでは、vercel.jsonで設定したタスクリストが表示されます。Vercelは親切にも"Run"**という手動テストボタンを提供しており、クリックするとすぐにAPIをトリガーできるので、CRON_SECRETが正しく機能しているかテストできます!

Vercel Cron Jobsを使用すれば、シンプルな設定ファイル一つで、銀行レベルのセキュリティ保護を備えたフルスタック自動化サービスを構築できます!

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!