Scheduler

服屋のショッピングモールを運営していると考えてみてください。お客さんが最後の一つを買っていくと、その商品の在庫は0になります。また売るには、取引先に発注を入れなければなりません。取引先には、発注を受け付ける窓口がインターネットに開かれていて、決められたアドレスを呼び出すと発注が通るとします。在庫が0の商品を探して、その窓口を呼び出す処理は、Script で作っておいたとします。それでも、問題が一つ残ります。1日に一度、その Script を押してくれる人が必要です。

Scheduler が、その人の代わりをします。「この Script を毎日同じ時刻に実行せよ」と一度決めておけば、その時刻になるたびに WEEGLOO がひとりでに実行します。誰も画面を開く必要はありません。

目覚まし時計を合わせておくことにたとえられます。何時に鳴らすかを一度決めておけば、その後は毎日その時刻にひとりでに鳴ります。このページでは、Scheduler に何を決めておくのか、時刻をどう書くのか、そしてそれが誰の権限で実行されるのかを、服屋の「在庫発注」の例で見ていきます。

決めておくのは三つ

Scheduler 一つに決めておくことは、多くありません。

  • 名前: 後で一覧から見分けるためのものです。例: 在庫発注
  • 実行する Script: その時刻になったら実行する Script を一つ選びます。一つの Scheduler は一つの Script だけを実行します。
  • いつ実行するか: 下の いつ実行するかの書き方 で扱います。

ここに、オン・オフを切り替えるスイッチがもう一つあります。オフにしておくと、保存はそのまま残り、実行だけがされません。取引先が休む期間のように、しばらく止めておきたいときも、消さずに済みます。

実行する Script は、後から変更できません。 別の Script を実行するには、Scheduler を新しく作ります。名前と時刻、オン・オフは、いつでも直せます。

いつ実行するかの書き方

時刻は五つの欄で書きます。左から 分・時・日・月・曜日 で、* は「すべて」という意味です。

分  時  日  月  曜日
0   9   *   *   *      → 毎日9時ちょうど

よく使う形は、次のとおりです。

書く値いつ実行されるか
0 0 * * *毎日0時ちょうど
30 9 * * *毎日9時30分
0 * * * *毎時ちょうど
*/10 * * * *10分ごと
0 0 * * 1毎週月曜日0時ちょうど
0 0 1 * *毎月1日0時ちょうど

時刻は標準時(UTC)で読み取られます。 地域時間ではないので、地域時間で何時に実行するかを決めたうえで、その差の分だけ計算して書きます。標準時より9時間進んだ地域であれば、そこの朝9時が 0 0 * * * です。在庫発注はこの値、つまり標準時の0時に実行されます。

日付や曜日が入った時刻は、この計算で日付までずれることがあるので、もう一度確認してください。

一度も実行されない値は、保存できません。 たとえば 0 0 30 2 * は2月30日を指しますが、そんな日は来ないので、保存しようとすると値を確認し直すよう求める応答が返ります。

誰の権限で実行されるか

SchedulerScript を実行するとき、その実行は その Scheduler を作った人 が行ったものとして扱われます。在庫発注 Script が商品を読み、取引先を呼ぶことも、作った人の資格で起こります。

そのため、作ったり直したりするには、二つの権限が一緒に必要です。

  • ロール(SpaceRole)に Scheduler の設定権限がなければなりません。
  • その Scheduler が実行する Script を実行する権限がなければなりません。

二つ目は、作るときだけでなく、直すときにも確認されます。実行する時刻を変えることは、その Script をいつ実行するかを決めることであり、オフになっているものをオンにすることは、実行を始めることだからです。

作った人が後でその権限を失うと、Scheduler はオフになります。 担当者がチームから外れたり、ロールが狭まったりすると、次の実行時刻に WEEGLOO がそれを確認し、実行しないままスイッチをオフにします。権限が戻ってもスイッチは自動ではオンにならないので、自分でもう一度オンにしなければなりません。

実行履歴を確認する

Scheduler が実行されるたびに、記録が一つずつ残ります。その回が成功したのか失敗したのかが、ここに残ります。昨夜の発注が実際に出たかどうかは、この記録で確認します。

一覧には、各回の実行時刻と結果が表示されます。実行の途中で失敗した回を押すと、その理由を詳細画面のエラー領域でそのまま見ることができます。 かかった時間と一緒に表示されるので、取引先の窓口が応答しなかったせいなのか、別の問題なのかを、この文面で見分けられます。

成功した実行の記録は1時間、失敗した実行の記録は3日後に消えます。 失敗した側が長く残るのは、後で見に行くことになる記録がそちらだからです。発注の記録のように、それより長く残しておきたい値であれば、Script の中で Content として保存してください。

失敗しても、Scheduler は止まりません。取引先の窓口がしばらく応答せず失敗したなら、その回だけが失敗として記録され、次の時刻にまた実行されます。

Webhook と何が違うか

どちらも、人が押さなくても Script を実行するという点は同じです。分かれるのは 何が実行を呼び起こすかです。

  • Webhook出来事が起きたときに実行します。商品が登録されると、コンテンツが発行されると。
  • Scheduler時刻になると実行します。何も起きなくても、毎日その時刻に。

在庫発注は、一見すると Webhook が合っているように見えます。在庫が0になるその瞬間に発注すればよいからです。ところが、同じ商品の在庫が一日のうちに0になり、返品で戻ってきて、また0になると、そのたびに発注が出ます。一日に一度まとめて見れば、商品一つに発注も一つです。「起きるたび」ではなく「まとめて一度」であるべき処理が、Scheduler の出番です。

逆に、商品が登録される瞬間に説明を埋める処理は、遅らせる理由がないので Webhook です。

知っておくこと

  • 数に上限があります。 一つの Organization が持てる Scheduler の数が、料金プランごとに決まって います(Free 1個、Basic 5個、Pro 30個、Enterprise 無制限)。上限に達すると新しく作れなくなり、使っていない ものを消すと、一枠がまた空きます。
  • 実行回数は Script と分け合います。 Scheduler がすることは Script の実行なので、一度実行する たびに、料金プランの Script 実行回数を一つ使います。Scheduler だけの別の上限はありません。その回数を 使い切ると、以降に到来する Scheduler は実行されずにオフになります。この場合は、なぜ始められなかったのか が実行履歴に残ります。翌月になっても自動ではオンにならないので、自分でもう一度オンにしなければなりません。
  • 逃した実行は、あとから埋め合わせません。 点検などで一日抜けたからといって、翌日に二度実行することは ありません。次の時刻からまた実行します。
  • ある Scheduler が使っている Script は消せません。 その Scheduler をオフにしてあっても 同じです。その Scheduler を先に消してから、Script を消してください。

コンテンツスタジオで管理する

Scheduler は、コンテンツスタジオの Scheduler 画面で作って管理します。一覧には、作っておいた Scheduler が、名前、実行する Script の名前、cron 式、次回の実行、状態、更新日時、更新者と一緒に一行ずつ表示されます。

Scheduler 一覧画面。「在庫発注」が名前・Script・cron 式・次回の実行・状態 Active と一緒に一行で表示されている状態。cron の欄の見出しに UTC、次回の実行の欄の見出しに UTC±N の表示

画面は、二つの欄がそれぞれどの時計なのかも一緒に知らせてくれます。cron 式がある欄の見出しには UTC が、次回の実行 欄の見出しには見ている人のタイムゾーンが UTC±N のように付きます。そのため、保存された値と、それが自分の時間で何時なのかを、同じ行で見ることができます。標準時より遅れたタイムゾーンでは、次回の実行 が前日に見えることがあります。

新しい Scheduler は、一覧の右上の 作成 ボタンで作ります。

  1. 一覧の右上の 作成 ボタンを押してください。
  2. 名前の欄に 在庫発注 を入力してください。
  3. 有効 をオンにしておいてください。オフにしておくと、保存はされても実行されません。
  4. 実行する Script で、在庫発注の Script を選んでください。
  5. 実行周期直接入力 を選んでください。
  6. 五つの欄に 0 0 * * * を入力してください。
  7. 右上の 作成 ボタンを押して保存してください。

画面は、入力した式が実際にいつ実行されるのかも、すぐに見せてくれます。直接入力した式は標準時(UTC)で保存されるという案内と一緒に、保存される cron 値と次回の実行時刻のプレビューが表示されます。

新しい Scheduler 作成画面。名前「在庫発注」、有効オン、実行する Script「在庫発注」、実行周期の直接入力タブに 0 0 * * * を入れた状態

一覧から Scheduler を一つ押すと、その Scheduler の詳細画面が開きます。詳細画面は 実行ログ設定 の二つのタブに分かれ、最初に開くと 実行ログ が表示されます。実行ログ タブには、これまで実行された回が一行ずつ表示され、一行ごとに 実行時刻結果・その回を指す リクエスト ID が表示されます。結果 の欄で、成功した回だけ、または失敗した回だけを選んで見ることができ、ログを更新 を押すと、たった今実行された回まで読み込み直します。

Scheduler 詳細画面の実行ログタブ。「在庫発注」の実行 3 件(失敗 2 件、成功 1 件)が実行時刻・結果・リクエスト ID の列で表示されている状態

一つの回を押すと、その回の詳細が開きます。ここでは 結果 と一緒に ステータスコード、かかった時間(所要時間)、その回が誰の資格で実行されたか(Run as)が表示され、失敗した回であれば、その理由が エラー 領域にそのまま表示されます。上部には、この回がどの Scheduler のもので、どの Script を実行したのかを知らせるバッジがあり、その Script へのリンクと、同じ回を Script 側の記録で見る Script ログで見る リンクが一緒にあります。

Scheduler 実行ログ詳細画面(失敗した回)。実行時刻・リクエスト ID と一緒に、結果 Failure・ステータスコード・所要時間・Run as が表示され、エラー領域に失敗の理由が見える状態

次にすること

  • Script: Scheduler が実行する Script を作る方法と、取引先の窓口のように外部のサービスを呼ぶ動作を組み込む方法を扱います。
  • Webhook: 決められた時刻ではなく、決めておいた変化が起きたときに実行されるようにする方法を扱います。
  • ロールと権限: Scheduler の設定権限と Script の実行権限をロールに組み込む方法を扱います。