[SDK1.3] Windows Azure で管理者権限を使ってみる


Windows Azure SDK 1.3 がリリースされ、Window Azure の持つ多くの機能が解放されてきています。管理者権限を利用できるようになるのもその機能の一つ。

管理者権限を利用するには2つの方法があります。一つはスタートアップタスクでの昇格、もう一つは管理者モード(Elevated Privilege)です。

スタートアップタスクでの昇格

スタートアップタスクとは、ロールが起動するとき実行されるタスクです。 Guest OS である Windows Server 内のコンポーネントのセットアップや、パッケージに内包させたモジュール等をロール起動時に行い、ロール上のアプリケーション実行のための前提環境の構築等に利用できます。実行権限は、既定の権限と管理者権限の2つの権限が設定可能で、以下のように サービス定義ファイル(csdef) に設定します。

   1:  <Startup>
   2:      <Task commandLine="mysetup.cmd" executionContext="elevated" taskType="simple" />
   3:  </Startup>

管理者モード(Elevated Privilege)

管理者モードとは、ロールのランタイムの権限を管理者へ昇格させる機能です。権限昇格と呼ぶこともあります。権限は、既定の権限と管理者権限の2つの権限が設定可能で、以下のように サービス定義ファイル(csdef) に設定します。

   1:  <Runtime executionContext="elevated" />

Windows Azure で管理者権限の使用例 - IIS 7.5 のアプリケーションプールの設定

.NET Framework 4 では、 Web アプリケーションのプリロード機能と呼ばれる、最初のHTTP トラフィックを受け入れる前にアプリケーションの初期プロセスをあらかじめ実行する機能があります。このプリロード機能は IIS 7.5 (Windows Server 2008 R2) と組み合わせで利用できる機能で、利用する際 applicationHost.config ファイルに以下のような設定を行います。

   1:  <applicationPools>
   2:      <add name="MyApplicationPool" startMode="AlwaysRunning" />
   3:  </applicationPools>

この設定を Full IIS 上で動作するWeb ロールのアプリケーションプールに対して行ってみます。

この設定はIIS 7.5 が対象となるため、IIS 7.5 が動作している Guest OS 2.x 系が対象となります。そこで、サービス構成ファイル(cscfg)上で osFamily =”2” に設定しGuest OS を 2.x系にします。

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

次に、スタートアップタスクで行うか、管理者モードで行うか判定します。

スタートアップタスク実行中は、Web ロールのアプリケーションに対するアプリケーションプールが存在せず既定の3つのアプリケーションプールのみが存在するため、スタートアップタスクは選択枝から外れます。さらに、Web ロールの OnStart() メソッド内等でアプリケーションプールの存在を確認すると、Webロールに対してアプリケーションプールが存在しています。そこで、管理者モードを利用して、Web ロールのエントリーポイントである OnStart() メソッド内で設定を行うことにします。

サービス定義ファイル(csdef)の設定により、ラインタイムの権限を管理者権限に昇格させます。

   1:  <Runtime executionContext="elevated">

OnStart() メソッド内で設定を行うため、Microsoft.Web.Administration.dll の参照を追加し、ServerManager クラス等を利用して、アプリケーションプールのコレクションの取得と、当該アプリケーションプールへの設定を行います。以下 C# のコード例です。

   1:  using Microsoft.Web.Administration;
   2:   
   3:  public override bool OnStart()
   4:  {
   5:      using (ServerManager serverManager = new ServerManager())
   6:      {
   7:          Configuration config = serverManager.GetApplicationHostConfiguration();
   8:          ConfigurationSection applicationPoolsSection = 
                         config.GetSection("system.applicationHost/applicationPools");
   9:   
  10:          foreach (var ap in applicationPoolsSection.GetCollection()){
  11:              string apname = ap.GetAttributeValue("name").ToString();
  12:              if (apname == "DefaultAppPool" ||
  13:                  apname == "Classic .NET AppPool" ||
  14:                  apname == "ASP.NET v4.0" ||
  15:                  apname == "ASP.NET v4.0 Classic")
  16:              {/* 何もしない */}else{
  17:                  ap.SetAttributeValue("startMode", "AlwaysRunning");
  18:                  serverManager.CommitChanges();
  19:              }
  20:          }
  21:      }
  22:      return base.OnStart();
  23:  }

プロジェクトをビルドし Windows Azure のホスティングサービスへ発行します。

リモートデスクトップでこの Web ロールへ接続し applicationHost.config ファイルを確認すると、OnStart() メソッドの結果が反映されていることがわかります。

   1:  <applicationPools>
   2:      <add name="….. />
   3:      <add name="(Web ロールのアプリケーションプール)" startMode="AlwaysRunning" />
   4:  </applicationPools>

Windows Azure SDK 1.3 では、興味深い機能がほかにもあります。管理者権限への昇格をうまく活用することで、自由な拡張性を手に入れつつ、管理からの解放の両立が実現できそうですね。

[参考]

Service Definition Schema : http://msdn.microsoft.com/en-us/library/ee758711.aspx

ASP.NET 4 および Visual Web Developer の新機能 : http://msdn.microsoft.com/ja-jp/library/s57a598e.aspx

Comments (0)

Skip to main content