使用azurerm_dev_test_global_vm_shutdown_schedule遇“缺失virtualMachines元素”错误
virtualMachines元素 我拥有一个Azure虚拟机规模集,希望通过azurerm_dev_test_global_vm_shutdown_schedule资源配置VM关机计划,但执行terraform plan时出现错误,推测问题出在获取virtual_machine_id环节。
配置代码:
resource "azurerm_dev_test_global_vm_shutdown_schedule" "vm_shutdown" { virtual_machine_id = azurerm_linux_virtual_machine_scale_set.vmss.id location = data.azurerm_resource_group.rg.location enabled = true depends_on = [azurerm_linux_virtual_machine_scale_set.vmss] daily_recurrence_time = "2000" timezone = "Central Europe Standard Time" notification_settings { enabled = true } }
报错信息:
Error: ID was missing the `virtualMachines` element │ │ with azurerm_dev_test_global_vm_shutdown_schedule.vm_shutdown, │ on 04_linux_virtual_machine_scale_set.tf line 57, in resource "azurerm_dev_test_global_vm_shutdown_schedule" "vm_shutdown": │ 57: virtual_machine_id = azurerm_linux_virtual_machine_scale_set.vmss.id
解决方法
问题根源
azurerm_dev_test_global_vm_shutdown_schedule资源是为单个Azure虚拟机设计的全局关机计划配置工具,要求传入的virtual_machine_id必须包含virtualMachines路径段。而虚拟机规模集(VMSS)的ID格式为/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/virtualMachineScaleSets/xxx,完全没有virtualMachines部分,因此触发报错。
正确配置方式
要给VMSS的所有实例配置自动关机,直接在VMSS资源本身中添加automatic_instance_shutdown块即可,示例代码如下:
resource "azurerm_linux_virtual_machine_scale_set" "vmss" { # 保留你原有的VMSS基础配置(名称、资源组、SKU、存储等) automatic_instance_shutdown { enabled = true time = "20:00" # 格式为HH:MM timezone = "Central Europe Standard Time" } }
额外说明
如果硬要给VMSS中的单个实例使用azurerm_dev_test_global_vm_shutdown_schedule,需要构造单个实例的ID(格式类似/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/virtualMachineScaleSets/xxx/virtualMachines/0),但这种方式不推荐:
- VMSS实例是动态扩容/缩容的,新生成的实例不会自动继承关机计划
- 需要手动维护每个实例的关机计划,管理成本极高
内容的提问来源于stack exchange,提问作者Curious23

