![从 VHD 创建 Azure VM 失败“不是有效的资源引用”](https://linux22.com/image/737956/%E4%BB%8E%20VHD%20%E5%88%9B%E5%BB%BA%20Azure%20VM%20%E5%A4%B1%E8%B4%A5%E2%80%9C%E4%B8%8D%E6%98%AF%E6%9C%89%E6%95%88%E7%9A%84%E8%B5%84%E6%BA%90%E5%BC%95%E7%94%A8%E2%80%9D.png)
我正在尝试通过 Terraform 将虚拟智能区域部署到 Azure,但多次都无法成功。我也阅读了此处的文章。您能给我一些建议并修复它吗?非常感谢。
详细信息如下:Terraform 版本:
tien$ terraform -v
Terraform v0.11.13
+ provider.azurerm v1.27.1
+ provider.random v2.1.2
我写了什么样的地形:
resource "azurerm_virtual_machine" "vsz_vm" {
name = "vsz.az.example.com"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.abc.name}"
network_interface_ids = ["${azurerm_network_interface.vsz_nic.id}"]
vm_size = "Standard_D4_v3"
storage_image_reference {
id = "/subscriptions/4389d27e-249a-4f95-8bd6-3486c60945e7/resourceGroups/ABC/providers/Microsoft.Storage/storageAccounts/vszafb3c92c014b61ab/images/vscg-5.1.1.0.598.vhd"
}
storage_os_disk {
name = "vszOsDisk"
managed_disk_type = "Premium_LRS"
create_option = "FromImage"
os_type = "Linux"
}
os_profile {
computer_name = "vsz.az.example.com"
admin_username = "azure"
}
os_profile_linux_config {
disable_password_authentication = true
ssh_keys {
path = "/home/azure/.ssh/authorized_keys"
key_data = "${var.ssh_public_key}"
}
}
tags {
environment = "${var.environment}"
}
}
然后我运行 terraform 命令
tien$ terraform init --> OK
tien$ terraform plan --> OK
tien$ terraform apply --> ERROR
什么问题?
Error: Error applying plan:
1 error(s) occurred:
* module.azure_example_dlc.azurerm_virtual_machine.vsz_vm: 1 error(s) occurred:
* azurerm_virtual_machine.vsz_vm: compute.VirtualMachinesClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="BadRequest" Message="Id /subscriptions/4389d27e-249a-4f95-8bd6-3486c60945e7/resourceGroups/ABC/providers/Microsoft.Storage/storageAccounts/vszafb3c92c014b61ab/images/vscg-5.1.1.0.598.vhd is not a valid resource reference."
VHD 文件 vscg-5.1.1.0.598.vhd 存在于存储帐户“vszafb3c92c014b61ab”的容器“images”中。
另外,我在从托管映像创建 VM 之前创建了托管映像,代码如下:
storage_image_reference {
id = "/subscriptions/4389d27e-249a-4f95-8bd6-3486c60945e7/resourceGroups/ABC/providers/Microsoft.Storage/storageAccounts/vszafb3c92c014b61ab/images/vscg-5.1.1.0.598.vhd"
}
storage_os_disk {
name = "vszOsDisk"
managed_disk_type = "Premium_LRS"
create_option = "FromImage"
os_type = "Linux"
}
答案1
这个问题解决了。我的错,我选错了方法。
- 使用托管磁盘。
- 使用块 blob
以下是我为解决此问题所采取的措施:
- 将 VHD 映像重新上传到 Page blob 以替换 Block blob。
- 使用非托管磁盘。为什么?我的 VHD 映像存储在 Page blob 中。然后它由 VM 的虚拟硬盘备份。
笔记
- 我以前用 Azure Storage Explorer 来上传 VHD 文件。42 GB 的 VHD 在通过 Azure Web Browser 上传时经常会遇到问题。
Azure 存储支持三种类型的 Blob:
- Block Blob 存储文本和二进制数据,最大容量约为 4.7 TB。Block Blob 由可单独管理的数据块组成。
- 附加 blob 由块组成,类似于块 blob,但针对附加操作进行了优化。附加 blob 非常适合从虚拟机记录数据等场景。
- 页 Blob 存储最大 8 TB 的随机访问文件。页 Blob 存储用作 Azure 虚拟机磁盘的虚拟硬盘 (VHD) 文件。
最后,这是我的 Terraform 代码
resource "azurerm_virtual_machine" "vsz_vm" {
name = "vsz.az.example.com"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.abc.name}"
network_interface_ids = ["${azurerm_network_interface.vsz_nic.id}"]
vm_size = "Standard_D4_v3"
storage_os_disk {
name = "vszOsDisk"
# source VHD as reference
image_uri = "https://vszafb3.blob.core.windows.net/images/vscg-5.1.1.0.598.vhd"
# destination VHD to create
vhd_uri = "https://vszafb3.blob.core.windows.net/images/vscg-5.1.1.0.601.vhd"
os_type = "Linux"
create_option = "FromImage"
}
os_profile {
computer_name = "vsz.az.example.com"
admin_username = "azure"
}
os_profile_linux_config {
disable_password_authentication = true
ssh_keys {
path = "/home/azure/.ssh/authorized_keys"
key_data = "${var.ssh_public_key}"
}
}
此问题已解决。