Windows Azure で、対象ホスト毎にVMサイズを変更する方法 Azure SDK v2.2版
気づいたら1年以上放置してましたが、Windows Azure で、対象ホスト毎にVMサイズを変更する方法 - しがないプログラマ の日記 で書いた方法が動かなくなっていたので、更新版を書いておきます。
Azureで環境毎に VMSizeを変更する方法になります。VisualStudioの設定では VMサイズは環境別には設定できません。実際、VMSizeの設定は環境やBuildの設定に寄らず ServiceDefinition.csdef に記述されています。仕方がないので Build時にこのファイルを書き換えることで解決しました、というのが前の記事なのですが、現在の Azure SDKでは上記の手順ではうまく動かなくなっていました。
今回はちゃんと最新版でも動く方法になります。
MSBuildには、Web.config を書き換えるための仕組みとして TransformXmlというTaskがあります。これを使って ServiceDefinition.csdefを変更してあげることにしました。まず、プロジェクトファイル(拡張子が ccproj)をテキストエディタで開き、以下の記述を追加します。
<UsingTask TaskName="TransformXml" AssemblyFile="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> <Target Name="PostTransformBuildConfig" AfterTargets="CopyServiceModel"> <MakeDir Directories="$(BuildOutput)" Condition="!Exists('$(BuildOutput)')"/> <TransformXml Source="ServiceDefinition.csdef" Transform="ServiceDefinition.$(Configuration).csdef" Destination="$(OutputPath)\ServiceDefinition.csdef" Condition="Exists('ServiceDefinition.$(Configuration).csdef')" /> </Target>
AssemblyFile のパスは VisualStudio2012用になっていますので、バージョンに合わせてパスを修正して下さい。
次に、ServiceDefinition.$(Configuration).csdef のファイルを作成し、ServiceDefinition.csdef と同じフォルダに配置します。$(Configuration) にはBuild時のターゲット名が入ります。具体的にはビルドターゲットが「Release-XSmall」だった場合、ServiceDefinition.Release-XSmall.csdef となります。
ファイルの内容には以下のように記述します。*1
<sd:ServiceDefinition name="OrcaServer" xmlns:sd="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" schemaVersion="2013-10.2.2"> <sd:WebRole vmsize="ExtraSmall" xdt:Transform="SetAttributes(vmsize)" /> </sd:ServiceDefinition>
以上で、準備完了です。後はパッケージを作成すれば、自動的にVMSizeが変更されたものが生成されます。