Terraform获取object_id为空时如何配置Azure Key Vault访问策略
问题原因
data.azurerm_client_config.current.object_id 返回空值,是Azure CLI 2.37.0及以上版本调整了身份信息接口返回结构导致的兼容问题:3.10.0版本之前的AzureRM Terraform Provider没有适配这个结构变更,无法从新版CLI的登录上下文里读取到当前身份的对象ID,和Terraform配置逻辑本身无关。
修复方案
按落地成本从低到高排序:
- 优先升级AzureRM Provider版本
将Key Vault模块里的azurerm provider版本约束调整为>=3.10.0,该版本官方已经完成新版Azure CLI的适配。调整后在对应Terraform工作目录执行terraform init -upgrade拉取适配版本的Provider,后续执行plan/apply时就能正常读取到object_id值,原有Key Vault访问策略的配置代码不需要改动,和现有逻辑兼容性最好。 - 无法升级Provider时手动传入对象ID
跳过azurerm_client_config数据源的自动读取逻辑,本地执行Azure CLI命令直接获取当前登录身份的对象ID:
拿到命令返回的ID字符串后,直接作为# 个人用户登录时执行 az ad signed-in-user show --query id -o tsv # 服务主体登录时执行 az ad sp show --id $(az account show --query user.name -o tsv) --query id -o tsvobject_id参数传入Key Vault访问策略资源,也可以通过Terraform变量统一注入,绕开自动读取失败的问题。 - 临时兼容方案:降级本地Azure CLI
如果既不能升级Provider也不方便手动传值,可以将本地Azure CLI降级到2.36.0及以下版本,旧版CLI的身份返回结构和老版本AzureRM Provider的读取逻辑匹配,可以正常读到对象ID。该方案仅适合临时调试使用,不推荐长期保留,旧版CLI存在已知安全漏洞和后续云服务兼容问题。
额外可选优化
如果你的Key Vault不需要用传统访问策略模式做权限控制,可以直接给Key Vault设置azure_rbac_authorization = true,改用Azure RBAC做权限管控,直接移除原有访问策略相关配置,从根源上绕开读取客户端object_id的逻辑,注意该操作需要你持有Key Vault的Owner或User Access Administrator权限才能生效。
配置完成后可以执行terraform state show azurerm_key_vault_access_policy.<你的资源命名>校验,确认object_id字段不为空、权限配置符合预期即可。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

