You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为count创建的VM系统身份配置AKV访问策略遇for_each报错

问题:为多台VM系统身份创建Key Vault访问策略时的for_each错误

我尝试为通过count创建的多台虚拟机的系统身份(object_id)配置Azure Key Vault访问策略,使用的Terraform代码如下:

resource "azurerm_key_vault_access_policy" "terra_kva_pol_arr" {
  for_each = azurerm_windows_virtual_machine.terra_vma_arr[*].identity[*].principal_id

  key_vault_id = azurerm_key_vault.terra_kva[0].id
  tenant_id    = var.tenant_id
  object_id    = each.value

  secret_permissions = [
    "Get",
  ]
}

执行时触发以下错误:

│ Error: Invalid for_each argument
│
│   on key_vault.tf line 30, in resource "azurerm_key_vault_access_policy" "terra_kva_pol_arr":
│   30:   for_each = azurerm_windows_virtual_machine.terra_vma_arr[*].identity[*].principal_id
│     ├────────────────
│     │ azurerm_windows_virtual_machine.terra_vma_arr is tuple with 1 element
│
│ The given "for_each" argument value is unsuitable: the "for_each" argument must be a map, or set of strings, and you have provided a value of type tuple.

问题原因

azurerm_windows_virtual_machine.terra_vma_arr[*].identity[*].principal_id返回的是嵌套元组结构,而for_each要求输入为字符串集合(set(string))或map类型,类型不匹配导致报错。

修复方案

方案1:扁平化嵌套结构并转为集合

用flatten()把嵌套的principal_id转为一维列表,再通过toset()转换为符合要求的字符串集合:

resource "azurerm_key_vault_access_policy" "terra_kva_pol_arr" {
  for_each = toset(flatten(azurerm_windows_virtual_machine.terra_vma_arr[*].identity[*].principal_id))

  key_vault_id = azurerm_key_vault.terra_kva[0].id
  tenant_id    = var.tenant_id
  object_id    = each.value

  secret_permissions = [
    "Get",
  ]
}
  • flatten():消除嵌套层级,把多维结构转为一维列表
  • toset():将列表转为无序唯一的集合,满足for_each的类型要求

方案2:直接遍历VM实例(更直观严谨)

如果VM是用count创建的,直接遍历VM实例,以VM的ID作为map的key,提取对应的principal_id:

resource "azurerm_key_vault_access_policy" "terra_kva_pol_arr" {
  for_each = { for vm in azurerm_windows_virtual_machine.terra_vma_arr : vm.id => vm.identity[0].principal_id }

  key_vault_id = azurerm_key_vault.terra_kva[0].id
  tenant_id    = var.tenant_id
  object_id    = each.value

  secret_permissions = [
    "Get",
  ]
}

这种方式每个策略对应唯一的VM实例,避免潜在的重复ID问题,逻辑更清晰。


内容的提问来源于stack exchange,提问作者Cookies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:27:29