normalian blog

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

ASM 版の仮想マシンを ARM 版の仮想マシンに移行する

今回は掲題の通り Azure Service Management 版の仮想マシンを Azure Resource Manager 版の仮想マシンに移行する方法を紹介する。何を言っているのか分からない方もいると思うので、念のため以下でざっくりおさらいをする。

  • Azure Service Management(ASM): Microsoft Azure 旧式のリソース管理方式、俗称 IaaS v1
  • Azure Resource Manager(ARM): Microsoft Azure の新しいリソース管理方式、俗称 IaaS v2

ARM 版の方がネットワークインターフェースが個別でリソース化している、ロードバランサ不要で仮想マシンが配置できる等々の違いはあるが、ARM 版の方が新しいリソース管理方式であることが理解できれば問題ない。ちょくちょく聞かれる内容は「既存の ASM 版のリソースを ARM 版のリソースに簡単に移行する方法は無いか?」は本記事のテーマだが、調べたところ以下の三つが存在した。

上記のうち、MigAz と Platform Supported Migration を試したので紹介しようと思う。

MigAz での移行

本ツールはリンク先の GitHub よりバイナリをダウンロードして migAz.exe を実行してアプリケーションを起動する。以下の画像の要領に従って操作することで ARM テンプレートの JSON ファイルを出力することができる。
f:id:waritohutsu:20170206083437p:plain
export.json, copyblobdetails.json, DeployInstructions.html というファイルが出力される。このうちの DeployInstructions.html ファイルをブラウザで確認すると以下の様に表示される。
f:id:waritohutsu:20170206083501p:plain
上記の指示の中に ASM 版のストレージアカウントから ARM 版のストレージアカウントに仮想マシンVHD をコピーする処理が含まれていることに注意してほしい。それ以外は指示通りに実行すればリソースの移行は完了するはずだ。

Platform Supported Migration

Azure PowerShell のコマンドを利用する方法で ASM 版リソースから ARM 版リソースへの移行を試してみる。

# まずは ASM 版、ARM 版にログイン
PS v1.0> Add-AzureAccount
PS v1.0> Login-AzureRmAccount

# 移行する ASM 版リソースの情報を取得
PS v1.0> $serviceName = "移行したいクラウドサービス名"
PS v1.0> $deployment = Get-AzureDeployment -ServiceName $serviceName
PS v1.0> $deploymentName = $deployment.DeploymentName

# 移行準備を実施
PS v1.0> Move-AzureService -Prepare -ServiceName $serviceName -DeploymentName $deploymentName -CreateNewVirtualNetwork
OperationDescription OperationId                          OperationStatus
-------------------- -----------                          ---------------
Move-AzureService    291e994f-0ed8-7a5a-ac84-47c7df732322 Succeeded      

上記の PowerShell スクリプトを実施時点で以下の様に ASM 版リソースの情報ベースで ARM 版リソースが作成されている。
f:id:waritohutsu:20170206083539p:plain
管理ポータルにて準備作成済みの Migrated リソースを指定し、以下の様に指定することで移行準備が整う。

#
PS v1.0> existingVnetRGName = "<元のクラウドサービス名>-Migrated"
$vnetName = "<元のクラウドサービス名>-VirtualNetwork "
$subnetName = "Subnet-1"

PS v1.0> Move-AzureService -Prepare -ServiceName $serviceName -DeploymentName $deploymentName `
      -UseExistingVirtualNetwork -VirtualNetworkResourceGroupName $existingVnetRGName `
      -VirtualNetworkName $vnetName -SubnetName $subnetName


OperationDescription OperationId                          OperationStatus
-------------------- -----------                          ---------------
Move-AzureService    d17b99fc-a017-7fcf-b993-e3ba17415f44 Succeeded      

上記の様に Succeeded の結果が帰ってくれば移行は移行準備が整ったことを意味している。後は以下のコマンドを実行することで移行は完了だ。

PS v1.0> Move-AzureService -Commit -ServiceName $serviceName -DeploymentName $deploymentName

OperationDescription OperationId                          OperationStatus
-------------------- -----------                          ---------------
Move-AzureService    8b2663ec-c91c-73d7-a092-20057a0f3077 Succeeded      

移行が完了した後、ASM版の仮想マシンは削除されており、Windows Server 2012 R2 のユーザープロファイルもそのまま移行されていることを確認した。さらに、ストレージアカウントが ASM 版のままで残される点も要注意だ。