Part 3. Hello World, Windows Azure アプリケーションの開発 その 3


※ 本エントリは その 2 の続きです。(エントリが長すぎて投稿できなかったため分割しています)

[Azure 運用環境への展開]

さて、開発用ファブリック上で Web アプリケーションを開発・デバッグし終えたら、いよいよこれを本番環境である Windows Azure 運用環境へとアップロードします。この運用環境への配置(デプロイ)のためには、主に以下の作業が必要になります。

  • Windows Azure プラットフォームのアカウントの取得
  • SQL Azure データベースサービスへの移行
  • Windows Azure ストレージサービスへの移行
  • Windows Azure コンピュートサービスへの移行

このうち、1 点目のアカウント取得に関しては、すでに様々な blog などで紹介されていること、また人によって利用可能なオプション(例えば MSDN 特典など)が異なると思いますので、本エントリでは解説しません。利用可能なオプションについては、Windows Azure の PM (プロダクトマネージャ、要するに製品担当)である馬田さんの blog や、クラウド系エバンジェリストとして有名な砂金さんの blog などを参考にしてください。ここでは、アカウントを取得した後の作業を中心に解説していくことにします。

SQL Azure データベースサービスへの移行

まずはデータベースの移行です。SQL Azure データベースサービスを管理するには、まず管理サイトである https://sql.azure.com/ にアクセスし、以下の作業を行います。

  • SQL Azure プロジェクトを作成し、管理者アカウントを作成する。
    作成時にデータセンタを選択することになりますが、通常は東南アジアのデータセンタを選択すればよいでしょう。
    image
    (ってあれ....今、地図を見たら東アジアの香港の方が近い気がする....orz)
  • ファイアウォールの設定を緩和する。
    SQL Azure にアクセスするためには、TCP/IP 1433 ポートでの直結が必要になります。SQL Azure の管理のためには、SQL Server Management Studio から SQL Azure データベースにつなぐ必要がありますので、① 会社内からアクセスする場合には、自社の IT 部門にお願いしてポート 1433 を開けてもらい、② SQL Azure データベースサービス側については、管理サイト(https://sql.azure.com/ )の管理画面から、ファイアウォール設定の緩和を行います。
    image
    image
    ※ (参考) SQL Azure 側のファイアウォールについては、設定変更の反映に約 5 分ほどの時間がかかります。すぐに設定が反映されなくても、しばらく待っていただければ設定が反映されます。
    ※ (参考) 実際のシステム開発では、自社側のポート 1433 を開けることが難しいことが多いと思います。このような場合には、(このあとに述べる初期作業なども含めて)一時的に自宅から作業するなどの工夫を行ってください。
  • SQL Azure のサーバ名称などをメモしておく。
    作成した SQL Azure サーバには、ランダムな名称が付与されますので、これをメモしておいてください。ちなみに下図の例では、サーバに対して “mbkz89u87g” という名称が付与されたため、この SQL Azure にアクセスする際には、”mbkz89u87g.database.windows.net” という名称を使う形になります。(ちなみにこのサーバ名称については自分で決めることはできません;。悪しからず;。)
    image
  • データベースを作成する。
    次に、SQL Azure ポータルサイトからデータベースを作成します。作成時には、データベース名と最大容量を指定しますので、ここでは pubs データベースを 1GB で作成します。
    image
    ※ (注意) 後述しますが、SQL Azure データベースの課金は、このデータベースごとに発生します。このため、むやみにデータベースの数を増やさないようにしてください。また、1GB のもの(Web Edition)と、10GB のもの(Business Edition)では課金額が異なりますので、こちらも併せて注意してください。
  • SQL Server Management Studio から接続する。
    次に、SQL Server Management Studio から SQL Azure データベースに接続します。接続の際には、① サーバ名として、先のサーバ名(xxx.database.windows.net)を使う、② SQL Server 認証を使う、③ オプション画面において、接続先とするデータベースを選ぶ、を行ってください。
    image 
    ※(重要) ③の作業(接続時に接続先のデータベースを選択する)は極めて重要です。
    一般に、通常の SQL Server では、どこかのデータベースに接続したあと、use コマンドを利用して、同一インスタンス内の別データベースに切り替えることができましたが、SQL Azure データベースサービスではこれができません。つまり、SQL Azure では、接続のときに接続先となるデータベースを決める必要があり、一度接続すると、use コマンドで接続先データベースを切り替えることができません。これは SQL Azure データベースサービス特有の制限事項なので注意してください。
    ※(参考) 利用する SQL Server Management Studio のバージョンにより、利用できる機能範囲が変わります。2008 R2 November CTP 以降では、サーバエクスプローラを使ってテーブル一覧などを表示することができるようになりましたが、それ以前のバージョンのものだと、クエリの発行しかできません。サーバエクスプローラなどを使いたければ、最新の Management Studio を使うようにしてください。
  • テーブルを作成する。
    次に、SQL Azure データベースサービス上にテーブルを作成します。クエリウィンドウから CREATE TABLE 命令などを発行し、テーブルを作成してください。(今回は簡単のため、authors テーブル、publishers テーブル、titles テーブル、titleauthor テーブルの 4 つだけ作成することにします。)
    なお、SQL Azure データベースはアーキテクチャ的な特徴から、SQL Server データベースに比べてテーブルに関して仕様上の制限がいくつかあります。例えば、① ユーザ定義型が使えない、② クラスタ化インデックスを持たないテーブル(ヒープと呼ばれます)は作成できない、などです。今回、サンプルで利用している pubs データベースはこれらの制限に一部ひっかかるところがありますので、そのまま SQL Azure データベース上に移行することができません。このため、スキーマなどを一部修正したテーブルを利用します。作成時は以下のスクリプトを利用してください。
   1: CREATE TABLE authors
   2: (
   3:    au_id          varchar(11)
   4:          CHECK (au_id like '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]')
   5:          CONSTRAINT UPKCL_auidind PRIMARY KEY CLUSTERED,
   6:    au_lname       varchar(40)       NOT NULL,
   7:    au_fname       varchar(20)       NOT NULL,
   8:    phone          char(12)          NOT NULL
   9:          DEFAULT ('UNKNOWN'),
  10:    address        varchar(40)           NULL,
  11:    city           varchar(20)           NULL,
  12:    state          char(2)               NULL,
  13:    zip            char(5)               NULL
  14:          CHECK (zip like '[0-9][0-9][0-9][0-9][0-9]'),
  15:    contract       bit               NOT NULL
  16: )
  17: GO
  18:  
  19: CREATE TABLE publishers
  20: (
  21:    pub_id         char(4)           NOT NULL
  22:          CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED
  23:          CHECK (pub_id in ('1389', '0736', '0877', '1622', '1756') OR pub_id like '99[0-9][0-9]'),
  24:    pub_name       varchar(40)           NULL,
  25:    city           varchar(20)           NULL,
  26:    state          char(2)               NULL,
  27:    country        varchar(30)           NULL
  28:          DEFAULT('USA')
  29: )
  30: GO
  31:  
  32: CREATE TABLE titles
  33: (
  34:    title_id       varchar(6)
  35:          CONSTRAINT UPKCL_titleidind PRIMARY KEY CLUSTERED,
  36:    title          varchar(80)       NOT NULL,
  37:    type           char(12)          NOT NULL
  38:          DEFAULT ('UNDECIDED'),
  39:    pub_id         char(4)               NULL
  40:          REFERENCES publishers(pub_id),
  41:    price          money                 NULL,
  42:    advance        money                 NULL,
  43:    royalty        int                   NULL,
  44:    ytd_sales      int                   NULL,
  45:    notes          varchar(200)          NULL,
  46:    pubdate        datetime          NOT NULL
  47:          DEFAULT (getdate())
  48: )
  49: GO
  50:  
  51: CREATE TABLE titleauthor
  52: (
  53:    au_id          varchar(11)
  54:          REFERENCES authors(au_id),
  55:    title_id       varchar(6)
  56:          REFERENCES titles(title_id),
  57:    au_ord         tinyint               NULL,
  58:    royaltyper     int                   NULL,
  59:    CONSTRAINT UPKCL_taind PRIMARY KEY CLUSTERED(au_id, title_id)
  60: )
  61: GO
  • データを移行する。

    最後に、各テーブルのデータを SQL Azure データベース上にコピーします。データのコピーの方法は SSIS (SQL Server Integration Service)などを使っていただくのが正しいやり方になりますが、ここでは簡単のために、非接続型データアクセスを使ったコンソールアプリケーションを書いて、さくっとアップロードしてしまいましょう。以下のようなコードを使っていただければ、比較的簡単にデータをコピーすることができます。(※ サーバ名などは適宜、ご自身のものに変更してください。)
   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Data;
   6: using System.Data.SqlClient;
   7:  
   8: namespace ConsoleApplication3
   9: {
  10:     class Program
  11:     {
  12:         static void Main(string[] args)
  13:         {
  14:             // 手元のファイルアタッチデータベースの SQL Server 上の
  15:             // データを、SQL Azure 上にコピーする
  16:             SqlConnection sqlcon1 = new SqlConnection(@"Server=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\pubs.mdf;Integrated Security=true;User Instance=true");
  17:             SqlConnection sqlcon2 = new SqlConnection(@"Server=tcp:mbkz89u87g.database.windows.net;Database=pubs;User ID=nakama@mbkz89u87g;Password=xxxxxxxx;Trusted_Connection=False;");
  18:  
  19:             DataSet ds = new DataSet();
  20:  
  21:             // データ読み取り
  22:             SqlDataAdapter sqlda1 = new SqlDataAdapter("SELECT * FROM publishers", sqlcon1);
  23:             SqlDataAdapter sqlda2 = new SqlDataAdapter("SELECT * FROM titles", sqlcon1);
  24:             SqlDataAdapter sqlda3 = new SqlDataAdapter("SELECT * FROM authors", sqlcon1);
  25:             SqlDataAdapter sqlda4 = new SqlDataAdapter("SELECT * FROM titleauthor", sqlcon1);
  26:             sqlda1.Fill(ds, "publishers");
  27:             sqlda2.Fill(ds, "titles");
  28:             sqlda3.Fill(ds, "authors");
  29:             sqlda4.Fill(ds, "titleauthor");
  30:  
  31:             // データ書き込み
  32:             SqlDataAdapter sqlda5 = new SqlDataAdapter("SELECT * FROM publishers", sqlcon2);
  33:             SqlDataAdapter sqlda6 = new SqlDataAdapter("SELECT * FROM titles", sqlcon2);
  34:             SqlDataAdapter sqlda7 = new SqlDataAdapter("SELECT * FROM authors", sqlcon2);
  35:             SqlDataAdapter sqlda8 = new SqlDataAdapter("SELECT * FROM titleauthor", sqlcon2);
  36:             // 更新クエリ生成
  37:             SqlCommandBuilder scb5 = new SqlCommandBuilder(sqlda5);
  38:             SqlCommandBuilder scb6 = new SqlCommandBuilder(sqlda6);
  39:             SqlCommandBuilder scb7 = new SqlCommandBuilder(sqlda7);
  40:             SqlCommandBuilder scb8 = new SqlCommandBuilder(sqlda8);
  41:             // 行ステータスを変更
  42:             foreach (DataTable table in ds.Tables)
  43:             {
  44:                 foreach (DataRow row in table.Rows)
  45:                 {
  46:                     row.SetAdded();
  47:                 }
  48:             }
  49:             // データアダプタ経由で INSERT 処理を実施
  50:             sqlda5.Update(ds.Tables["publishers"]);
  51:             sqlda6.Update(ds.Tables["titles"]);
  52:             sqlda7.Update(ds.Tables["authors"]);
  53:             sqlda8.Update(ds.Tables["titleauthor"]);
  54:  
  55:             Console.WriteLine("データをコピーしました。");
  56:         }
  57:     }
  58: }
  • アプリケーションの接続文字列を変更し、動作確認を行う。

    現在の Web アプリケーションはファイルアタッチデータベースを利用していますが、SQL Azure データベースを利用するように変更するには、接続文字列を書き換えるだけで済みます。以下のように web.config ファイル内の接続文字列を書き換えて、動作確認を行います。
   1: <configuration>
   2:  
   3:   ... (前略) ...
   4:  
   5:   <!-- 変更前 -->
   6:   <!--<connectionStrings>
   7:     <add name="pubsConnectionString1" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\pubs.mdf;Integrated Security=True;User Instance=True"
   8:         providerName="System.Data.SqlClient" />
   9:   </connectionStrings>-->
  10:  
  11:   <connectionStrings>
  12:     <add name="pubsConnectionString1" connectionString="Server=tcp:mbkz89u87g.database.windows.net;Database=pubs2;User ID=nakama@mbkz89u87g;Password=xxxxxxxx;Trusted_Connection=False;"
  13:         providerName="System.Data.SqlClient" />
  14:   </connectionStrings>
  15:  
  16:   ... (後略) ...
  17:  
  18: </configuration>

以上を行ったあとでクラウドサービスプロジェクトを Ctrl + F5 により実行し、Default2.aspx ページを呼び出すと、SQL Azure データベースからデータを読み出して画面に表示するようになります。

image

以上でデータベースの移行は終了です。続いて、ストレージサービスの移行を行います。

Windows Azure ストレージサービスへの移行

開発用ストレージサービスから、本番環境の Windows Azure ストレージサービスに移行するには、まず Windows Azure ポータルサイト(https://windows.azure.com/)から、ストレージサービスを作成します。

  • Windows Azure ストレージサービスを作成する。

    Azure ポータルサイトの “Create a new service” から、”Storage Account” を選択し、サービスを作成します。

    image

    サービスのラベルを指定する画面がありますが、ここで指定したラベルはポータルサイト上でのみ利用されるラベルなので、適当に付与して OK です。 
    image

    次の画面で指定する “Public Storage Account Name” は、このストレージにアクセスする際の URL になるものなので、わかりやすい名前を付与します。また、ストレージサービスの場所を指定する際には、アフィニティグループを作成しておきます。

    image

    ※(参考) アフィニティグループとは、Windows Azure のコンピュートサービスやストレージサービスを作成する際に、同一のアフィニティグループに属するサービスを極力近づけて配置してもらうための機能です。この後、Windows Azure コンピュートサービスを作成する際に利用します。

  • Primary Key と Secondary Key のうち、好きな方をメモする。

    以上の作業を行うと、Windows Azure ストレージサービスにアクセスするためのキーが 2 つ発行されます。”Primary Key” と “Secondary Key” と書かれていますが、実際にはこの 2 種類のキーはどちらを使っても同じようにストレージにアクセスできますので、どちらか好きな方のキーをメモしておいてください。

    image

    ※ (参考) Primary Key と Secondary Key については、様々な使い分けが考えられます。例えば、① 片方の鍵は Web アプリケーション内に組み込む鍵とし、もう片方の鍵は管理者がツールから使う鍵とする、といった使い分けや、② どちらか一方を普段使いのキーにしておき、もう片方をスペアキーとしておく(もし普段使いのキーが盗まれた場合には、こちらの鍵のみを再生成し、スペアキーの方についてはそのままにしておく)、などの使い方が考えられます。

  • ストレージ接続文字列を設定する。

    次に、クラウドサービスプロジェクトのプロパティ画面の “Settings” タブを開き、Diagnostic Monitor の接続先となるストレージを、開発用ストレージ(development storage)から、運用環境の方に変更します。下図のように、”Account Name” と “Account Key” を設定し、さらに接続方法として HTTPS プロトコルを設定してください。

    image

    以上の設定ののち、OK ボタン(ウィンドウの端にボタンが微妙に隠れてしまっているのですが....) を押すと、Windows Azure ストレージ接続文字列が作成され、”DiagnosticsConnectionString” という名称で保存されます。以下のような感じの文字列になりますが、この文字列を次に利用しますので、コピーしておいてください。

    ”DefaultEndpointsProtocol=https;AccountName=nakama;AccountKey=…(== という文字で終了する文字列)…”

  • Windows Azure ストレージサービス内に、Diagnostic Monitor で利用する Blob コンテナやテーブルを作成する。

    少し前の「Diagnostic Monitor によるアプリケーション監視」の「Windows Azure ストレージ側の事前準備」の項で示したサンプルプログラムを一部修正し、本番環境に Blob コンテナやテーブルを作成します。以下にフルソースコードを示しますが、変更するのはソースコード中の 17 行目~19 行目のみです。ここに、先に作成した接続文字列をペーストしてください。

    コードを修正したらこれを実行すると、本番環境に Diagnostic Monitor 用の Blob コンテナやテーブルなどが作成されます。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: // Microsoft.WindowsAzure.ServiceRuntime.dll と Microsoft.WindowsAzure.StorageClient.dll へ参照設定
   7: using Microsoft.WindowsAzure;
   8: using Microsoft.WindowsAzure.StorageClient;
   9:  
  10: namespace ConsoleApplication1
  11: {
  12:     class Program
  13:     {
  14:         static void Main(string[] args)
  15:         {
  16:             // 開発環境の場合(運用環境の場合には適宜コードを修正)
  17:             //CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
  18:             // 運用環境の場合
  19:             CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=nakama;AccountKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==");
  20:  
  21:             // 作成するコンテナ、テーブル、キューの名称一覧
  22:             string[] containerNamesToCreate = new string[] {
  23:                 "wad-iis-failedreqlogfiles", "wad-iis-logfiles", "wad-crash-dumps" };
  24:             string[] tableNamesToCreate = new string[] {
  25:                 "WADLogsTable", "WADDiagnosticInfrastructureLogsTable",
  26:                 "WADPerformanceCountersTable", "WADWindowsEventLogsTable", "WADDirectoriesTable" };
  27:             string[] queueNamesToCreate = new string[] { };
  28:  
  29:             // コンテナ、テーブル、キューを作成
  30:             CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
  31:             foreach (string containerName in containerNamesToCreate)
  32:             {
  33:                 CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
  34:                 bool created = blobContainer.CreateIfNotExist();
  35:                 if (created) Console.WriteLine("{0} : コンテナを作成しました。", containerName);
  36:             }
  37:             CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
  38:             foreach (string tableName in tableNamesToCreate)
  39:             {
  40:                 bool result = tableClient.CreateTableIfNotExist(tableName);
  41:                 if (result) Console.WriteLine("{0} : テーブルを作成しました。", tableName);
  42:             }
  43:             CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
  44:             foreach (string queueName in queueNamesToCreate)
  45:             {
  46:                 CloudQueue queue = queueClient.GetQueueReference(queueName);
  47:                 bool result = queue.CreateIfNotExist();
  48:                 if (result) Console.WriteLine("{0} : キューを初期化しました。", queueName);
  49:             }
  50:         }
  51:     }
  52: }

以上の作業で、利用するストレージが開発用ストレージから運用環境の Windows Azure ストレージサービスへと変更されます。クラウドサービスプロジェクトを Ctrl + F5 キーで実行し、動作確認をしてみてください。先ほどと特に見た目は変わりませんが、内部の動作は以下のように変更されることになります。

image

各種のログファイルが正しく Windows Azure ストレージサービスにデータ出力できているか否かを確認するには、各種の 3rd party 製ツール(例えば Cerebrata 社の Cloud Storage Studio など)を使ってもよいですが、マイクロソフトのサンプルアプリケーションである myAzureStorage (http://myazurestorage.cloudapp.net/)を使っていただくのもよいと思います。このツールは Blob や Table ストレージの中をブラウジングすることができる Web アプリケーションになっており、簡単に Windows Azure ストレージサービスの中を確認することができます。

image

※(参考) このツールは Microsoft が提供する非常に手軽なツールなのですが、開発用ストレージの中を見ることができない、データのダウンロードやアップロードができないなど、実際に利用するには機能不足というのが正直なところです;。取り急ぎでざっくりデータを確認したい、という場合に利用すると便利でしょう。

では最後に、いよいよ Web アプリケーションを Windows Azure コンピュートサービス上へと移行しましょう。

Windows Azure コンピュートサービスへの移行

Windows Azure コンピュートサービスを利用する場合には、ストレージサービスと同様に、まずポータルサイト(https://windows.azure.com/)からコンピュートサービスを作成する必要があります。以下の手順でサービスを作成してください。

  • 新しいサービスとして、”Hosted Service” を追加する。

    まず、ポータルサイトから “Create a new service” を選択し、Hosted Service を選択します。

    image

    次に、サービスのラベルや説明を設定します。(このラベルはポータルサイトでの管理用途にのみ使われますので、適当に付与してかまいません。)

    image

    次に、サービスの URL を決定するとともに、サービスを配置するデータセンタを選択します。このとき、ストレージサービス作成時に作成したアフィニティグループ名を指定します。これにより、ストレージサービスとコンピュートサービスが、同一データセンタ内でも極力近い場所に配置されるように努力されます(※ 何かを保障してくれるわけではなく、「極力近づけるように努力する」という努力目標です;)

    image

以上の作業により、コンピュートサービスが作成されます。サービスを作成すると、アプリケーションをアップロードするための 2 つの環境が用意されます。ひとつは “Production” 環境(運用環境)、もうひとつが “Staging” 環境(最終動作確認環境)です。

image

基本的に、Windows Azure コンピュートサービスにアプリケーションを展開する場合には、まず Staging 環境にアプリケーションを配置して最終動作確認を行ったのち、これを Production 環境と置換します。まずは Staging 環境へのアプリケーションのアップロード方法について、以下に解説します。

  • Visual Studio のクラウドサービスプロジェクト上で、インスタンス数を 1 に変更する。

    まず、サーバへのアップロードを行う前に、いったん仮想マシンのインスタンス数を 1 に変更します。後で解説しますが、Windows Azure コンピュートサービスでは、利用した仮想マシンの台数分だけ課金が発生すます。このため、まず最初の段階ではインスタンス数を 1 としておいて配置を行い、動作確認が取れてからインスタンス数を増やすのが鉄則になります

    image

  • 「発行」処理を行い、クラウドサービスプロジェクトをパッケージングする。

    次に、クラウドサービスプロジェクトを右クリックして発行処理(Publish)を行います。これにより、Visual Studio から以下の 2 つのファイルが出力されます。

    ① サービスパッケージファイル(CloudService1.cspkg)

    実際の Web アプリケーションが含まれているパッケージファイル

    ② サービス構成設定ファイル(ServiceConfiguration.cscfg)

    配置後も変更可能な構成設定データが記述されたテキストファイル(XML ファイル)

    image

    image

  • Windows Azure ポータルサイトからこの 2 つのファイルをアップロードする。

    これらの 2 つのファイルを、ポータルサイトからアップロード(配置、Deploy)します。(配置の際には、パッケージファイルをいったん Blob ストレージにアップロードしてから展開する方法も用意されていますが、ここではファイルが小さいため、直接 Web ブラウザからアップロードすることにします。)

    image

    Deploy 時には、ラベルを付与することができるようになっていますが、通常、このラベルにはアプリケーションのバージョン番号(ビルド番号など)を付与しておきます。(※ 一般的なバージョン番号付与ルールについては、各種の書籍を参照してください。ここでは、「バージョン 1.0 のアプリケーションの、2010 年 3 月 1 日の最初のビルド」という意味で、“1.0.00301.0”(=”1.0” + ”2010/03/01” + ”0”) という番号を付与しています。)

    image 以上により、以下の作業が行われます。

    ① Windows Azure コンピュートサービスのハードウェアインフラ上に、仮想マシンのイメージ(この例の場合には Web ロールサーバの VM イメージ)がコピーされる。

    ② この仮想マシンに対して、指定した VM Size のリソース(この場合には Small なので 1 個の CPU と1.75GB のメモリ)が割り当てられる。

    ③ ここに、アップロードしたアプリケーションパッケージが展開され、インストールされる。

    image

  • コンピュートサービスの仮想マシンの電源を入れる。

    配置が完了すると、下図のような “Stopped” 状態の仮想マシンが出来上がります。この状態は、仮想マシンの電源が落ちている状態ですので、”Run” ボタンを押下して、仮想マシンを起動します。

    image

    ※ (注意&参考) 画面上に赤字で書かれているのは課金に関する警告メッセージです。 詳細は後述しますが、Windows Azure コンピュートサービスでは、マシンが Stopped 状態でも(さらには Staging 環境であっても)課金が発生します。これは、Stopped 状態であったとしても、仮想マシンはリソース割り当て(CPU やメモリのリソース割り当て)を受けているためです。もし課金を完全に止めたいのであれば、”Delete” ボタンを押下して、仮想マシンを完全に削除してください。うっかり Staging 環境などに仮想マシンを置き去りにしておくと、Stopped 状態であったとしても課金を食らいますので、十分に注意してください。

  • コンピュートサービスの動作を確認する。

    しばらくするとコンピュートサービスが起動します。Staging 環境では、配置されたアプリケーションにダミーの URL が付与されますので、画面上に書かれている URL にアクセスして、Web アプリケーションの動作を確認してください。

    image

    image 
    image

以上で Windows Azure コンピュートサービス環境への Web アプリケーションの配置と基本的な動作確認は終了しました……が、残念ながらこのままではいくつかの問題があります。

  • 現在時刻の表示がおかしい。

    このアプリケーションを実際に動作させているのは “2010/03/01 PM11:21:49” なのですが、画面表示上は “3/1/2010 2:21:49 PM” と、9 時間のズレがあります。これは、Windows Azure コンピュートサービスのコンピュータが UTC 時刻(グリニッジ標準時)で動作しているためです。UTC は東京と 9 時間の時差があるため、時刻表示がずれてしまうことになります。
  • GridView コントロールの “選択” ボタンが、”Select“ と英語表記になっている。

    これは、Windows Azure コンピュートサービスのサーバ OS が、データカルチャ、UI カルチャともに “en-us” (英語)で動作しているためです。このため、例えば int a=30; というデータを通貨表記すると、¥30 とはならずに、$30 となってしまいますし、上に記述するように、”選択” ボタンの表記も英語表記になってしまいます。

このように、Windows Azure コンピュートサービスの本番環境は、ローカルコンピュータの開発用ファブリックとは、いくつか環境的に異なるところがあります。このため、実際に既存のアプリケーションを Azure 上に移植する場合、あるいは新規に Azure 用のアプリケーションを開発する場合には、このような環境の違い(特に国際化対応の問題)を意識する必要があります。

では、実際にアプリケーションを修正して、Windows Azure コンピュートサービスの環境に適応させてみることにします。(その 4 に続く…)

Comments (0)

Skip to main content