権限昇格機能を利用したアプリケーションの作成
ここからは、実際にスタータップタスクとランタイムの権限昇格を用いたサンプルアプリケーションを作成します。
サンプルの概要
今回はサンプルアプリケーションとして、COMコンポーネントを利用します。通常の運用ならば手動で構成したりするところですが、Azureにおいて毎回手動で構成するわけにはいきません。スタートアップタスクとランタイムの権限昇格を利用して自動で構成するようにします。サンプルの手順と内容は以下の通りです。
- スタートアップタスクで32bit COMコンポーネントの登録を行います。
- ランタイムで、IISのアプリケーションプールを32bitに再構成します(注1)。Webロールのアプリケーションプールは既定で、64bitとなっており、そのままでは32bit COMコンポーネントを利用できません。
- 通常通り、COMコンポーネントを利用します。
実際に利用しているCOMコンポーネントが64bitであるならば、再構成の必要はありません。
それでは、実際にアプリケーションを作成してみましょう。
サービス構成ファイルの編集
はじめに、Windows Azureプロジェクトを作成してから、スタートアップタスクを構成するために、サービス定義ファイルを編集します。
Visual Studioを起動し、[ファイル]-[新規作成]-[プロジェクト]を選択します。Windows Azureプロジェクトを選択し[OK]ボタンをクリックします。新しいWindows Azureプロジェクト作成画面が表示されるため、ASP.NET Webロールを[OK]ボタンをクリックすると、新しいソリューションが作成されます。
引き続きソリューションエクスプローラーからサービス定義ファイル(ServiceDefinition.csdef)を選択して開きます。
サービス定義ファイルにStarup要素とRuntime要素を追加します(リスト5)。
Task要素のcommandLine属性には、実行するスクリプトファイルを指定します。executionContext属性にはelevatedを指定して管理者権限で実行、taskTypeにはsimpleを指定して同期実行させます。
同様にRuntime要素のexecutionContext属性にもelevatedを指定し、ランタイムを管理者権限で実行します。
スタートアップタスクやランタイムの構成を変更するためには、サービス定義ファイルを直接修正する必要があります。現時点ではプロパティエディタ経由の編集はサポートされていません。
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="StartupTask" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Startup> <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" /> </Startup> <Runtime executionContext="elevated" /> ... </WebRole> </ServiceDefinition>
スクリプトファイルの追加
スタートアップタスクで起動するスクリプトファイルをプロジェクトに追加します。
Webロールのコンテキストメニューから[ファイル]-[追加]-[新しい項目]を選択し、startup.cmdファイルを追加します(図1)。
ここで指定するスクリプトファイルは、ANSI 形式で保存する必要があり、ファイルの先頭にBOM(Byte Order Mark)が設定されているファイル形式は正しく処理されないため注意が必要です。このため、[ファイル]-[保存オプションの詳細設定]から、エンコードにUTF-8シグネチャなしを選択します(図2)。他の方法としては、メモ帳などBOMが付加されないエディタでファイルを作成し、プロジェクトに取り込んでも構いません。
新規に追加したstarup.cmdファイルにリスト6を入力します。
*1は、カレントディレクトリをstartup.cmdが存在するフォルダに変更します。スタートアップタスクが実行される際のカレントディレクトリは、特に決まっているわけではないため初期化します。
*2は、regsvr32によってCOMコンポーネントの登録を行います。/sは、メッセージボックスを表示させないためのスイッチです(注2)。スタートアップタスク実行中は、対話処理ができません。ソフトウェアのインストールを行いたい場合においても、サイレントインストールになるような考慮が必要です。
*3は、スクリプトの終了コードを明示的に指定します。taskTypeがsimpleである場合、0以外の終了コードを返却すると正常にスタートアップタスクが終了せず、ロールが正常に起動しません。0以外に終了コードを返すプログラムを呼ぶときは、このように明示的に終了コードを指定する必要があるため注意が必要です。
@echo off cd /d %~dp0 *1 regsvr32 /s AzureCOMSample.dll *2 exit /b 0 *3
開発エミュレータでの実行時には、/sスイッチを付加せず実行し、メッセージボックスを表示させることにより、COMコンポーネントの登録が確実に行われていることを確認することができます。ただし、そのままAzure上に配置すると初期化が終わらずロールが正常に起動しないため注意が必要です。
スクリプトファイルは、Windows Azureに配置するパッケージに含まれるように、プロパティを常にコピーするに設定します(図4)。これによりアプリケーションルートのbinフォルダに配置されます。