Windows Azure Webサイトを裏で動かしているKuduにはWeb Jobsという機能があります。そのまんま、Webアプリケーションとは別に指定されたジョブを実行することができる機能なのですが、この間までこの機能は直接KuduのAPIを叩いて設定する必要がありました。
面倒ですね。でも大丈夫。今日のUpdateでAzureの管理ポータル上から設定することができるようになりました。
Web Jobsの仕組みとしては、ジョブとして実行される対象を含めた一連のファイルをWeb Jobs用のフォルダにアップロードし、あとはREST APIでJOBの登録やスケジュール登録などを行えば、Jobが起動するというごく単純なものです。
ジョブのルールとしては、キックされるJobは run.{拡張子} という形式で(ファイル名で)指定フォルダに存在する必要があります。
(利用できるのはWindowsのコマンドで利用できる .cmd .bat .exe 、それからbashで利用できる .sh 、PHPの .php 、 python の .py 、それからNode.jsの .js です。
なのでバッチファイルであれば run.bat といったファイル名で存在する必要があります。
細かい内容はこちらを参照ください。
では実際に管理ポータルからジョブの追加をしてみましょう。
ジョブの実行方法は
- 連続的に実行
- スケジュールに従って実行 (※Preview機能のSchedulerが有効になっている必要があります)
- オンデマンドで実行
の3種類から選択できます。
コンテンツ(ZIPファイル)となっているのは、ジョブ(Run.xxx)ファイルとそれを実行するのに必要な一連のファイルをZipでまとめたものです。
今回は以下のような内容のRun.batを作成し、Zipファイルにまとめました。
@echo off time /t >> %HOME%\site\test.txt
現在時刻を追記でWebサイト上のテキストファイルに出力するだけの単純なものです。
このRun.batファイルが含まれるZipファイルをアップロードします。
連続的に実行の場合
前のジョブが終わってから1分置きに実行されるようですね。ログファイルのリンクをクリックするとログを見ることができます。
[01/17/2014 05:38:12 > b98a5e: SYS INFO] Status changed to Starting [01/17/2014 05:38:12 > b98a5e: SYS INFO] Run script 'run.bat' with script host - 'WindowsScriptHost' [01/17/2014 05:38:12 > b98a5e: SYS INFO] Status changed to Running [01/17/2014 05:38:12 > b98a5e: SYS INFO] Status changed to Success [01/17/2014 05:38:12 > b98a5e: SYS INFO] Process went down, waiting for 60 seconds [01/17/2014 05:38:12 > b98a5e: SYS INFO] Status changed to PendingRestart [01/17/2014 05:39:12 > b98a5e: SYS INFO] Run script 'run.bat' with script host - 'WindowsScriptHost' [01/17/2014 05:39:12 > b98a5e: SYS INFO] Status changed to Running [01/17/2014 05:39:12 > b98a5e: SYS INFO] Status changed to Success [01/17/2014 05:39:12 > b98a5e: SYS INFO] Process went down, waiting for 60 seconds [01/17/2014 05:39:12 > b98a5e: SYS INFO] Status changed to PendingRestart
うまく実行されてるようですね。実際にジョブの中で吐き出しているテキストファイルの中身をみてみましょう。
期待通りな感じです。注目すべきは発行してるWebアプリケーションでは通常触れないwwwrootとかと同一の階層にファイルができているところでしょうか。
オンデマンドで実行
オンデマンドで実行を選択すると以下のようになります。
追加されるとスケジュールは要求時になって動いていない状態になります。メニューからRunOnceを選択して実行してみましょう。
実行時刻と結果が表示されてちゃんと実行されました。ログファイルのリンクをクリックすると詳細を見ることができます。
[01/17/2014 05:50:21 > b98a5e: SYS INFO] Status changed to Initializing [01/17/2014 05:50:21 > b98a5e: SYS INFO] Run script 'run.bat' with script host - 'WindowsScriptHost' [01/17/2014 05:50:21 > b98a5e: SYS INFO] Status changed to Running [01/17/2014 05:50:22 > b98a5e: SYS INFO] Status changed to Success
Downloadリンクをクリックすると連続的に実行と同じようにテキスト形式のログファイルを得ることができます。
再度実行したい場合は管理ポータルからRun Onceするだけです。
スケジュールに従って実行の場合
スケジュールに従って実行させる場合、スケジューラーのリージョンを選択します。(スケジューラーのPreview機能がアクティブになっている必要があります)
※コレクションが読み取れないなどのエラーになる場合はしばらく時間を置きましょう。(管理ポータルのスケジューラーのところにコレクションが表示されてればOK)
あとはスケジューラーのジョブと同じように定期的か指定時刻かなどの設定を行います。
設定後はこのようになります。
違うのはスケジュール欄にリンクがついたことですね。ログファイルはオンデマンドで実行と同じように見ることができます。
ちゃんと設定した通り5分置きに実行されてますね。
さてスケジュールでの実行はWindows Azure スケジューラーを使っているという話なので、実際にどうなっているか見てみましょう。
こんな感じでコレクションができていました。後は通常通りWindows Azureスケジューラーと変わりません。わかりやすいですね。
ちなみにWeb Jobsから作成するとどうも標準プランで作成されるようです。気になる人は無料に変更しておきましょう。
という感じで簡単お手軽にWebサイト上で、Webアプリケーションとは別に定期的にある程度自由なジョブを実行させることができる環境ができました!
定期的にWebアプリケーションにPing飛ばして~というのがわかりやすい使い方でしたが、そちらはAlways Onが来たので不要になりましたね。
あ、Web JobsはKudu上で動作するのであまり負荷かけたりするとCPU時間などの制限に引っかかったりするので注意が必要です。
おまけ
ちなみにWeb Jobsで設定した内容はKuduのWeb Jobs用REST APIやKudu Console上で見ることができます。
上述の3つの設定をした際の結果は以下のような感じです。
ここからダウンロードすることもできます。
[ { "extra_info_url": "https://buchitest01.scm.azurewebsites.net/JobRuns/history.html?jobName=Test2", "history_url": "https://buchitest01.scm.azurewebsites.net/jobs/triggered/Test2/history", "latest_run": { "duration": "00:00:00.4143497", "end_time": "2014-01-17T05:52:28.6286918Z", "error_url": null, "id": "201401170552281986", "output_url": "https://buchitest01.scm.azurewebsites.net/vfs/data/jobs/triggered/Test2/201401170552281986/output.log", "start_time": "2014-01-17T05:52:28.2143421Z", "status": "Success", "url": "https://buchitest01.scm.azurewebsites.net/jobs/triggered/Test2/history/201401170552281986" }, "name": "Test2", "run_command": "run.bat", "type": "triggered", "url": "https://buchitest01.scm.azurewebsites.net/jobs/triggered/Test2" }, { "extra_info_url": "https://buchitest01.scm.azurewebsites.net/JobRuns/history.html?jobName=Test3", "history_url": "https://buchitest01.scm.azurewebsites.net/jobs/triggered/Test3/history", "latest_run": { "duration": "00:00:00.4331747", "end_time": "2014-01-17T06:23:50.9857575Z", "error_url": null, "id": "201401170623505525", "output_url": "https://buchitest01.scm.azurewebsites.net/vfs/data/jobs/triggered/Test3/201401170623505525/output.log", "start_time": "2014-01-17T06:23:50.5525828Z", "status": "Success", "url": "https://buchitest01.scm.azurewebsites.net/jobs/triggered/Test3/history/201401170623505525" }, "name": "Test3", "run_command": "run.bat", "type": "triggered", "url": "https://buchitest01.scm.azurewebsites.net/jobs/triggered/Test3" }, { "detailed_status": "b98a5e - Stopped ", "extra_info_url": "https://buchitest01.scm.azurewebsites.net/vfs/data/jobs/continuous/Test/job.log", "log_url": "https://buchitest01.scm.azurewebsites.net/vfs/data/jobs/continuous/Test/job.log", "name": "Test", "run_command": "run.bat", "status": "Stopped", "type": "continuous", "url": "https://buchitest01.scm.azurewebsites.net/jobs/continuous/Test" } ]
アップロードしたジョブしたジョブはどこにあるかというと、wwwroot\App_Data\jobsフォルダ以下にあります。
スケジュールの種類によって分けられて、ContinuousとTriggeredフォルダ以下にJob名でフォルダが存在し、そこにアップロードしたZipの中身が展開されています。
また各ジョブの結果やステータスは%HOME%\data\jobs フォルダにあります。
構成はだいたい同じですね。
というわけでぜひぜひ活用してみてください。
ピンバック: データ登録・更新を Windows Azure Web サイトの Web ジョブで行う | 徒然なブログ
ピンバック: Windows Azure サービス 再整理 第二回 「コンピューティング ”Web サイト”」 | 日々のScrapbook
ピンバック: Windows Azure サービス 再整理 第二回 「コンピューティング ”Web サイト”」 | Scrapbook