Azure中无法创建Service Bus授权规则问题求助
问题分析
这是Terraform 0.12.19与AzureRM Provider 2.10.0组合时的兼容性bug:在刷新Service Bus队列授权规则状态时,Provider错误地将规则名称解析为空字符串,触发参数长度验证失败。即便授权规则已在Azure门户成功创建,Terraform的状态同步流程仍会报错,且untainted操作无法修复该底层解析问题。
解决方案
由于无法升级版本,可通过以下三种方案逐步尝试:
1. 修正Terraform状态文件的资源ID
错误信息中显示资源ID缺失订阅ID(/subscriptions//resourcegroups/...),这是导致Provider解析失败的核心原因之一:
- 先执行备份:
terraform state pull > tfstate_backup.json - 打开本地
terraform.tfstate文件,找到两个授权规则的资源条目 - 补全
id字段中的订阅ID,修正后格式应为:/subscriptions/[你的订阅ID]/resourcegroups/My-RG/providers/Microsoft.ServiceBus/namespaces/sample-check-bus/queues/sample-check-queue/authorizationrules/lsr - 推送修正后的状态:
terraform state push terraform.tfstate - 重新执行
terraform plan验证问题是否解决
2. 用ignore_changes跳过状态刷新
如果修正状态文件无效,可通过生命周期配置让Terraform跳过对授权规则的状态检查,直接确认资源存在:
resource "azurerm_servicebus_queue_authorization_rule" "que-sample-check-lsr" { name = "lsr" resource_group_name = "My-RG" namespace_name = azurerm_servicebus_namespace.service_bus.name queue_name = azurerm_servicebus_queue.que-sample-check.name listen = true send = true lifecycle { ignore_changes = all } } resource "azurerm_servicebus_queue_authorization_rule" "que-sample-check-AsyncReportBG-AsncRprt" { name = "AsyncReportBG-AsncRprt" resource_group_name = "My-RG" namespace_name = azurerm_servicebus_namespace.service_bus.name queue_name = azurerm_servicebus_queue.que-sample-check.name listen = true send = true manage = false lifecycle { ignore_changes = all } }
添加配置后执行terraform apply,Terraform将跳过状态刷新步骤,直接完成部署流程。
3. 强制清理后重新创建
若前两种方案无效,可彻底清理现有资源与状态后重新部署:
- 移除状态中的授权规则条目:
terraform state rm azurerm_servicebus_queue_authorization_rule.que-sample-check-lsr terraform state rm azurerm_servicebus_queue_authorization_rule.que-sample-check-AsyncReportBG-AsncRprt - 在Azure门户手动删除这两个授权规则
- 重新执行
terraform apply完成部署
补充说明
该问题是AzureRM Provider 2.10.0的已知缺陷,后续版本已修复,但受限于版本锁定,上述方案可绕过该bug。其中ignore_changes方案无需修改状态文件,操作最简便,推荐优先尝试。
内容的提问来源于stack exchange,提问作者Shahid Shaik
相关产品推荐
相关产品推荐

