しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web Apps で crontab っぽく WebJobs のスケジュール実行が出来るようになっていた

公式サイトでは全く触れられていないっぽいですが、中の人ブログや Kudu のコミットログを見たところ、WebJobs で Azure Scheduler を使わずにスケジュール実行する機能が追加されていました。

調べたところ、一応 Kudu の Wiki にひっそりと情報が載っていました。

Scheduling a triggered WebJob
To schedule a triggered WebJob you need to add a schedule property to the settings.job file. The value of the schedule is cron expression that has 6 fields to represent the schedule: {second} {minute} {hour} {day} {month} {day of the week} .

Web Jobs · projectkudu/kudu Wiki · GitHub

Web Apps チームの Amit Apple 氏のブログには、さらに詳細な説明がありました。

Scheduling Azure WebJobs with cron expressions

これまでは Azure Scheduler でジョブを作成していましたが、crontab と同じ記法を使ってスケジュール実行出来ます。実行には Always On が必要ですが、これまで cron を使っていた人にも分かりやすいですね。

Kudu でスケジュール実行する機能は、Internal WebJob Scheduler と言うらしいです。簡単に比較します。

Azure Scheduler Internal WebJob Scheduler
費用 5 ジョブまで無料 標準モード必須、ただし追加料金は不要
制約 無料モードでは最小実行間隔が 1 時間 タイマー駆動なので Always On が必須
メリット Visual Studio でのサポート crontab 記法で細かい制御が可能(曜日指定とか)
デメリット ジョブの設定を別に行う必要がある 挙動が IIS のワーカープロセスに依存

既に標準モードを使っている場合には Internal WebJob Scheduler の方が使い勝手が良い気がしました。

気になる使い方は、WebJob として実行するアプリケーションと同じ場所に settings.job というファイルを作成して、中に crontab 形式でスケジュールを定義するだけでした。

{"schedule": "15 * * * * *"}

こんな感じに書けば毎分 15 秒に WebJob が実行されるようになります。

settings.job ファイルは Visual Studio に追加した後、出力ディレクトリにコピーするように設定しておきます。忘れると settings.job だけがデプロイされなくなります。

これで WebJob としてデプロイすると、Kudu が自動的にスケジュール実行してくれます。ちなみに Git などを使って WebJob をデプロイする方法については以下の記事を参照してください。

GitHub を使って WebJob をデプロイして、Azure WebJobs Dashboard で実行履歴を確認してみました。

設定した通り、ちゃんと 1 分ごとに WebJob が実行されていることが確認できました。

Azure Scheduler を使う場合にはポータルや Visual Studio から作成する必要があり、正直なところ結構使いにくかったです。しかし Internal WebJob Scheduler を使えば、GitHub などからデプロイするだけでスケジュール実行が可能になるので、かなり便利に使えそうです。