こんにちは、ネクストモード株式会社 テクニカルサポート担当です。
Okta Workflowsを活用していると毎日起動したいflowや月に1度だけ起動したいflowが出てきます。さまざまなflowを構築していく中でこれらのトリガーをひとまとめにすることができないかと思い試行錯誤した結果をご紹介します。
この記事では抽象化したScheduled flowの仕組みをJob管理テーブルとMain flowとHelper flowで実現します。
例えば、毎月1日に起動する設定のflowがある場合、1日以外もそのflowがActiveのままとなります。
また、以下のように毎日起動する設定でも、ストリーミングによってすぐにHelper flowへ遷移するflowがあります。
Okta WorkflowsのそれぞれのプランではActiveなflow数に制限があるため、極力flow数を減らしたくなります。
以下の構成で抽象化することで最小限のflow数でさまざまなタイプのScheduled flowをまとめることができます。
以下のような流れとなります。
具体的なTableとflowは以下です。
以下のカラムを設定します。
テーブルのenabledカラムがTrueのみを取得します。
取得したレコードをHelper flowに渡します。
全体の構成は前半の日時取得部分、実行タイミング判定部分、Job実行部分、Slackメッセージ投稿部分(今回の検証のデバッグ目的)
Helper flowが実行すべきタイミングを判定するロジックを、まず表で整理します。
| schedule_type | 実行条件(判定式) | 参照するカラム |
|---|---|---|
| hourly | job_name が空でない | job_name |
| daily_at_hour | now_hour == hour | hour |
| weekly_at_hour | now_weekday == weekday AND now_hour == hour | weekday, hour |
| monthly_at_hour | now_day == day_of_month AND now_hour == hour | day_of_month, hour |
Main flowから受け取ったレコードを受けとります。
現在時刻を取得し、日本時間で時間(9時、13時など)、曜日(Mon、Tueなど)、日(1日、5日など)をそれぞれ取得します。
レコードのschedule_typeがhourlyの場合、レコードのjob_nameがあることをTrue/FalseのCompareカードで判定
hourlyなので毎時間実行されることを想定
レコードのschedule_typeがdaily_at_hourの場合、レコードのhourと現在のHourが一致するかをTrue/FalseのCompareカードで判定
レコードのschedule_typeがweekly_at_hourの場合、レコードのhourと現在のHourが一致するか、レコードのweekdayが現在のWeekdayと一致するかをそれぞれTrue/FalseのCompareカードで判定
両方の条件がTrueであるかをTrue/FalseのAndカードで判定
レコードのschedule_typeがmonthly_at_hourの場合、レコードのhourと現在のHourが一致するか、レコードのmonthly_at_hourが現在のDayと一致するかをそれぞれTrue/FalseのCompareカードで判定
両方の条件がTrueであるかをTrue/FalseのAndカードで判定
Continue Ifカードで実行タイミング判定の結果がTrueの場合のみ処理を継続
レコードのjob_name毎に条件分岐を作成します。
今回の検証ではすべての条件分岐それぞれでTextのComposeカードでレコードのJob_nameを引用しメッセージを作成するという簡単な処理としました。
今回は共通処理としてSlackチャンネルへメッセージを送信します。
レコードからslack_channelやslack_bot_name、slack_bot_emojiを反映し、メッセージ部分をJob実行部分のアウトプットを指定します。
以下のようにそれぞれのJobの時間にそれぞれのjob_nameを反映したメッセージがSlackチャンネルに投稿されています。
2026/03/17(Thu)のため、テーブルに設定したすべてのパターンに一致する状態です。
本記事では、Okta WorkflowsのScheduled flowをジョブごとに増やす際に生じやすい「常時Activeになってしまう」「起動してもすぐにHelper flowへ遷移するだけ」といった無駄を、Job管理Tableに集約して解消する方法を紹介しました。
スケジュール定義をテーブルに寄せ、Main flowが有効なジョブを読み込んでHelper flowへ渡すことで、フロー数を最小限に保ちながら、毎時・毎日指定時刻・毎週指定曜日/時刻・毎月指定日/時刻といった実行タイミングを共通ロジックで判定できます。
一方で、Job実行部分がIf/ElseIf内に集約されるため、処理が複雑になると可読性や相関関係が分かりにくくなる可能性があります。この課題にはDescriptionの整備や別途ドキュメント化することである程度は軽減が可能です。
この方法は、スケジュール種別が複数あり、今後もJobが増え続けるような運用に特に向いています。反対に、Jobごとの処理が重く、分岐内の実装が複雑になりがちなケースでは、Helper flow内の条件分岐が肥大化しやすいため、適用範囲を見極めるとよいでしょう。