导入azurerm_linux_virtual_machine资源报不可配置属性错误
报错原因
azurerm_linux_virtual_machine 资源的identity配置块中,principal_id、tenant_id为Azure平台侧自动生成的只读计算属性,Terraform AzureRM provider不支持用户在配置文件中手动给这两个属性赋值,强制写死就会触发你看到的「不可配置属性」报错。
你导入资源后执行plan提示要移除identity块,是因为导入操作仅把云端资源的现有状态同步到了本地Terraform状态文件,不会自动生成对应的资源配置代码,当代码中缺失匹配的identity配置时,Terraform会判定你要主动删除云端已有的托管标识配置,因此生成删除计划。
解决方案
根据VM实际使用的托管标识类型,删除配置中手动填写的principal_id、tenant_id字段,仅保留可配置的属性即可:
- 若使用系统分配托管标识(
SystemAssigned类型),正确配置如下:
identity { type = "SystemAssigned" }
这种场景下identity_ids默认就是空值,不需要显式声明空列表,principal_id和tenant_id会在资源同步后由Azure自动返回并写入状态文件,后续需要使用这两个值时直接通过资源属性引用即可,例如azurerm_linux_virtual_machine.<你的资源名>.identity[0].principal_id,不需要硬编码。
- 若使用用户分配托管标识(
UserAssigned类型),正确配置如下:
identity { type = "UserAssigned" identity_ids = [azurerm_user_assigned_identity.<你的用户标识资源名>.id] }
- 若同时使用系统+用户分配托管标识,配置如下:
identity { type = "SystemAssigned, UserAssigned" identity_ids = [azurerm_user_assigned_identity.<你的用户标识资源名>.id] }
验证操作
配置修改完成后按以下步骤验证:
- 执行
terraform plan,确认执行计划中不再出现移除identity块的操作,也无属性赋值报错,无其他配置改动的情况下预期资源变更数为0 - 确认计划符合预期后,执行
terraform apply完成配置与云端状态的同步
提示:所有Terraform资源属性中,标注为Computed的字段均为平台自动生成的只读属性,仅支持引用,不支持手动在配置中赋值。
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

