AzureRM Provider 2.99.0下Key Vault访问策略重复创建问题咨询
检查资源唯一性标识配置
Terraform的azurerm_key_vault_access_policy资源通过key_vault_id、object_id(用户托管身份ID)、tenant_id三个字段唯一识别资源。如果这三个字段存在动态取值错误(比如object_id引用了错误的数据源,或tenant_id未正确关联当前环境租户),会导致Terraform每次运行都判定为新资源。
确保配置中这三个字段取值稳定且准确,示例:resource "azurerm_key_vault_access_policy" "apim" { key_vault_id = azurerm_key_vault.env_kv.id tenant_id = data.azurerm_client_config.current.tenant_id object_id = azurerm_user_assigned_identity.apim_uai.id key_permissions = [ "Get", "List", ] secret_permissions = [ "Get", "List", ] }校验Terraform状态与实际资源匹配度
运行terraform state show azurerm_key_vault_access_policy.apim查看状态中的资源属性,对比Azure门户内Key Vault的访问策略,重点检查tenant_id、object_id是否完全一致。若存在差异,可通过导入命令将已存在的访问策略同步到Terraform状态:terraform import azurerm_key_vault_access_policy.apim /subscriptions/<订阅ID>/resourceGroups<资源组名>/providers/Microsoft.KeyVault/vaults/<密钥库名称>/accessPolicies<策略UUID>策略UUID可通过Azure CLI获取:
az keyvault show --name <密钥库名称> --query "properties.accessPolicies[?objectId=='<托管身份ID>'].id" -o tsv优化批量创建的标识符逻辑
若用count或for_each批量生成访问策略,优先用for_each并使用稳定的字符串作为键(比如密钥库名称+托管身份ID的组合),避免依赖资源顺序或临时值导致的误判。示例:resource "azurerm_key_vault_access_policy" "apim" { for_each = { for kv in azurerm_key_vault.all_kvs : "${kv.name}-${azurerm_user_assigned_identity.apim_uai.id}" => kv } key_vault_id = each.value.id tenant_id = data.azurerm_client_config.current.tenant_id object_id = azurerm_user_assigned_identity.apim_uai.id # 权限配置... }排查外部资源的干扰
若有其他工具(如ARM模板、Azure CLI脚本)或Terraform配置同时修改该Key Vault的访问策略,会导致Terraform状态与实际资源不一致。需确保只有当前Terraform配置负责管理目标Key Vault的访问策略,或在所有管理工具中保持配置统一。
内容的提问来源于stack exchange,提问作者chandra shekhar

