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

Windows Azure

Windows Azure Advent Calendar jp: 2012の22日目の投稿です。

Windows Azureのデータセンターは、3か国8か所に設置されています。アプリケーションデプロイ時、使用するデータセンターを選択します。どのデータセンターを使用したら良いのかを考える際の指標の一つが、ネットワークレイテンシーです。
では実際、どれぐらいのネットワークレイテンシーがあるのでしょうか?

実際に計測した結果を、動画にて提供します。

[youtube]http://youtu.be/xSl_zy5o6bg[/youtube]

SQL Azure

SQL Data Sync 2012年12月のサービスアップデートがリリースされました。主な更新内容は次の通りです。

  • Windows Azure ポータルにSQL Data Syncがリリースされました。
  • データセンター間の同期性能を改善しました。
  • 全体的な内部処理の性能を改善しました。

徐々に、旧ポータルを使用しなくても困らないように準備が進んでいますね!素敵素敵。

Windows Azureポータルでの操作

SQLデータベースの中に、ヘッダメニューに「SYNC」とボトムメニューに「同期の追加」というメニューと、「新しい同期グループ」、「新しい同期エージェント」というサブメニューが用意されています。

image

同期サーバーと同期グループの追加(クラウドとクラウド)

image

image

image

同期エージェント(クラウドとオンプレミス)

image

 

情報源

New in SQL Data Sync

SQL Azure

SQL Server 2012 データ層アプリケーションフレームワーク(DACFx V3)で提供されているWindows Azure Import/ExportサービスはWindows Azure SQL Databasesの移行や論理バックアップ・リストアをするためのクラウドサービスです。この機能は、Windows Azure 管理ポータルとHTTPエンドポイント経由で使用できます。

最近、このサービスのアップデートで、Export処理時のバリデーションチェックを強化しました。
エクスポートしたBACPACsをAzure上の新しいデータベースにインポート(リストア)できることを保証するためにバリデーションを改善しました。しかし、このバリデーションの改善の影響で、エクスポートの失敗を見る機会が増えるかもしれません。オブジェクトの定義に、3つの識別子の定義名(DBName.dbo.myTableみたいなの)を使用していると失敗します。

シナリオ

HTTPエンドポイントやWindows Azure管理ポータルからImport/Exportサービスを使用してWindows Azure SQL Databasesをエクスポートすると失敗する。

現象

エクスポート処理に失敗し次のようなエラーメッセージが表示される。

“Exception Microsoft.SqlServer.Management.Dac.Services.ServiceException: Error encountered during the service operation. Inner exception Microsoft.SqlServer.Dac.DacServicesException: Validation of the schema model for data package failed. Error SQL71562: Procedure: [dbo].[SampleProcedure] has an unresolved reference to object [MyDB].[dbo].[TestTable]. External references are not supported when creating a package from this platform.”

原因

オブジェクト定義で、3つの識別子の参照名を含んでいると、データベースのエクスポートがバリデーションチェックではじかれて失敗します。

理由

DACFxは、オブジェクト定義(ビューやプロシージャなど)に外部参照を含んているとエクスポート処理を停止します。Azure SQL Databasesはデータベースを跨る外部参照を許可していません。3つの識別子名を含んでいるとデータベースエクスポートを停止します。
もし3つの識別子名を含んだままエクスポートに成功してしまうと、エクスポートしたBACPACをインポートする際に必ずインポートに失敗してしまいます。

3部構成名

SQL Serverではオブジェクトを参照する際に、次のような定義をすることができます。

データベース名.スキーマ.オブジェクト名
(例) AdventureWorks.dbo.userinfo

データベース名とスキーマとオブジェクト名を指定して、オブジェクトを参照します。
この場合、データベース名は同じデータベースでも、外部のデータベースでも指定できます。
しかし、Azure SQL Databasesでは、データベースをまたがった参照はできないので、次のような定義をする必要があります。2つの識別子名

スキーマ.オブジェクト名

詳細は、「オブジェクト名としての識別子の使用」を参照してください

解決方法

データベーススキーマーを変更し、すべての3部構成名を削除し、2つの識別子名に変更します。

外部参照を削除してスキーマーを修正するための多くのツールや手段があります。
たとえば、SQL Server Data Tools(SSDT)を使用することも可能です。SSDTでは、Azure Databaseからデータベースプロジェクトを作成すると、対象プロジェクトにSQL Azureを設定します。Azure用のスキーマバリデーションチェックをし、外部参照に3部構成名を使用しているとエラーとしてエラー一覧に表示されます。

情報源

Windows Azure Import/Export Service and External References

SQL Azure

次期Entity Framework 6で搭載予定の機能に

Windows Azure SQL Databaseのようなクラウド環境で動作するデータベースとの接続が切断されてしまった際に自動的に再接続することでコネクションの弾力性を向上させる

が上がっています。

素敵ですね!
逆に言うと、Entity Framewaork 5までは、自分で作りこむ必要があるのですね!
知らなかった!

情報源

赤副ガスリー副社長のMSDNブログ「Entity Framework 6: Alpha2 Now Available
搭載予定だから、今回のα2には入ってないのかな。