Windows Azureで定期ジョブを実行する方法

先日リリースされたWindows Azure モバイルサービスの新機能に「バックグラウンド ジョブ (CRONジョブ) を簡単にスケジュールできる機能」があります。
このジョブスケジュールの対象は、Windows Azureモバイルサービスに限定されているわけではなく、対象はクラウドサービスでも、Windows Azure SQL Databaseseでも良いのです。

Windows Azureモバイルサービスの新機能と謳われているので、見落としがちな点ですよね。
気づいていなかったのは、温いAzurerな自分だけかもしれませんが(^^;

Windows Azure Webサイトに定期的にアクセスしウォームアップし続ける

Windows Azure Webサイトの無料や共有インスタンスの場合、5~20分ほどアクセスが無かった場合はシャットダウンされてリソースが解放されます。そーすると、初回アクセス時に、レスポンスが遅く感じる事象が発生します。

Windows Azureモバイルサービスのジョブスケジューラーで15分起きにリクエストを送信することで、常時ウォームアップし続けることが可能になります。
素敵だけど、怒られそうな話ですね!

早速、試してみましょう!
ちなみに、無料モードのWindows Azure モバイルサービスでは最大1つのスケジュールタスクしか作成できないので注意してください。

定期的にアクセスするジョブを作成する方法

Windows Azureモバイルサービスを作成し、モバイルサービスのインスタンスを選択します。
インスタンスのヘッダーメニューから「スケジューラー」を選択します。

image

新しいジョブの作成ダイアログが開きますので、任意の情報を入力します。

image

ジョブを作成すると、スケジューラーのジョブ一覧にジョブが表示されます。
ジョブを選択すると、ジョブの詳細画面に遷移します。

image

ジョブの詳細画面のヘッダメニューで、スクリプトを選択します。
image

スクリプトを入力できますので、任意の情報を入力します。
image

ちなみに、ここではhttps://gist.github.com/4392905で公開されているコードを使用しています。

function warmup() {
    warmUpSite("http://tempsdm.azurewebsites.net/");
    warmUpSite("http://sandrino.azurewebsites.net/");
    warmUpSite("http://myapp.cloudapp.net/");
}

function warmUpSite(url) {
    console.info("warming up: " + url);
    
    var req = require('request');
    req.get({ url: url }, function(error, response, body) {
        if (!error) {
            console.info("hot hot hot! " + url);
        } else {
            console.error('error warming up ' + url + ': ' + error);
        }       
    });
}

console.infoやconsole.errorで、Windows Azureモバイルサービスのログ画面にログを出力できます。

保存したら、画面下部のメニューから「一度だけ実行する」をクリックします。

このボタンはタスクが正常に登録できたのか、正しく動作するのかを確認するために使用するボタンです。

ログを確認すると、しっかり出力されていることを確認できますね!

image

他の用途としては…

azureモジュールが用意されていて、azureモジュールを読み込むことでストレージキューなどにアクセスして操作することができます。

https://gist.github.com/7b1859e966fccff81595で公開されているコードを参照するとわかりやすいですね!

function sendmessagetoqueue() {
    var azure = require('azure');
    var queueService = azure.createQueueService("myaccount", "mykey");    
    queueService.createQueueIfNotExists("work", function(error){ });
    queueService.createMessage("work", "SendNewsletter", function(error){});
}

azureモジュールをrequireで呼び出して、以後それを使いまわしていますね。

簡単にキューを操作できるので、いろいろできそうです。

まとめ

今までWindows Azureで定期ジョブを実行するには、クラウドサービスのホステッドサービスにスタートアップタスクで登録するか、仮想マシンを立ち上げるか……など多少なりとも定期ジョブを実行するために追加タスクが発生していました。

今回、Windows Azureモバイルサービスの一機能としてリリースされたジョブスケジューラーを使用することで、簡単に定期ジョブを実行できるようになるので、色々なことに活用できそうですね。

Windows Azure SQL Databasesのスナップショットバックアップの取得とかにも良さそうですね!

元情報

Job scheduling in Windows Azure