Windows Azure モバイルサービス - スケジューラのTIPS について 〜その1 モジュール読み込み編〜
3/4 にWindows Azure Updates: Android Support, SQL Reporting Services, Active Directory, More…にてAndroid のサポートも発表され、ますます機能改善がはかられているモバイルサービスだが、スケジューラ機能が存在することはご存じだろうか。スケジューラの簡単な実行方法については蒼の王座 - Windows Azureで定期ジョブを実行する方法を確認してほしい。
以下は、私がスケジューラでスクリプトを作成して得たノウハウだ。参考になれば幸いだ。
簡単な利用方法
「モバイルサービス - スケジューラ」から新規にスケジューラを作成し、以下のコードを作成する。
var azure = require('azure'); var ServiceClient = azure.ServiceClient; var TableQuery = azure.TableQuery; var tableName = 'posts'; var partition = 'part1'; var rowkey = 'bbbbbb'; function mycronjob() { console.log("starting job...."); var tableClient = azure.createTableService("<ストレージサービス名>", "<ストレージサービス・キー>", "http://<ストレージサービス名>.table.core.windows.net/"); tableClient.createTableIfNotExists(tableName, function (err, created) { console.log('Setting up demo data ...'); var now = new Date().toGMTString(); var entity = { PartitionKey: partition, RowKey: rowkey + now, title: 'Post one', body: 'Body one', created_at: now }; tableClient.insertEntity(tableName, entity, null, function(err){ console.log(err); }); }); }
ローカルでのデバッグ方法
上記のコードを見てお気づきの方はいると思うが、どうやらスケジューラのランタイムは Node.js の様だ。実際、上記のコードに最後の一行(メソッドキック用の「mycronjob();」)を足し、以下のコードを node.exe script.js 等でローカル実行しても同じ結果が得られる。
var azure = require('azure'); var ServiceClient = azure.ServiceClient; var TableQuery = azure.TableQuery; var tableName = 'posts'; var partition = 'part1'; var rowkey = 'bbbbbb'; function mycronjob() { console.log("starting job...."); var tableClient = azure.createTableService("<ストレージサービス名>", "<ストレージサービス・キー>", "http://<ストレージサービス名>.table.core.windows.net/"); tableClient.createTableIfNotExists(tableName, function (err, created) { console.log('Setting up demo data ...'); var now = new Date().toGMTString(); var entity = { PartitionKey: partition, RowKey: rowkey + now, title: 'Post one', body: 'Body one', created_at: now }; tableClient.insertEntity(tableName, entity, null, function(err){ console.log(err); }); }); } mycronjob();
お勧めの開発の流れは以下だと思われる。
- ローカルの Node.js ランタイムで操作
- 管理ポータルの「一度だけ実行」でテスト
- 管理ポータルで運用に乗せる
モジュール読み込みについて
管理ポータルで利用可能な Node.js モジュールはかなり制限があり、調査なしに require すると以下のように失敗する場合がある。
ログ エントリの詳細 エラー Error in script '/scheduler/mycronjob.js'. Error: The module 'http' cannot be used from within a script. [external code] at </scheduler/mycronjob.js>:1:25 [external code]
また、現時点で私が失敗した require を以下に記載しておく。
- uuid
- http
- io
参考リンク
その他、利用可能?なスクリプトに関しては以下を参考にしていただきたい。
- MSDN - Mobile Services server script reference http://msdn.microsoft.com/en-US/library/windowsazure/jj554226
- sandrinodimattia https://gist.github.com/sandrinodimattia
- sandrinodimattia / warmup.js https://gist.github.com/sandrinodimattia/4392905