normalian blog

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

Microsoft Azure の ARM 版の仮想マシンで NIC を差し替えてみる

最近は ARM(Azure Resource Manager) 版の Azure Java SDK のお話をしてきたので、当ブログをを購読していただいている各位には特に説明不要だと思うが、現在の Microsoft Azure は Azure Service Management(旧版)と Azure Resource Manager(新版)が混在している。
Azure Resource Manager ではネットワークインタフェースを仮想マシンとは個別に定義することが可能になっており、ドキュメント VIRTUAL NETWORK ネットワーク リソース プロバイダー で記載されている「ネットワーク リソース モデルとその関係の概要」の図を確認してもらえれば理解いただけると思うが、NIC仮想マシン/仮想ネットワーク(のサブネット)/Network Security Group と関連付けられていることがわかる。
こちらを利用して、今回は既存の仮想マシンから NIC を抜き差しを試してみた。

NIC を付け替えるコード例

以下の PowerShell スクリプトは新規に NIC を作成し、ARM 版の仮想マシンに付随する既存 NIC と入れ替えるスクリプトだ。

# パラメータ
$vnetName = "<vnet name>"
$resourceGroupName = "<resource group name>"
$subnetName = "<subnet name>"
$networkInterfaceName = "<new nic name>"
$networkInterfaceLocation = "japaneast"
$networkInterfacePrivateIP = "<private ip>"
$vmName = "<vm name>"

# Azure Resource Manager に動作モードを変更
Switch-AzureMode AzureResourceManager

# 新しい NIC の作成
$vnet = Get-AzureVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroupName
$defaultSubnet = Get-AzureVirtualNetworkSubnetConfig -Name $subnetName -VirtualNetwork $vnet
$newNIC = New-AzureNetworkInterface -ResourceGroupName $resourceGroupName -Name $networkInterfaceName -Location $networkInterfaceLocation -PrivateIpAddress $networkInterfacePrivateIP -Subnet $defaultSubnet

# 仮想マシンに割り当て済みの NIC を新規 NIC と付け替え
$vm = Get-AzureVM -Name $vmName -ResourceGroupName $resourceGroupName
$vm = Remove-AzureVMNetworkInterface -VM $vm -NetworkInterfaceIDs $vm.NetworkInterfaceIDs[0]
$vm = Add-AzureVMNetworkInterface -VM $vm -NetworkInterface $newNIC
Update-AzureVM -VM $vm -ResourceGroupName $resourceGroupName

# リソースグループに紐づけられた NIC の一覧を取得し、名前を表示
Get-AzureNetworkInterface -ResourceGroupName $resourceGroupName | Select-Object -Property Name

# 不要な NIC が存在する場合、以下のコマンドで削除
$unnecessaryNICName = "<unnecessaryNICName>"
Remove-AzureNetworkInterface -ResourceGroupName $resourceGroupName -Name $unnecessaryNICName

New-AzureNetworkInterface で新規に NIC を作成し、Remove-AzureVMNetworkInterface で仮想マシンから既存 NIC を削除し、Add-AzureVMNetworkInterface で仮想マシンに新たな NIC を関連づけている。

どの程度の範囲で NIC の抜き差しができるのか?

更に、せっかくなので色々と試してみたが別の仮想ネットワークには移動できない様だ。

  • 別リージョンの仮想ネットワークに NIC を移動させようとした場合、以下のエラーが発生する。
Update-AzureVM : InvalidResourceReference: Resource /subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/networkInterfaces/<new nic name> referenced by /subscriptions/<subscription id>/resourceGroups/arm-study-group/providers/Microsoft.Compute/virtualMachines/<仮想マシン名> is not found. Make sure both resources are created in the same region / location.
OperationID : '29f106f8-ce4c-4329-be4a-67c9bd23038d'
発生場所 行:5 文字:1
+ Update-AzureVM -VM $vm -ResourceGroupName $resourceGroupName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Update-AzureVM]、ComputeCloudException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.Compute.UpdateAzureVMCommand
  • 同一リージョンの別仮想ネットワークに NIC を移動させようとした場合、以下のエラーが発生する。
Update-AzureVM -VM $vm -ResourceGroupName $resourceGroupName
Update-AzureVM : SubnetsNotInSameVnet: Subnet <subnet name> referenced by resource /subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/networkInterfaces/<new nic name>/ipConfigurations/ipconfig1 is not in the same Virtual Network as the subnets of other VMs in the availability set.
OperationID : '46711037-dc43-4f3c-826e-3f5618afb3f8'
発生場所 行:10 文字:1
+ Update-AzureVM -VM $vm -ResourceGroupName $resourceGroupName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Update-AzureVM]、ComputeCloudException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.Compute.UpdateAzureVMCommand