リモートデスクトップを利用して 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("エロース、エロース(深夜の鳴き声)"); } } } }