使用Terraform配置ADF系统托管身份访问Key Vault报Invalid index错误
报错原因与解决方案
核心原因
你遇到的identity is empty list of object报错,是因为Terraform尝试索引azurerm_data_factory资源的identity列表第0位元素时,该列表为空,常见触发场景:
- 首次执行资源创建时,访问策略资源尝试在ADF托管身份生成完成前读取
principal_id,出现时序问题 - 使用的azurerm provider版本过低,存在ADF托管身份属性返回的已知缺陷
- 此前创建ADF时未配置
identity块,新增配置后状态未同步导致临时读取异常
修复方案
方案1:使用one()函数安全读取(推荐)
Terraform 0.14及以上版本提供的one()函数可适配单元素列表场景,避免空列表索引报错,直接修改访问策略的object_id配置即可:
object_id = one(azurerm_data_factory.datafactory.identity).principal_id
该写法会自动等待ADF托管身份生成完成后再读取对应值,天然解决资源创建的时序问题。
方案2:添加显式依赖约束
如果你的Terraform版本不支持one()函数,可给访问策略添加显式依赖,确保ADF创建完成后再执行访问策略的配置:
resource "azurerm_key_vault_access_policy" "adfaccess" { key_vault_id = azurerm_key_vault.appvault.id tenant_id = data.azurerm_client_config.current.tenant_id object_id = azurerm_data_factory.datafactory.identity[0].principal_id # 其余权限配置保持不变 lifecycle { prevent_destroy = true } depends_on = [azurerm_data_factory.datafactory] }
方案3:升级azurerm provider到稳定版
低于3.0版本的azurerm provider对ADF系统分配托管身份的属性返回逻辑存在已知问题,升级provider即可修复底层缺陷:
在Terraform的provider声明块中指定版本:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.0" } } }
执行terraform init -upgrade更新provider后重新执行terraform apply即可。
验证
配置修改完成后执行terraform plan不会再抛出无效索引错误,执行apply完成后即可在Azure Key Vault的访问策略列表中看到ADF系统托管身份的对应权限条目。
内容的提问来源于stack exchange,提问作者el07
相关产品推荐
相关产品推荐

