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が変更されたものが生成されます。