TECH BLOG

エルカミーの技術ブログです

Dify のワークフロー定期実行方法3選

はじめに

Dify のワークフローを「毎朝レポート」「週次バッチ」のように定期実行したい場面は多くあります。本記事では、MakeGitHub ActionsCloud Run+Cloud Schedulerの3通りの定期実行方法をまとめました。

どれを選ぶかの指針
  • Make:GUIで素早く試したい、非エンジニアも触る、15分間隔で十分。
  • GitHub Actions:cron をコードで管理したい、PR レビューや履歴を残したい。
  • Cloud Run+Cloud Scheduler:本番向け・認証(OIDC)必須・Secret Manager で鍵管理、将来の拡張性重視。
事前準備
  • 前提条件
    • Dify をすでに動かしている
    • Dify の API キーを取得済み(設定画面から確認可能)
  • 必要な準備作業
    • ワークフローを用意する(Dify 側で簡単なワークフローを作っておくとテストがスムーズ)
環境
  • Dify クラウド版

Make.com での定期実行

まずは、Makeを用いてDifyのワークフローを定期実行する方法を紹介します。

Make とは?

Makeは、ノーコードの自動化サービスです。複数のアプリやAPIをつないで、ドラッグ&ドロップで処理の流れ(シナリオ)を作成・実行できます。

💡
ノーコードの自動化サービスは、Zapierも有名ですが、Zapier は送信 Webhooks が無料プラン対象外のため、無料でも 15 分間隔で動かせるMakeを採用しました。
手順
  1. シナリオの作成
  2. HTTPモジュールの設定
  3. スケジュールの設定
  4. テストと確認
1. シナリオの作成

シナリオは自動化フローの全体像を定義する単位です。ここで「Difyワークフローを実行」という処理をまとめて管理するため、最初に作成します。

  1. このページにアクセスし、「Create a new scenario」を選択します。
    image block
2. HTTPモジュールの作成

DifyのワークフローはREST API経由で実行するため、外部サービスと通信できるHTTPモジュールを使用します。ここで認証情報とエンドポイントを設定し、Dify APIにアクセスできるようにします。

  1. HTTPモジュール「HTTP」を選択
    image block
  2. 「Make an API Key Auth request」を選択します。
    image block
  3. 「Credentials」の「Add」を選択後、以下の表のように項目を設定します。
    image block

    APIキーを安全に使えるように設定をします。

    項目 備考
    Name Dify API Key 任意名(共有時に識別しやすい名前に)
    Key Bearer YOUR_API_KEY Bearer␣+APIキーを1行で。改行・余計な空白NG(例:Bearer app-xxxx)。Dify の Workflow API Key を使用。 (Dify Docs)
    API Key placement In the header HTTPヘッダーに付与(自動で Authorization に入る設定)
    API Key parameter name Authorization 既定のヘッダー名。変更不要

    Dify APIはAuthorizationヘッダーにBearerトークンを入れて認証します。そのため、APIキーをBearer形式で登録し、リクエストごとに自動でヘッダーに付与させます。

  4. 他の項目を以下の表のように設定します。
    image block
    項目 備考
    URL https://api.dify.ai/v1/workflows/run Dify のワークフロー実行エンドポイント。セルフホストの場合は自組織のベースURLに置換。
    Method POST このAPIは POST で実行。
    Headers (変更なし) -
    Query String (変更なし) 不要
    Body type Raw JSONをそのまま送信
    Content type JSON(application/json) application/json を選択
    Request content 下記JSON inputs はワークフロー側の入力に合わせて編集。response_mode は通常 blocking(同期)。user は呼び出し元の識別子。

    https://api.dify.ai/v1/workflows/run はワークフローを実行する専用エンドポイントです。Bodyでinputsを渡すことで、ワークフローに動的な入力を与えられます。

    body

    {
      "inputs": { "foo": "bar" },
      "response_mode": "blocking",
      "user": "make"
    }
3. スケジュールの設定
  1. 「Every 15 minutes」を選択し、「Schedule setting」で定期実行したい日付を設定します。

    今回は毎週月曜の午前9時に設定しました。

    image block

    Makeの無料プランでは最短で15分間隔のスケジュール実行が可能です。これにより、業務時間内に定期的なレポートを自動生成できます。

4. テストと確認
  1. 「Run once」を選択し、テストを実行します。
    image block
  2. Status codeが200であることが確認できました。
    image block
  3. Dify のワークフローログにも表示されているため、成功しています。
    image block
    image block

GitHub Actions(dify-schedule)での定期実行

次に、GitHub Actionsを用いてDifyのワークフローを定期実行実行する手順を紹介します。

使用するリポジトリは、Dify OSSの公式にも解説があったこちらです。

既存のdify-scheduleリポジトリをフォークすることで、自分の環境に合わせてcron設定やSecretsを自由に変更できるようにします。

手順
  1. リポジトリのセットアップ
  2. Actionsの有効化
  3. Dify のAPIキーの設定
  4. cronスケジュール設定
  5. テストと確認
1. リポジトリのセットアップ
  1. このリポジトリにアクセスし、フォークします。
    image block
    image block
2. Actionsの有効化
  1. Actionsメニューを選択します。
    image block
  2. GitHub Actionsの有効化の承認を求められるので、承認します。
    image block
3. Dify のAPIキー設定
  1. Settingsメニューを選択し、左サイドの「Secrets and variables」の「Actions」を選択します。

    その後、「Repository secrets」の「New repository secret」を選択します。

    image block
  2. 以下の表のように項目を設定し、「Add secret」を選択します。
    image block
    💡
    なぜ Secrets に入れるのか?

    APIキーをコードに直書きするとリポジトリを共有した際に流出するリスクがあります。
    Secrets に保存することで安全に保管でき、Workflow 内から secrets.DIFY_TOKEN として参照可能になります。

    項目 備考
    Name DIFY_TOKEN ワークフロー内では secrets.DIFY_TOKEN で参照
    Secret YOUR_API_KEY Dify の Workflow API Key
  3. 以下のようになっているか確認して下さい。
    image block
4. スケジュール設定
  1. Actionsメニューを選択し、「Auto」タブでauto.ymlを選択します。
    image block
  2. 鉛筆のマークを選択します。
    image block
  3. 定期実行したい日付をcronで設定します。

    今回は毎週月曜の午前9時(0 9 * * 1)に設定しました。

    任意の時間を入力後、「Commit changes…」を選択し、「Commit changes」を選択します。

    image block
    💡
    cronでの時間設定方法

    cronは定期実行のスケジュールを設定するための書式です。

    今回設定したcronの各項目の意味は以下の通りです。

    0:分(0分)
    9:時(9時)
    *:日(毎日)
    *:月(毎月)
    1:曜日(0=日曜、1=月曜、…)

    この例では「毎週月曜日の午前9時」に処理が実行されます。

    💡
    なぜ cron で管理するのか?

    cron式を使うことで、定期実行のスケジュールを「コード」として管理できます。
    設定変更の履歴がコミットログに残るため、チームでレビュー・管理しやすくなります。

5. テストと確認
  1. Dify のワークフローログにも表示されているため、成功しています。
    image block

Cloud Run + Cloud Schedulerでの定期実行

最後に、Google Cloud のサービスを使ったDifyのワークフローを定期実行実行する手順を紹介します。

Google Cloud のサービスを組み合わせることで、Dify のワークフローをセキュアに定期実行できます。

この構成では、それぞれのサービスに役割があります。

  • Secret Manager

    Dify APIキーを安全に保存し、コードやYAMLに直書きするリスクを避けます。

    IAM 権限を使って、必要なサービスだけが取得できるように制御します。

  • サービスアカウント

    Cloud Scheduler が Functions を呼び出す際の認証に使います。

    最小権限でアクセス制御するため、セキュリティを保ちながら自動実行できます。

  • Cloud Run functions

    Dify API を実際に叩く役割。

    Secret Manager から APIキーを取得し、HTTP リクエストを送る処理をします。

  • Cloud Scheduler

    cron 式で実行タイミングを管理するサービスです。

flowchart LR
    subgraph GoogleCloud["Google Cloud"]
        Scheduler["Cloud Scheduler\n(cron式で定期実行)"]
        Functions["Cloud Functions\n(API呼び出しラッパー)"]
        Secret["Secret Manager\n(APIキーを安全に保存)"]
    end

    Dify["Dify API\n(ワークフロー実行)"]

    Scheduler -->|"OIDC 認証で呼び出し"| Functions
    Functions -->|"HTTP POST"| Dify
    Functions --> Secret

この構成のメリットは以下です。

  • 認証付きで安全に実行できる
  • APIキーを Secret Manager で集中管理できる
  • GUI操作だけで本番環境レベルの定期実行が組める
  • 将来の拡張(監視、アラート、リトライ)にも対応可能

👉 全体の流れは次のとおりです。

手順
  1. Secret ManagerにAPIキーを登録
  2. サービスアカウントの作成
  3. Cloud Run functionsで関数を作成
  4. Cloud Schedulerの設定
  5. テストと確認

1. Secret ManagerにAPIキーを登録

Dify の API キーは Secret Manager に登録します。これにより、コードやYAMLへの直書きを避けられ、① 漏えいリスクの低減、② IAM による最小権限のアクセス制御、③ バージョン管理とローテーション、④ 監査ログの取得 が可能になります。

  1. こちらにアクセスし、「シークレットを作成」を選択します。
    image block
  2. 以下の表のように項目を設定し、「シークレットを作成」を選択します。
    image block
    項目 備考
    名前 dify_regular_execution 小文字スネークケース推奨(後から参照しやすい)
    シークレットの値 YOUR_API_KEY Dify の Workflow API Key。改行なし/余計な空白なしで保存
  3. シークレットのパスをコピーし、メモします。
    image block
2. サービスアカウントの作成
  1. こちらにアクセスし、「サービスアカウントを作成」を選択します。
    image block
  2. 「①サービスアカウントの作成」で、任意のサービスアカウント名を入力します。
    image block
  3. 「②権限」の「ロールを選択」で、「Secret Managerのシークレットサクセサー」と「Cloud Run 起動元」を追加し、「完了」を選択します。
    image block
3. Cloud Run functions で関数を作成
  1. こちらにアクセスし、「関数を作成」を選択します。
    image block
  2. 以下の表のように項目を設定します。
    image block
    項目 備考
    サービスの名前 dify-regular-execution 任意。後のURLやIAMで識別に使用
    リージョン asia-northeast1 近いリージョンを推奨(レイテンシ/料金最適化)
    ランタイム Node.js 22 -
    認証 認証が必要 後段の Cloud Scheduler から OIDC 付きで呼び出す前提
  3. 「コンテナ、ボリューム、ネットワーキング、セキュリティ」に移動し、「シークレットを参照」を選択します。
    image block
  4. 以下の表のように項目を設定してください。
    image block
    項目 備考
    名前 DIFY_API_KEY 環境変数名(コードで process.env.DIFY_API_KEY などで参照可)
    シークレット dify_regular_execution Secret Manager で作成したシークレット名
    バージョン latest 固定でOK(ロールアウト時は固定バージョンも可)
  5. 「セキュリティ」の「サービスアカウント」で、先ほど作成したサービスアカウントを選択し、「作成」を選択します。
    image block
  6. index.js に以下のコードをペーストします。

    SECRET_NAMEは先ほど保存したシークレットのパスを入力します。

    image block
    コード

    index.js

    const functions = require('@google-cloud/functions-framework');
    const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');
    const axios = require('axios');
    
    // シークレットマネージャークライアントを作成
    const secretClient = new SecretManagerServiceClient();
    
    // シークレット名(必要に応じてバージョンを指定。指定しない場合は latest が使われる)
    const SECRET_NAME = 'projects/***/secrets/dify_regular_execution/versions/latest';
    
    // APIキー取得関数
    async function getApiKey() {
      const [version] = await secretClient.accessSecretVersion({ name: SECRET_NAME });
      return version.payload.data.toString('utf8');
    }
    
    // Cloud Functions エントリーポイント
    functions.http('executeDifyApi', async (req, res) => {
      try {
        console.log('=== Start executeDifyApi ===');
    
        const apiKey = await getApiKey();
        console.log('API Key取得成功(キーは非表示)');
    
        const payload = {
          inputs: { foo: 'bar' },
          response_mode: 'blocking',
          user: 'Cloud Run functions'
        };
        console.log('送信ペイロード:', payload);
    
        const response = await axios.post(
          'https://api.dify.ai/v1/workflows/run',
          payload,
          {
            headers: {
              'Authorization': `Bearer ${apiKey}`,
              'Content-Type': 'application/json'
            }
          }
        );
    
        console.log('Dify API レスポンス:', response.data);
        res.status(200).send(response.data);
    
      } catch (error) {
        console.error('=== エラー発生 ===');
        if (error.response) {
          console.error('ステータス:', error.response.status);
          console.error('レスポンスデータ:', error.response.data);
        } else if (error.request) {
          console.error('レスポンスなし:', error.request);
        } else {
          console.error('エラーメッセージ:', error.message);
        }
        console.error('フルエラーオブジェクト:', error);
        res.status(500).send('Internal Server Error');
      }
    });
    
  7. package.json に以下のコードをペーストします。

    scripts.deploy の <SERVICE_ACCOUNT_EMAIL> は、サービスアカウントのメールアドレスに置き換えてください。

    image block

    package.json

    {
      "name": "dify-cloud-functions",
      "version": "1.0.0",
      "dependencies": {
        "@google-cloud/functions-framework": "3.3.0",
        "@google-cloud/secret-manager": "4.2.0",
        "axios": "1.4.0"
      },
      "engines": {
        "node": ">=22"
      },
      "scripts": {
        "deploy": "gcloud functions deploy executeDifyApi --gen2 --runtime=nodejs22 --region=asia-northeast1 --entry-point=executeDifyApi --trigger-http --allow-unauthenticated --service-account=<SERVICE_ACCOUNT_EMAIL>"
      }
    }
  8. 作成した関数のURLをコピーし、保存します。
    image block

4. Cloud Schedulerの設定
  1. こちらにアクセスし、「ジョブを作成」を選択します。
    image block
  2. 「スケジュールを定義する」で、以下の表のように項目を設定します。
    image block
    項目 備考
    名前 dify-regular-execution 任意(ジョブID)
    リージョン asia-northeast1 関数と同一リージョンを推奨
    頻度 0 9 * * 1 Cron(例:毎週月曜9:00 JST)。UTC基準にしない場合はタイムゾーン必ず指定
    タイムゾーン 日本標準時(JST) 例:Asia/Tokyo
  3. 「実行内容を構成する」で、以下の表のように項目を設定します。
    image block
    項目 備考
    ターゲットタイプ HTTP Cloud Run/Functions を HTTP で呼び出し
    URL 関数の URL 例:https://<service>-<hash>-<region>.run.app/
    HTTPメソッド POST Dify 実行エンドポイントが POST のため
    (認証)OIDC トークン サービスアカウント+aud=URL 必須(関数が認証必須の場合)。Cloud Run Invoker 権限を付与し、aud はサービスURLを指定。
5. テストと確認
  1. Cloud Schedulerで作成したジョブを選択し、「強制実行」を選択します。
    image block
  2. 「最後のステータス」が「成功」になったので、一連の流れが成功しました。
    image block
  3. Dify のワークフローログにも表示されているため、成功しています。
    image block
    image block

おわりに

本記事では、Dify のワークフローを定期実行する 3 つの方法(Make.com/GitHub Actions/Cloud Run + Cloud Scheduler) を紹介しました。

定期実行の反応速度は、同一条件(例:毎朝 9 時実行)での検証では Make → Cloud Run + Cloud Scheduler → GitHub Actions の順に短い結果でした(※環境やジョブ内容により異なります)。

まずは定期実行を試したい場合は、GUI で気軽に構築できる Make をおすすめします。

初めてなら GUI で直感的に設定できる Make から試すのがおすすめです。その後チーム開発や本番運用を見据える場合は GitHub Actions や Cloud Run などの方法を検討がいいかもしれません。

サービス紹介

Dify の構築や、ワークフローの作成は、見た目以上に複雑で思っていたより大変な部分も多いんです。でも、ご安心ください。弊社のサービスで、そんな面倒な作業も丸投げできちゃいます。

「自分たちで全部やるのは時間もないし無理だな」と感じたとき、ぜひお任せください。本当にやりたいことに集中できるよう、しっかりサポートいたします。お気軽にご相談ください!