環境の初期化とデータ永続性の対策

Windows Azureでは、イメージの展開時にスクリプトを動作させるスタートアップタスクという機能が用意されています。この機能を使用してスクリプトに全ての設定を記載しておくことで、再配置時にも同様の設定で仮想マシンを動作させることができます。

次にデータの永続性(不測の事態でも消えない)の対策ですが、重要なデータは開発時にストレージサービスやSQL Azureに配置することで対応します。ストレージサービスの使い方について今回は言及しませんが、Windows Azureを使用していく上での重要な使い分けのポイントですので、注意してください。運用時は、ストレージサービスはAzure Storage Explorerのようなツールを使って、SQL Azureの場合はSQL Server Management Studio (SSMS)を使用して保守していきます。SSMSを使用したデータベースの保守の操作はほぼこれまでと同じですので、さほど違和感はないと思います。

では、今回は初期化に重点を置いて対策をしていきます。まずは前回の環境を、スタートアップタスクを使用した方法に書き換えていきます。

スタートアップの活用方法

Visual Studioを起動して、Windows AzureのWebロールを含んだプロジェクトを作成するところまでは前回と同じです。前回紹介したマイクロソフトエヴァンジェリストの安納さんのブログ記事ではそのままデプロイをしていますが、今回はその前にスタートアップタスクの設定を行います。

まず、ソリューションエクスプローラからコンテキストメニューを開き、[追加]→[新しい項目]を選択します。[新しい項目の追加]画面が開きますので、[全般]→[テキストファイル]を選択、名前はStartUp.cmdとして、ファイルを追加します。

図2: スタートアップのファイルの追加設定

ただし、.cmdファイルはそのままではパッケージには含まれませんので、図3のように出力ディレクトリにコピーする設定を行います。右上のソリューションエクスプローラでStartUp.cmdを選択した状態で、プロパティウィンドウの[出力ディレクトリにコピー]から[常にコピーする]を選択して下さい。

図3: 出力ディレクトリにコピーする設定

このStartUp.cmdに初期化のための処理を記述していくことが、全てのインスタンスに同じ動作をさせるキモです。

今回のサンプルではServerManagerCmdコマンドで、「IPアドレスおよびドメインの制限」の役割サービスをインストールしてAppCmdコマンドで機能を有効化するまでを行います。実際のコマンドラインはリスト1を参照してください。

リスト1 : StartUp.cmd

@echo off 
%windir%\System32\ServerManagerCmd.exe -install Web-IP-Security 
%windir%\system32\inetsrv\AppCmd.exe unlock config -section:system.webServer/security/ipSecurity

ServerManagerCmd.exeは、Windows Server 2008において、サービスや機能のインストール/削除を行うためのコマンドラインツールです。このコマンドの詳細はこちら.aspx)を参照してください。AppCmdも同様にIISを管理するためのコマンドです。これらのコマンドは、いずれもこれまで培ってきたWindows Serverの知識でもって利用できるのです。 次に、このスクリプトがスタートアップタスクとして動作するようにAzureの設定ファイルにスクリプトを登録します。

リスト2: ServiceDefinition.csdef

  <WebRole>
    <Startup>
      <Task commandLine="StartUp.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
  </WebRole>

<Task>要素のcommandLine属性ではスクリプトファイルを指定します。今回のファイルはStartUp.cmdなので、そのとおりに記載しています。次に、コマンドが動作する際のモードを指定します。今回は役割サービスのインストールが発生するのでexecutionContext属性でelevated(管理者権限)を指定します。ちなみに一般ユーザー権限の場合はlimitedと指定します。

続いて実行時の制御をtaskType属性で指定します。これは、スタートアップタスクの動作中に各インスタンスを動かし続けるかを設定するもので、Simpleの場合はインスタンスを中断してスクリプトを動かします。Backgroundの場合はインスタンスを動作させたままスクリプトを動かします。今回はインストール作業が入るので、一旦インスタンスの動作を停止するSimpleを指定しています。

最後に、IPアドレスの制限をweb.configに追加します。IPアドレスは環境に合わせて設定してください。

リスト3: web.config

<system.webServer>
  <security>
    <ipSecurity allowUnlisted="true">
      <clear />
      <add ipAddress="192.168.0.1" />
    </ipSecurity>
  </security>
</system.webServer>

この例では、allowUnlisted属性をtrueに指定して、アクセスを拒否するIPアドレスを指定しています。例では192.168.0.1のみを拒否していますが、要素を列記することで複数のアドレスを拒否することもできます。なお、各属性の詳細な説明はこちらを参照してください。

この設定を行ったパッケージファイルをデプロイすることで、前回GUIで行ったことと同様の結果となります。前回の記事と比較しながらデプロイしたパッケージの動作を確認してみてください。