Zenn

Vercel Cron Jobを使ったDifyの定期実行

2025/03/23に公開

はじめに

こんにちは。プログラミング未経験の非エンジニアけんてぃと申します。
今回初投稿です。記事の執筆はClaude 3.7 sonnetにお任せしておりますので、ご指摘等あればお気軽に賜れましたら幸いです。

AIアシスタントを活用したワークフローが増えてきた昨今、それらを定期的に実行して情報を自動収集したいというニーズが高まっています。特にDifyで構築したワークフローを定期的に実行して、最新情報を自動的に取得したいというケースは多いのではないでしょうか。

公式スケジューラーとの比較

Dify公式ドキュメントには「Difyスケジューラーの構築」という公式ツールが紹介されています。本記事で紹介する「Dify Scheduler」との主な違いは以下の通りです:

機能 公式Difyスケジューラー 本記事のDify Scheduler
実行環境 GitHub Actions / QingLongパネル Vercel (サーバーレス)
通知機能 複数対応(WeChat, Email, DingTalk, Feishu等) Dify設定の連携先に依存
設定方法 GitHub Secrets / 環境変数 設定ファイル + 環境変数
認証 APIキー(DIFY_TOKENS) APIキー(DIFY_API_KEY)
複数ワークフロー 対応 対応
主な特徴 マルチチャンネル通知、中国向けサービス対応 Next.js/Vercel統合、Edge Runtime

公式スケジューラーはWeChat、DingTalk、Feishuなど中国の主要サービスにも対応していますが、本記事のDify Schedulerは主にVercelプラットフォームを活用したシンプルな設計を特徴としています。実際の運用環境や通知要件に応じて、最適な方を選択することをお勧めします。

そこで今回は、Vercel Cron Jobsを使ってDifyのワークフローを定期的に実行できる「Dify Scheduler」を開発しました。このシステムを使えば、複数のワークフローを異なるスケジュールで自動実行し、結果をSlackやDiscordなどに自動投稿することができます。

Dify Schedulerとは

Dify Schedulerは、設定した時間に指定したDify APIを呼び出してワークフローを実行するシステムです。Vercel Cron Jobsを活用することで、サーバーレスかつ低コストで運用することができます。

主な特徴は以下の通りです:

  • 設定した時間に指定したDify APIを呼び出してワークフローを実行
  • 複数のワークフローを異なるスケジュールで実行可能
  • ワークフローの実行結果はDify側で設定された連携先に自動的に投稿
  • 実行ログを記録して障害時に確認可能

技術スタック

Dify Schedulerは以下の技術スタックで構築されています:

  • Next.js 15.2: 最新のWebアプリケーションフレームワーク
  • TypeScript: 型安全なJavaScriptの拡張言語
  • Vercel: ホスティングとCron Jobs機能
  • Edge Runtime: 高速な実行環境

Next.jsとVercelの組み合わせにより、サーバーレスでありながら高パフォーマンスを実現しています。また、TypeScriptによる型安全性により、安定した動作を確保しています。

セットアップ方法

ここでは、Dify Schedulerをセットアップする手順を説明します。

1. リポジトリのクローン

まず、GitHubからリポジトリをクローンします。

git clone https://github.com/yourusername/dify-scheduler.git
cd dify-scheduler

2. 依存関係のインストール

次に、必要なパッケージをインストールします。このプロジェクトではpnpmを使用しています。

pnpm install

3. 環境変数の設定

.env.localファイルを作成し、以下の環境変数を設定します:

DIFY_API_KEY=your_dify_api_key_here
DIFY_API_URL=https://api.dify.ai/v1
# Vercelダッシュボードの「Settings > General > Protection Bypass for Automation」から取得したシークレット値
VERCEL_AUTOMATION_BYPASS_SECRET=your_secret_here

4. ワークフロー設定の編集

config/workflows.jsonファイルを編集して、実行するワークフローとスケジュールを設定します:

workflows.json
{
  "workflows": [
    {
      "id": "your-workflow-id-1",
      "schedule": "0 21 * * *",
      "name": "夜のニュース"
    },
    {
      "id": "your-workflow-id-2",
      "schedule": "0 9 * * *",
      "name": "朝のニュース"
    }
  ]
}

ここでのscheduleはcron式で、それぞれ「毎日21時に実行」「毎日9時に実行」を意味しています。

5. Vercel設定の編集

vercel.jsonファイルを編集して、Cron Jobsの設定を行います:

vercel.json
{
  "version": 2,
  "buildCommand": "pnpm build",
  "devCommand": "pnpm dev",
  "installCommand": "pnpm install",
  "framework": "nextjs",
  "regions": ["hnd1"],
  "crons": [
    {
      "path": "/api/cron/dify-workflow?workflowId=your-workflow-id-1",
      "schedule": "0 21 * * *"
    },
    {
      "path": "/api/cron/dify-workflow?workflowId=your-workflow-id-2",
      "schedule": "0 9 * * *"
    }
  ]
}

ここで重要なのは、pathパラメーターにワークフローIDを指定することと、scheduleworkflows.jsonの設定と一致していることです。

ローカルでの動作確認

設定が完了したら、ローカル環境で動作確認を行いましょう。

pnpm dev

開発サーバーが起動したら、ブラウザから以下のURLにアクセスして動作確認ができます:

  • http://localhost:3000/api/health: サーバーのヘルスチェック
  • http://localhost:3000/api/test: シンプルなテスト用API

特定のワークフローを手動で実行するには、以下のURLにアクセスします:

http://localhost:3000/api/cron/dify-workflow?workflowId=your-workflow-id-1

Vercelへのデプロイ

ローカルでの動作確認が完了したら、Vercelにデプロイします。

# プレビューデプロイ
pnpm deploy:preview

# 本番デプロイ
pnpm deploy:production

デプロイが完了したら、Vercelのダッシュボードで以下の設定を行います:

  1. 「Settings > Authentication」を選択
  2. 「Protection Bypass」セクションで /api/* パスを追加して認証をバイパス
  3. 環境変数に VERCEL_AUTOMATION_BYPASS_SECRET を設定

これで、設定したスケジュールに従ってDifyワークフローが自動実行されるようになります。

認証設定について

Vercelでは保護されたAPIエンドポイントへのアクセスに認証が必要です。Cron Jobsからのアクセスを許可するには、前述の「Protection Bypass」設定が必要です。

このバイパス設定により、Vercel内部からのCron実行リクエストが認証なしで処理されるようになります。ただし、外部からのアクセスは引き続き保護されます。

実装のポイント

APIルートの設計

このシステムの中心となるのは、次のAPIルートです:

api/cron/dify-workflow.ts
import { NextRequest, NextResponse } from 'next/server';
import { getWorkflowConfig } from '@/lib/workflow-config';

export const runtime = 'edge';

export async function GET(request: NextRequest) {
  try {
    // URLからワークフローIDを取得
    const searchParams = request.nextUrl.searchParams;
    const workflowId = searchParams.get('workflowId');
    
    if (!workflowId) {
      return NextResponse.json({ error: 'Workflow ID is required' }, { status: 400 });
    }
    
    // ワークフロー設定を取得
    const workflow = getWorkflowConfig(workflowId);
    
    if (!workflow) {
      return NextResponse.json({ error: 'Workflow not found' }, { status: 404 });
    }
    
    // Dify APIを呼び出してワークフローを実行
    const response = await fetch(`${process.env.DIFY_API_URL}/workflows/${workflowId}/run`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.DIFY_API_KEY}`,
        'Content-Type': 'application/json'
      }
    });
    
    if (!response.ok) {
      const errorData = await response.json();
      return NextResponse.json({ 
        error: 'Failed to run Dify workflow',
        details: errorData 
      }, { status: 500 });
    }
    
    const data = await response.json();
    
    // 実行結果を返す
    return NextResponse.json({
      success: true,
      workflow: workflow.name,
      execution_id: data.execution_id
    });
    
  } catch (error) {
    console.error('Error running Dify workflow:', error);
    return NextResponse.json({ 
      error: 'Internal server error',
      details: error instanceof Error ? error.message : String(error)
    }, { status: 500 });
  }
}

このAPIルートは、Vercel Cron Jobsから定期的に呼び出され、指定されたDifyワークフローを実行します。Edge Runtimeを使用することで、高速な応答と低コストな実行を実現しています。

エラーハンドリング

実運用を考慮して、エラーハンドリングにも配慮しています。APIからのレスポンスをきちんと確認し、エラーが発生した場合は適切なステータスコードとエラーメッセージを返すようにしています。

これにより、Vercelのダッシュボードからエラーの発生を確認できるほか、必要に応じてログ監視サービスと連携することも可能です。

Cron式について

Vercelのcron jobsではUNIX標準のcron式を使用します。基本的な形式は以下の通りです:

* * * * *
┬ ┬ ┬ ┬ ┬
│ │ │ │ └── 曜日 (0 - 6) (日曜日 = 0)
│ │ │ └──── 月 (1 - 12)
│ │ └────── 日 (1 - 31)
│ └──────── 時 (0 - 23)
└────────── 分 (0 - 59)

代表的な設定例:

  • 0 9 * * *: 毎日朝9時に実行
  • 0 */3 * * *: 3時間ごとに実行(0時、3時、6時...)
  • 0 9 * * 1-5: 平日(月〜金)の朝9時に実行

Pro以上のプランでは、より多くのcronジョブと高頻度の実行が可能になります。

注意点と制限事項

Vercel無料プランの制限

前述の通り、Vercelの無料プランではCron Jobsに制限があります。実用的な運用を考える場合は、Proプラン以上への契約を検討するのがよいでしょう。

セキュリティ

APIキーなどの機密情報は必ず環境変数として設定し、ソースコードにハードコーディングしないようにしましょう。また、不必要なAPIエンドポイントは公開しないよう、適切なアクセス制御を行うことが重要です。

エラー対応

システムが自動で動作するため、エラーが発生した場合の対応策を用意しておくことが大切です。例えば:

  • ログ監視の設定
  • エラー通知の連携(Slackなど)
  • 定期的な動作確認

今後の展望

Dify Schedulerはまだ発展の余地があり、以下のような機能拡張を計画しています:

  1. UIの追加: 設定変更をWebインターフェースから行えるように
  2. 実行ステータスのモニタリング: 過去の実行結果を確認できる機能
  3. 再試行機能: エラー時に自動で再実行する機能
  4. より柔軟なスケジュール設定: 複雑なスケジュールパターンの対応

まとめ

Dify Schedulerを使うことで、Difyで構築したAIワークフローを簡単に自動化することができます。Vercel Cron Jobsの力を借りることで、サーバーレスかつ低コストでの運用が可能となり、AIを活用した自動化の幅が広がります。

ぜひあなたのDifyワークフローを自動化して、情報収集や定期的なタスクの効率化にお役立てください。

おわりに

今回は私がプログラミング学習の過程で作成したプロジェクトをご紹介させていただきました。非エンジニアながらも、AIの力を借りながら少しずつコードを理解し、実際に動くものを作る喜びを味わうことができました。

本記事で紹介したシステムは完璧とは言えませんが、私自身の学びのプロセスとして貴重な経験となりました。もし皆様のお役に立てれば幸いですし、改善点やアドバイスなどございましたら、ぜひコメントでお知らせいただければと存じます。

これからも技術の学習を続け、より実用的で面白いプロジェクトを作れるよう精進してまいります。Next.jsやVercelの可能性をさらに探求し、AIと技術を組み合わせた便利なツールの開発に挑戦していきたいと考えております。

温かい目で見守っていただければ幸いです。今後ともどうぞよろしくお願い申し上げます。

参考リンク

Discussion

ログインするとコメントできます