【Okta】Okta Workflowsで毎時・毎日・毎週・毎月のScheduled Flowを共通ロジックで判定して効率化する

はじめに

こんにちは、ネクストモード株式会社 テクニカルサポート担当です。

Okta Workflowsを活用していると毎日起動したいflowや月に1度だけ起動したいflowが出てきます。さまざまなflowを構築していく中でこれらのトリガーをひとまとめにすることができないかと思い試行錯誤した結果をご紹介します。

この記事では抽象化したScheduled flowの仕組みをJob管理テーブルとMain flowとHelper flowで実現します。

Scheduled flowの課題

例えば、毎月1日に起動する設定のflowがある場合、1日以外もそのflowがActiveのままとなります。

また、以下のように毎日起動する設定でも、ストリーミングによってすぐにHelper flowへ遷移するflowがあります。

Okta WorkflowsのそれぞれのプランではActiveなflow数に制限があるため、極力flow数を減らしたくなります。

Scheduled flowが常時Activeになってしまう例(毎月1日だけ動かしたいflow/毎日だが即Helperへ遷移するflowのイメージ)

 

解決策

以下の構成で抽象化することで最小限のflow数でさまざまなタイプのScheduled flowをまとめることができます。

  • Table:スケジュールやJob名を定義したテーブル
  • Main flow:テーブルを読み込みHelper flowへJobを渡すflow
  • Helper flow:Main flowから受け取ったJobが実行すべきタイミングかを判定し、実行する場合はJob名で条件分岐を実施

以下のような流れとなります。

Main FlowがJob管理テーブルを読み込み、Helper FlowにJobを渡して実行可否を判定する全体構成(概念図)

具体的なTableとflowは以下です。

 

Job管理Tableの作成

以下のカラムを設定します。

  • enabled:Jobの有効/無効を指定(True/False型)
  • job_name:処理の名称
  • schedule_type:どのようなスケジュールでJobを実行するか(hourly,daily_at_hour,weekly_at_hour,monthly_at_hourの4タイプ)
  • hour:何時に実行するか
  • weekday:何曜日に実行するか(Mon,Tueのように3文字レターで表現)
  • day_of_month:何日に実行するか
  • slack_channel:Slackメッセージを送るチャンネルID(オプション項目)
  • slack_bot_name:Slackメッセージを送る際のBot名(オプション項目)
  • slack_bot_emoji:Slackメッセージを送る際のBotのアイコン絵文字(オプション項目)

Job管理テーブルのサンプル(enabled、job_name、schedule_type、hour、weekday、day_of_month、Slack通知用カラムなど)

Main flowの作成

テーブルのenabledカラムがTrueのみを取得します。

取得したレコードをHelper flowに渡します。

Main Flowの実装例(Job管理テーブルからenabled=trueのレコードを取得し、Helper Flowへ渡す)

 

Helper flowの作成

全体の構成は前半の日時取得部分、実行タイミング判定部分、Job実行部分、Slackメッセージ投稿部分(今回の検証のデバッグ目的)

elper Flowの全体構成(日時取得、実行タイミング判定、Job実行、Slack投稿の各パート)

 

実行タイミングの判定ロジック(schedule_type別)

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日など)をそれぞれ取得します。

Alt: Helper Flowで現在時刻を取得し、日本時間の「時・曜日・日」を抽出する処理(日時取得パート)

 

実行タイミング判定部分

レコードのschedule_typeがhourlyの場合、レコードのjob_nameがあることをTrue/FalseのCompareカードで判定

hourlyなので毎時間実行されることを想定

schedule_type=hourly の実行条件判定(job_nameが空でないかをCompareで判定)

 

レコードのschedule_typeがdaily_at_hourの場合、レコードのhourと現在のHourが一致するかをTrue/FalseのCompareカードで判定

schedule_type=daily_at_hour の実行条件判定(現在時刻のHourとテーブルのhourが一致するかをCompareで判定)

 

レコードのschedule_typeがweekly_at_hourの場合、レコードのhourと現在のHourが一致するか、レコードのweekdayが現在のWeekdayと一致するかをそれぞれTrue/FalseのCompareカードで判定

両方の条件がTrueであるかをTrue/FalseのAndカードで判定

schedule_type=weekly_at_hour の実行条件判定(weekday一致とhour一致をCompareで判定し、ANDでまとめる)

 

レコードのschedule_typeがmonthly_at_hourの場合、レコードのhourと現在のHourが一致するか、レコードのmonthly_at_hourが現在のDayと一致するかをそれぞれTrue/FalseのCompareカードで判定

両方の条件がTrueであるかをTrue/FalseのAndカードで判定

schedule_type=monthly_at_hour の実行条件判定(day_of_month一致とhour一致をCompareで判定し、ANDでまとめる)

 

Continue Ifカードで実行タイミング判定の結果がTrueの場合のみ処理を継続

Continue Ifカードで「実行タイミング判定がTrueのときだけ処理を続行」する設定

 

Job実行部分

レコードのjob_name毎に条件分岐を作成します。

今回の検証ではすべての条件分岐それぞれでTextのComposeカードでレコードのJob_nameを引用しメッセージを作成するという簡単な処理としました。

Job実行部分の条件分岐例(job_nameごとに分岐し、Composeでメッセージを生成)

 

共通処理部分

今回は共通処理としてSlackチャンネルへメッセージを送信します。

レコードからslack_channelやslack_bot_name、slack_bot_emojiを反映し、メッセージ部分をJob実行部分のアウトプットを指定します。

Slackメッセージ送信カードの設定例(チャンネルID、Bot名・絵文字、送信メッセージをレコードから反映)

 

実行結果

以下のようにそれぞれのJobの時間にそれぞれのjob_nameを反映したメッセージがSlackチャンネルに投稿されています。

2026/03/17(Thu)のため、テーブルに設定したすべてのパターンに一致する状態です。

実行結果として、各Jobの実行タイミングでSlackチャンネルに投稿されたメッセージ一覧(動作確認)

 

まとめ

本記事では、Okta WorkflowsのScheduled flowをジョブごとに増やす際に生じやすい「常時Activeになってしまう」「起動してもすぐにHelper flowへ遷移するだけ」といった無駄を、Job管理Tableに集約して解消する方法を紹介しました。

スケジュール定義をテーブルに寄せ、Main flowが有効なジョブを読み込んでHelper flowへ渡すことで、フロー数を最小限に保ちながら、毎時・毎日指定時刻・毎週指定曜日/時刻・毎月指定日/時刻といった実行タイミングを共通ロジックで判定できます。

一方で、Job実行部分がIf/ElseIf内に集約されるため、処理が複雑になると可読性や相関関係が分かりにくくなる可能性があります。この課題にはDescriptionの整備や別途ドキュメント化することである程度は軽減が可能です。

この方法は、スケジュール種別が複数あり、今後もJobが増え続けるような運用に特に向いています。反対に、Jobごとの処理が重く、分岐内の実装が複雑になりがちなケースでは、Helper flow内の条件分岐が肥大化しやすいため、適用範囲を見極めるとよいでしょう。