仮想マシンのデプロイ時にエラーが発生する(VMMarketplaceInvalidInput)

yuyon - MSFT

こんにちは、Azure サポートチームの米田です。

今回は、よく弊社にお問い合わせをいただく、Azure仮想マシンのデプロイ時のエラーと対処方法についてご案内します。

※本手順は ARM (リソースマネージャー モデル / V2)を対象にした記事になります。

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。

目的


通常、Azure 仮想マシンを最初に利用する場合は、MarketPlaceにて弊社あるいはサードパーティー様より公開いただいているOSイメージをご選択いただきデプロイするケースが多いかと思います。しかし、仮想マシンの再作成が必要な構成変更を実施する場合や、自身でカスタマイズしたイメージを作成して複製される場合など、MarketPlaceで購入されたOSイメージをベースに仮想マシンを再作成おこないたいというシナリオは比較的良くあるかと思います。このような仮想マシンを再デプロイする際に次のようなエラーが発生しデプロイが失敗してしまう場合があります。

本記事ではこのエラーの詳細と対処方法をご紹介します。

原因


Azure Marketplaceにて公開されているOSイメージの一部には、仮想マシン内のOSやミドルウェアの料金計算のためにプランと呼ばれる情報が含まれている場合があります。(プラン情報がない仮想マシンイメージもございます)このようなプラン情報が含まれているMarketplaceのOSイメージから作成された仮想マシンは、ディスクやイメージから仮想マシンを再作成する場合にも、このプラン情報を改めて指定しなければならず、それを指定しない場合、上記のエラーが発生します。

仮想マシンに含まれているプラン情報の有無や詳細は次の方法で確認できます。

  1. Azure Resource Explorer(https://resources.azure.com)にアクセスします。

    ※Edge, Chrome等のブラウザでアクセスください

  2. 複製元の仮想マシンの画面を開きます

    ※画面上の検索ボタンより仮想マシンを入力するか、画面左メニューより次のように選択していきます。

    Subscriptions > "サブスクリプション名" > resourceGroups > ”リソースグループ名” > providers> Microsoft.Compute > virtualMachines> "仮想マシン名"

  3. 仮想マシンの構成情報の中に"plan"というセクションを確認します。


対処方法


仮想マシンをデプロイ時に適切なプラン情報が含まれていないことが原因のため、Azure Powershellコマンドを使用して元となる仮想マシンと同じプラン情報を指定した上でデプロイすることで回避できます。

具体的には、Set-AzureRmVMPlan コマンドを利用します。Name, Product, Publisherに上記の手順で確認いただいた値を指定ください。

実行例)

$ VmConfig = Set-AzureRmVMPlan -VM $VmConfig -Name "xxx" -Product "xxx" -Publisher "xxx"

なお、このコマンドを組み込んだ仮想マシン作成の流れは次のようになります。こちらは既存の管理ディスクから仮想マシンを作成するサンプルとなりますが、非管理ディスクといった別の構成で仮想マシンを再作成する場合もプラン情報の指定方法は同じになります。

#パラメータ

$DiskName = "my-disk" #ディスク名(既存)

$rgName = "myrg" #ディスクの存在するリソースグループ名(既存)

$location = "japaneast" #リージョン名(japaneastなど)

$nicName = "myNic" #NIC名

$vnetName = "myvnet" #仮想ネットワーク名

$ipName = "myPip" #パブリックIPアドレス名

$vmName = "myVM" #仮想マシン名

$vmSize = "Standard_DS1_v2" #仮想マシンサイズ

$AddressPrefix = "192.168.1.0/25" #プレフィックス

$SubnetName = "mysubnet" #サブネット名

$SubnetPrefix = "192.168.1.0/27" #プレフィックス

# ログインとサブスクリプション指定

Login-AzureRmAccount

$mySub = Get-AzureRmSubscription | Out-GridView -Title "Select an Azure Subscription ..." -PassThru

Select-AzureRmSubscription -SubscriptionId $mySub.Id

#ディスクの取得

$osDisk = Get-AzureRmDisk -ResourceGroupName $rgName -DiskName $DiskName

#仮想ネットワークの作成

$Vnet = New-AzureRmVirtualNetwork -Location $location -Name $vnetName -ResourceGroupName $rgName -AddressPrefix $AddressPrefix

Add-AzureRmVirtualNetworkSubnetConfig -AddressPrefix $SubnetPrefix -Name $SubnetName -VirtualNetwork $Vnet

Set-AzureRmVirtualNetworkSubnetConfig -AddressPrefix $SubnetPrefix -Name $SubnetName -VirtualNetwork $Vnet

Set-AzureRmVirtualNetwork -VirtualNetwork $Vnet

#NICの新規作成

$vnet = Get-AzureRmVirtualNetwork -ResourceGroupName $rgName -Name $vnetName

$pip = New-AzureRmPublicIpAddress -Name $ipName -ResourceGroupName $rgName -Location $location -AllocationMethod Dynamic

$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rgName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id

# 仮想マシン設定の定義

$vm = New-AzureRmVMConfig -Name $vmName -VMSize $vmSize

$vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDisk.Id -CreateOption Attach -Linux

#!!!!ここで仮想マシンのプラン情報を設定します

$vm = Set-AzureRmVMPlan -VM $vm -Name "xxx" -Product "xxxx" -Publisher "xxxx"

# 仮想マシンの新規作成

$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id

New-AzureRmVM -VM $vm -ResourceGroupName $rgName -Location $location