创建Azure VM时遇Cannot parse the request InvalidRequestFormat错误求助
Azure VM创建脚本错误排查:InvalidRequestFormat
你提供的创建Azure VM的脚本如下:
Connect-AzAccount $cred = Get-Credential $vm = New-AzVMConfig -VMName "MyVirtualVM" -VMSize "Standard_D1" $vm = Set-AzVMOperatingSystem -VM $vm -Windows -ComputerName "MyVM" -Credential $cred -ProvisionVMAgent -EnableAutoUpdate $vm = Set-AzVMSourceImage -VM $vm -PublisherName "MicrosoftWindowsServer" -Offer "WindowsServer" -Skus "2016-Datacenter" -Version "latest" $vm = Set-AzVMOSDisk -VM $vm -Name "MyOSDisk" -DiskSizeInGB 128 -CreateOption FromImage -Caching ReadWrite $vm = Add-AzVMNetworkInterface -VM $vm -Id "/subscriptions/{subscriptionid}/resourceGroups/myresource/providers/Microsoft.Network/virtualNetworks/myresource-vnet" New-AzVM -ResourceGroupName "Prod-IT" -Location "EastUS" -VM $vm
运行后出现的错误:
New-AzVM : Cannot parse the request. ErrorCode: InvalidRequestFormat ErrorMessage: Cannot parse the request. ErrorTarget: StatusCode: 400 ReasonPhrase: OperationID : 22637114-2ddd-49c2-a4b1-3748ac166e12 At line:15 char:1 + New-AzVM -ResourceGroupName "Prod-IT" -Location "EastUS" -VM $vm + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzVM], ComputeCloudException + FullyQualifiedErrorId : Microsoft.Azure.Commands.Compute.NewAzureVMCommand
错误原因分析
- 网络接口参数错误:
Add-AzVMNetworkInterface的-Id参数需要传入网络接口(NIC)的资源ID,但你传入的是虚拟网络的ID,二者是完全不同的资源类型,Azure无法解析该请求。 - 资源组不一致:脚本中NIC关联的资源组是
myresource,但创建VM时指定的资源组是Prod-IT,VM和其关联的NIC必须处于同一个资源组,否则会导致请求解析失败。
修正后的脚本
以下是包含完整网络资源创建逻辑的修正脚本:
Connect-AzAccount # 替换为你的实际参数 $subscriptionId = "你的订阅ID" $resourceGroupName = "Prod-IT" $location = "EastUS" $vmName = "MyVirtualVM" $computerName = "MyVM" $vnetName = "myresource-vnet" $subnetName = "default" $nicName = "$vmName-nic" # 切换到目标订阅 Set-AzContext -Subscription $subscriptionId # 创建资源组(如果不存在) if (-not (Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue)) { New-AzResourceGroup -Name $resourceGroupName -Location $location } # 创建虚拟网络(如果不存在) $vnet = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroupName -ErrorAction SilentlyContinue if (-not $vnet) { $subnetConfig = New-AzVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix "10.0.0.0/24" $vnet = New-AzVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroupName -Location $location -AddressPrefix "10.0.0.0/16" -Subnet $subnetConfig } # 创建网络接口(NIC) $nic = Get-AzNetworkInterface -Name $nicName -ResourceGroupName $resourceGroupName -ErrorAction SilentlyContinue if (-not $nic) { $subnetId = $vnet.Subnets | Where-Object { $_.Name -eq $subnetName } | Select-Object -ExpandProperty Id $nic = New-AzNetworkInterface -Name $nicName -ResourceGroupName $resourceGroupName -Location $location -SubnetId $subnetId } # 构建VM配置 $cred = Get-Credential $vm = New-AzVMConfig -VMName $vmName -VMSize "Standard_D1" $vm = Set-AzVMOperatingSystem -VM $vm -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate $vm = Set-AzVMSourceImage -VM $vm -PublisherName "MicrosoftWindowsServer" -Offer "WindowsServer" -Skus "2016-Datacenter" -Version "latest" $vm = Set-AzVMOSDisk -VM $vm -Name "$vmName-osdisk" -DiskSizeInGB 128 -CreateOption FromImage -Caching ReadWrite # 添加正确的网络接口到VM $vm = Add-AzVMNetworkInterface -VM $vm -Id $nic.Id # 创建VM New-AzVM -ResourceGroupName $resourceGroupName -Location $location -VM $vm
关键修正点
- 先创建/获取合法的网络接口(NIC),将其ID传入
Add-AzVMNetworkInterface - 确保VM、NIC、虚拟网络所有资源都处于同一个资源组
Prod-IT - 添加资源存在性检查,避免重复创建已存在的资源
内容的提问来源于stack exchange,提问作者Raja Kondla
相关产品推荐
相关产品推荐

