Terraform创建VMSS自动缩放规则失败,如何等待依赖VM生成指标?
问题背景
使用Terraform 0.14.8创建虚拟机规模集(VMSS)的自动缩放规则时,间歇性出现报错:目标VMSS的telegraf/mem命名空间下找不到used_percent指标定义,重新运行部署可解决,但需要让代码自动等待指标就绪后再创建缩放规则。
报错信息(翻译后)
Error: 创建自动缩放设置 "Nuance Speech autoscale Setting - Percentage CPU"(资源组 "rg-dev-eastus2-nuance")失败: insights.AutoscaleSettingsClient#CreateOrUpdate: 请求响应失败: StatusCode=400 -- 原始错误: autorest/azure: 服务返回错误。Status=400 Code="BadRequest" Message="{"code":"BadRequest","message":"在 '/subscriptions/XXX/resourceGroups/rg-dev-eastus2-nuance/providers/Microsoft.Compute/virtualMachineScaleSets/vmss-speech-XX' 的 'telegraf/mem' 命名空间中未找到请求的指标定义 'used_percent'。"}"
位于 .terraform/modules/nuance_speech_linux_vmss_autoscale_rule/main.tf 第1行,resource "azurerm_monitor_autoscale_setting" "this_autoscale_setting" 块内:
2022-10-10T17:06:55.240Z [WARN] plugin.stdio: received EOF, stopping recv loop: err="rpc error: code = Unavailable desc = transport is closing"
1: resource "azurerm_monitor_autoscale_setting" "this_autoscale_setting" {
解决方案
1. 固定时长等待
在自动缩放规则资源前添加强制等待资源,给VMSS和指标采集工具(如Telegraf)足够时间完成指标注册:
resource "time_sleep" "wait_for_metrics" { depends_on = [azurerm_virtual_machine_scale_set.your_vmss_resource] create_duration = "10m" # 可根据实际情况调整,比如5-15分钟 } resource "azurerm_monitor_autoscale_setting" "this_autoscale_setting" { depends_on = [time_sleep.wait_for_metrics] # 原有资源配置代码... }
2. 动态检查指标可用性
通过本地执行脚本循环检查目标指标是否存在,直到就绪再继续部署,比固定等待更高效:
resource "null_resource" "check_metrics_ready" { depends_on = [azurerm_virtual_machine_scale_set.your_vmss_resource] provisioner "local-exec" { command = <<EOT # 最多尝试30次,每次间隔1分钟 for i in {1..30}; do az monitor metrics list-definitions --resource "/subscriptions/XXX/resourceGroups/rg-dev-eastus2-nuance/providers/Microsoft.Compute/virtualMachineScaleSets/vmss-speech-XX" --namespace "telegraf/mem" | grep -q "used_percent" if [ $? -eq 0 ]; then echo "指标已就绪" exit 0 fi echo "等待指标就绪,第$i次尝试..." sleep 60 done echo "超时:指标仍未就绪" exit 1 EOT } } resource "azurerm_monitor_autoscale_setting" "this_autoscale_setting" { depends_on = [null_resource.check_metrics_ready] # 原有资源配置代码... }
注意:需确保Terraform运行环境已安装Azure CLI并完成身份验证,且有权限查询指标定义。
3. 升级依赖版本
考虑升级Terraform到0.15+版本,同时匹配升级AzureRM Provider,新版本可能优化了资源依赖逻辑,减少此类间歇性问题。
关键说明
- 等待时长或重试次数需根据实际环境调整,参考指标采集工具部署到指标注册完成的耗时。
- 动态检查方式能精准匹配指标就绪状态,避免不必要的长时间等待。
内容的提问来源于stack exchange,提问作者donal

