UNIX/Linux目線のWindows Azure入門ガイド 4ページ

サービスの構成を確認する

 ロールにおけるインスタンスサイズや使用するポートなどは、ロールのプロパティで設定できる。たとえば今回の場合、ソリューションエクスプローラーの「ロール」以下で「WebRole1」をダブルクリックするとプロパティが表示される(図20)。

図20 サービスの構成はロールのプロパティで設定する
図20 サービスの構成はロールのプロパティで設定する

 ロールのプロパティでは、表3の項目が用意されている。また、「サービス構成」では「すべての構成」だけでなく「Cloud」と「Local」という構成が選択でき、Windows Azure環境上とローカルのデバッグ環境上とで異なる設定を行えるようになっている。

表3 ロールのプロパティで用意されている項目
項目名 設定内容
構成 実行時に作成するインスタンスの数やインスタンスサイズ、診断の有効化などを設定できる
設定 プログラムから参照する動的な設定文字列を登録する
エンドポイント ロールが使用するポートを指定する
ローカルストレージ ロールが一時的に使用するストレージ領域を登録する
証明書 ロールが使用するSSL証明書などを登録する
仮想ネットワーク 仮想ネットワーク設定を行う

 ここで最低限確認しておきたいのは、「構成」の「インスタンス数」および「VMサイズ」だ。前述のとおりWindows Azureはインスタンス数およびVMサイズによって料金が変わるため、これらの値は適切に設定しておきたい。

インスタンスを稼働させるOSを設定する

 Windows Azureでは、インスタンスを稼働させるOSとしてWindows Server 2008 sp2互換環境とWindows Server 2008 R2互換環境を選択できる。どちらを使うかは「ServiceConfiguration.Cloud.cscfg」ファイル内で指定可能だ(図21)。

図21 「ServiceConfiguration.Cloud.cscfg」ファイル内でOS環境を指定できる
図21 「ServiceConfiguration.Cloud.cscfg」ファイル内でOS環境を指定できる

 ServiceConfiguration.Cloud.cscfgはXML形式のファイルとなっている。ソリューションエクスプローラーで「ServiceConfiguration.Cloud.cscfg」を開くと、2行目に「<ServiceConfiguration>」要素があるはずだ。この要素内の「osFamily」属性がOS環境を指定するものとなる。これを「1」にするとWindows Server 2008 sp2互換環境、「2」にするとWindows Server 2008 R2互換環境が利用できる(リスト1)。今回はWindows Server 2008 R2互換環境を利用するため、「2」に変更しておく。

リスト1 ServiceConfiguration.cscfgでOS環境を指定する

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="AzureFTP" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*">
 :
 :

 なお、OS環境はデプロイ後に管理ポータルから変更することもできるが、その際はインスタンスの再起動が必要となる。

スタートアップタスクを登録する

 Windows AzureのWebロールでは、WebサーバーとしてIISを利用するようになっている。デフォルトではASP.NETを用いたWebアプリケーションに向けた設定でIISが起動するようになっているため、それ以外の言語を利用したり、FTPやWebDAVを利用するためにはロールの起動時に設定変更を行う必要がある。

 Windows Azureでサーバー環境をカスタマイズする場合、スタートアップタスクやWebRole.cs内のOnStartメソッド内で必要な処理を実行する。スタートアップタスクはインスタンスの起動時に任意のバッチファイルを実行する仕組みで、またWebRole.csはWebロールの起動時/実行時/終了時に実行されるC#プログラムだ。

 スタートアップタスクではバッチファイルを使って処理を記述できるため、バッチファイルやコマンドラインでのWindows環境設定に慣れているユーザーであれば容易に利用できる。いっぽうWebRole.csによる設定ではC#の知識が必要だ。ただし、その分複雑な処理を記述しやすいというメリットもある。また、WebRole.csはIISの初期設定や起動が終了した段階で実行されるため、Webサーバーの設定変更などここでしか行えない処理もある。そこで今回はスタートアップタスクでFTPサービスの有効化と最小限の設定を行い、WebRole.cs側でFTPサーバーの追加設定を実行することにする。

 スタートアップタスクの設定だが、まずスタートアップタスクとして実行するバッチファイルをWebロールに追加する。先ほどの「WebRole1」を右クリックし、メニューから「追加」-「新しい項目」を選択する(図22)。

図22 ファイルを作成するにはWebロールを右クリックし、「追加」-「新しい項目」を選択する
図22 ファイルを作成するにはWebロールを右クリックし、「追加」-「新しい項目」を選択する

 「新しい項目の追加」ウィンドウが表示されるので、左ペインで「Visual C#」をクリックし、「テキストファイル」を選択する。最後にファイル名を入力して「追加」をクリックするとファイルが作成される(図23)。ここでは、「startup.cmd」という名前でファイルを作成した。

図23 「新しい項目の追加」ウィンドウで作成するファイルの形式とファイル名を指定する
図23 「新しい項目の追加」ウィンドウで作成するファイルの形式とファイル名を指定する

 続いて、作成したファイル内にFTPサービスを有効化する処理を記述する。ここではリスト2のようなコードを記述している。

リスト2 FTPサービスを有効化するバッチファイル

REM FTPサービスのインストール
start /w pkgmgr /iu:IIS-FTPServer;IIS-FTPSvc;IIS-FTPExtensibility

REM 終了時にはエラーコードとして「0」を返す必要がある
exit /b 0

 なお、日本語を含むバッチファイルはShiftJIS、コードページ932で保存しなければならない。初期設定ではUTF-8シグネチャ付きのUTF-8テキスト形式となっているため、編集後は「名前を付けてファイルを保存」を実行し、「エンコード付きで保存」を指定して「日本語(シフトJIS)- コードページ932」を選択する(図24、25)。いったんこの設定でファイルを保存すれば、次回からは「上書き保存」で同じ設定で保存されるようになる。

図24 「名前を付けてファイルを保存」で「エンコード付きで保存」を指定してテキストエンコーディングを変更する
図24 「名前を付けてファイルを保存」で「エンコード付きで保存」を指定してテキストエンコーディングを変更する
図25 エンコードは「日本語(シフトJIS)- コードページ932」を選択する
図25 エンコードは「日本語(シフトJIS)- コードページ932」を選択する

 ファイルを作成したらそのプロパティを開き、「詳細」の「出力ディレクトリにコピー」を「新しい場合はコピーする」に変更しておく(図26)。

図26 プロパティで「出力ディレクトリにコピー」を「新しい場合はコピーする」に変更する
図26 プロパティで「出力ディレクトリにコピー」を「新しい場合はコピーする」に変更する

 非常に分かりにくいのだが、この指定を行ったファイルはビルド/デプロイ時にスタートアップタスクの「%ROLEROOT%\appproot\bin」ディレクトリ以下にコピーされる。スタートアップタスクの実行時はこのディレクトリをカレントディレクトリとして実行されるので、この設定を行っておかないとスタートアップ時にファイルが見つからずエラーとなってしまう。

 最後に、作成したバッチファイルをスタートアップタスクとして実行するよう指定する。この設定は、「ServiceDefinition.csdef」というXMLファイルを編集して行う。具体的には、「WebRole」要素内に「<Startup>」および「<Task>」要素を追加する(リスト3)。

リスト3 ServiceDefinition.csdefファイルの変更点。赤字の部分が追加する要素となる

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureWithFTP" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole1" vmsize="Small">
   <Sites>
      <Site name="Web">
        <Bindings>
 :
 :
    <Startup>
      <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
  </WebRole>
</ServiceDefinition>

 このファイルの内容は設定によって異なるが、最後の「</WebRole>」の直前に要素を追加すれば良い。<Task>要素内の「commandLine」属性が実行するコマンドラインで、「executionContext」属性は実行時のユーザー権限を示している。ここでは「elevated」を指定し、管理者権限で実行するようにしている。また、「taskType」属性は起動したコマンドの終了を待機するかどうかを指示するものだ。「simple」の場合、コマンドが終了するまで待機される。