normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

リモートデスクトップを利用して Windows Azureコンピュートサービスの内部をハックする

ご存じの方も多いと思うが、Windows Azure SDK 1.3からAzureインスタンスに対するリモートデスクトップが可能となった。利用方法については「MSDN Windows Azure SDK 1.3 評価キャンペーン > 新機能体験手順書 (Word 形式、3.68 MB)」を参考にして頂きたいが、当該機能を利用することでWindows Azure コンピュート・サービスの内部動作を詳細に把握することが出来る。
この観点から、エバンジェリストの佐藤 直樹氏は自身のブログで「Naoki Sato's Blog > SDK 1.3 Azure Drive のスクリーンショット」を記述している。今回はこちらの記事をベースに、もう一歩踏み込んだ内容について紹介する。

リモートデスクトップ to Azureインスタンスの使い心地は?

既に試されれている方が何人もいることだと思うが、振り返りとして軽く紹介をさせていただきたいと思う。以下の例ではリモートデスクトップを利用して、壁紙を変更し、エクスプローラでディレクトリの確認を行っている*1

リモートデスクトップを利用して様々なカスタマイズが可能だが、インスタンス再起動時にすべて初期化されるので注意が必要だ。

Azureインスタンスの内部構造は?

次に、Azureインスタンスの大まかなフォルダ構成を以下に示す。Cドライブ、Dドライブ、Eドライブが存在することを確認して頂きたい。今回の例では、 id:waritohutsu:20110115:1295083973 で作成したASP.NET MVC3のWeb Roleをアップロードしている。

  • Cドライブ

画像を確認して頂きたいが、後程紹介するLocal Storage領域やログの一時格納領域として利用されている。また、ASP.NETの一時領域等にも利用されている。Azureインスタンスの一時ファイルを格納する場所は、当ドライブを利用するべきだと考えらえる。

  • Dドライブ

Windows Server 2008のOSが格納されているドライブである。「Windows」フォルダや「Program Files」フォルダといった、Windowsが動作するために必要なフォルダが格納されている。

  • Eドライブ

作成したASP.NET MVC3のWeb Roleが格納されているフォルダである。approotフォルダ以下に、作成したWeb Roleアプリケーションが配置されていることが確認できると思う。また、「bin」フォルダに「ローカルコピー True」としたDLLが格納されている点もご確認いただきたい。

SmallインスタンスとExtra Largeインスタンスの違いは?

Windows Azure インスタンス・サイズには、Extra Small/Small/Medium/Large/Extra Largeが存在することはご存じだと思う。今回はSmallとExtra Largeに絞って差異を紹介する

  • CPU/メモリ

ご覧のとおり、Extra Largeの方が大量のメモリを積んでいることがわかる。また、CPUについても差異が現われている。

  • ディスクサイズ

Extra LargeとSmallでの差異はCドライブのみとなった、Web Roleアプリケーションが格納されるEドライブについてはどちらも約1GBとなっている*2

Local Storageの取り扱いはどうなっているのか?

Cドライブの解説でLocal Storage領域の外観を示したが、実際に以下のソースコードを記述してLocal Storage領域にファイルを出力した。

  • ServiceDefinition.csdef
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="MVC3RTMWindowsAzureProject" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="MvcApplication1" vmsize="Small">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
    <LocalResources>
      <LocalStorage name="LocalStorage1" cleanOnRoleRecycle="false" sizeInMB="400" />
    </LocalResources>
  </WebRole>
</ServiceDefinition>
  • Global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.IO;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        //(中略)
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            //文字列をはいておく
            LocalResource disk = RoleEnvironment.GetLocalResource("LocalStorage1");
            DirectoryInfo localStorageRoot = new DirectoryInfo(disk.RootPath);
            using (var stream = new StreamWriter(disk.RootPath + "test.txt"))
            {
                stream.WriteLine("エロース、エロース(深夜の鳴き声)");
            }
        }
    }
}

上記のコードを利用してLocal Storage領域にファイルを出力したところ、以下の様に無事ファイルが吐き出された。

*1:うわさによると、ゲームを起動した方もいるらしい

*2:1GB以上のアプリケーションはどうやって格納するのか、疑問に思ってしまう…