はじめに
Dify のワークフローを「毎朝レポート」「週次バッチ」のように定期実行したい場面は多くあります。本記事では、Make、GitHub Actions、Cloud Run+Cloud Schedulerの3通りの定期実行方法をまとめました。
どれを選ぶかの指針
- Make:GUIで素早く試したい、非エンジニアも触る、15分間隔で十分。
- GitHub Actions:cron をコードで管理したい、PR レビューや履歴を残したい。
- Cloud Run+Cloud Scheduler:本番向け・認証(OIDC)必須・Secret Manager で鍵管理、将来の拡張性重視。
事前準備
- 前提条件
- Dify をすでに動かしている
- Dify の API キーを取得済み(設定画面から確認可能)
- 必要な準備作業
- ワークフローを用意する(Dify 側で簡単なワークフローを作っておくとテストがスムーズ)
環境
- Dify クラウド版
v1.10.0からはスケジュールトリガーを使うことで定期実行を簡単に実現できます。トリガー機能の概要や使い方についてはこちらをご覧ください。
Make.com での定期実行
まずは、Makeを用いてDifyのワークフローを定期実行する方法を紹介します。
Make とは?
Makeは、ノーコードの自動化サービスです。複数のアプリやAPIをつないで、ドラッグ&ドロップで処理の流れ(シナリオ)を作成・実行できます。
ノーコードの自動化サービスは、Zapierも有名ですが、Zapier は送信 Webhooks が無料プラン対象外のため、無料でも 15 分間隔で動かせるMakeを採用しました。
手順
- シナリオの作成
- HTTPモジュールの設定
- スケジュールの設定
- テストと確認
1. シナリオの作成
シナリオは自動化フローの全体像を定義する単位です。ここで「Difyワークフローを実行」という処理をまとめて管理するため、最初に作成します。
-
このページにアクセスし、「Create a new scenario」を選択します。

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

-
「Make an API Key Auth request」を選択します。

-
「Credentials」の「Add」を選択後、以下の表のように項目を設定します。
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形式で登録し、リクエストごとに自動でヘッダーに付与させます。
-
他の項目を以下の表のように設定します。

| 項目 | 値 | 備考 |
|---|---|---|
| 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. スケジュールの設定
-
「Every 15 minutes」を選択し、「Schedule setting」で定期実行したい日付を設定します。 今回は毎週月曜の午前9時に設定しました。
Makeの無料プランでは最短で15分間隔のスケジュール実行が可能です。これにより、業務時間内に定期的なレポートを自動生成できます。
4. テストと確認
-
「Run once」を選択し、テストを実行します。

-
Status codeが200であることが確認できました。

-
Dify のワークフローログにも表示されているため、成功しています。


GitHub Actions(dify-schedule)での定期実行
次に、GitHub Actionsを用いてDifyのワークフローを定期実行実行する手順を紹介します。
使用するリポジトリは、Dify OSSの公式にも解説があったこちらです。
既存のdify-scheduleリポジトリをフォークすることで、自分の環境に合わせてcron設定やSecretsを自由に変更できるようにします。
手順
- リポジトリのセットアップ
- Actionsの有効化
- Dify のAPIキーの設定
- cronスケジュール設定
- テストと確認
1. リポジトリのセットアップ
-
このリポジトリにアクセスし、フォークします。


2. Actionsの有効化
-
Actionsメニューを選択します。

-
GitHub Actionsの有効化の承認を求められるので、承認します。

3. Dify のAPIキー設定
-
Settingsメニューを選択し、左サイドの「Secrets and variables」の「Actions」を選択します。 その後、「Repository secrets」の「New repository secret」を選択します。

-
以下の表のように項目を設定し、「Add secret」を選択します。

:::message
なぜ Secrets に入れるのか? APIキーをコードに直書きするとリポジトリを共有した際に流出するリスクがあります。 Secrets に保存することで安全に保管でき、Workflow 内から
secrets.DIFY_TOKENとして参照可能になります。:::
| 項目 | 値 | 備考 |
|---|---|---|
| Name | DIFY_TOKEN | ワークフロー内では secrets.DIFY_TOKEN で参照 |
| Secret | YOUR_API_KEY | Dify の Workflow API Key |
-
以下のようになっているか確認して下さい。

4. スケジュール設定
-
Actionsメニューを選択し、「Auto」タブで
auto.ymlを選択します。
-
鉛筆のマークを選択します。

-
定期実行したい日付をcronで設定します。 今回は毎週月曜の午前9時(
0 9 * * 1)に設定しました。 任意の時間を入力後、「Commit changes…」を選択し、「Commit changes」を選択します。
:::message
cronでの時間設定方法 cronは定期実行のスケジュールを設定するための書式です。 今回設定したcronの各項目の意味は以下の通りです。
0:分(0分) 9:時(9時) *:日(毎日) *:月(毎月) 1:曜日(0=日曜、1=月曜、…)この例では「毎週月曜日の午前9時」に処理が実行されます。
:::
:::message
なぜ cron で管理するのか? cron式を使うことで、定期実行のスケジュールを「コード」として管理できます。 設定変更の履歴がコミットログに残るため、チームでレビュー・管理しやすくなります。
:::
5. テストと確認
-
Dify のワークフローログにも表示されているため、成功しています。

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 式で実行タイミングを管理するサービスです。
この構成のメリットは以下です。
- 認証付きで安全に実行できる
- APIキーを Secret Manager で集中管理できる
- GUI操作だけで本番環境レベルの定期実行が組める
- 将来の拡張(監視、アラート、リトライ)にも対応可能
👉 全体の流れは次のとおりです。
手順
- Secret ManagerにAPIキーを登録
- サービスアカウントの作成
- Cloud Run functionsで関数を作成
- Cloud Schedulerの設定
- テストと確認
1. Secret ManagerにAPIキーを登録
Dify の API キーは Secret Manager に登録します。これにより、コードやYAMLへの直書きを避けられ、① 漏えいリスクの低減、② IAM による最小権限のアクセス制御、③ バージョン管理とローテーション、④ 監査ログの取得 が可能になります。
-
こちらにアクセスし、「シークレットを作成」を選択します。

-
以下の表のように項目を設定し、「シークレットを作成」を選択します。

| 項目 | 値 | 備考 |
|---|---|---|
| 名前 | dify_regular_execution | 小文字スネークケース推奨(後から参照しやすい) |
| シークレットの値 | YOUR_API_KEY | Dify の Workflow API Key。改行なし/余計な空白なしで保存 |
-
シークレットのパスをコピーし、メモします。

2. サービスアカウントの作成
-
こちらにアクセスし、「サービスアカウントを作成」を選択します。

-
「①サービスアカウントの作成」で、任意のサービスアカウント名を入力します。

-
「②権限」の「ロールを選択」で、「Secret Managerのシークレットサクセサー」と「Cloud Run 起動元」を追加し、「完了」を選択します。

3. Cloud Run functions で関数を作成
-
こちらにアクセスし、「関数を作成」を選択します。

-
以下の表のように項目を設定します。

| 項目 | 値 | 備考 |
|---|---|---|
| サービスの名前 | dify-regular-execution | 任意。後のURLやIAMで識別に使用 |
| リージョン | asia-northeast1 | 近いリージョンを推奨(レイテンシ/料金最適化) |
| ランタイム | Node.js 22 | - |
| 認証 | 認証が必要 | 後段の Cloud Scheduler から OIDC 付きで呼び出す前提 |
-
「コンテナ、ボリューム、ネットワーキング、セキュリティ」に移動し、「シークレットを参照」を選択します。

-
以下の表のように項目を設定してください。

| 項目 | 値 | 備考 |
|---|---|---|
| 名前 | DIFY_API_KEY | 環境変数名(コードで process.env.DIFY_API_KEY などで参照可) |
| シークレット | dify_regular_execution | Secret Manager で作成したシークレット名 |
| バージョン | latest | 固定でOK(ロールアウト時は固定バージョンも可) |
-
「セキュリティ」の「サービスアカウント」で、先ほど作成したサービスアカウントを選択し、「作成」を選択します。

-
index.jsに以下のコードをペーストします。SECRET_NAMEは先ほど保存したシークレットのパスを入力します。
:::details コード
index.js
javascriptconst 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'); } });:::
-
package.jsonに以下のコードをペーストします。 scripts.deploy の<SERVICE_ACCOUNT_EMAIL>は、サービスアカウントのメールアドレスに置き換えてください。
package.jsonjson{ "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>" } } -
作成した関数のURLをコピーし、保存します。

4. Cloud Schedulerの設定
-
こちらにアクセスし、「ジョブを作成」を選択します。

-
「スケジュールを定義する」で、以下の表のように項目を設定します。

| 項目 | 値 | 備考 |
|---|---|---|
| 名前 | dify-regular-execution | 任意(ジョブID) |
| リージョン | asia-northeast1 | 関数と同一リージョンを推奨 |
| 頻度 | 0 9 * * 1 | Cron(例:毎週月曜9:00 JST)。UTC基準にしない場合はタイムゾーン必ず指定 |
| タイムゾーン | 日本標準時(JST) | 例:Asia/Tokyo |
-
「実行内容を構成する」で、以下の表のように項目を設定します。

| 項目 | 値 | 備考 |
|---|---|---|
| ターゲットタイプ | 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. テストと確認
-
Cloud Schedulerで作成したジョブを選択し、「強制実行」を選択します。

-
「最後のステータス」が「成功」になったので、一連の流れが成功しました。

-
Dify のワークフローログにも表示されているため、成功しています。


おわりに
本記事では、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 などの方法を検討がいいかもしれません。

