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

添加Terraform输出时遇Unsupported attribute错误求助

Terraform部署Azure资源Outputs报错「Unsupported attribute」排查

问题场景

原本可正常在Azure不同区域的对应资源组部署2个Log Analytics Workspace,添加outputs.tf配置后触发Error: Unsupported attribute错误,相关代码如下:

locals.tf

locals {
  resource_groups = {
    for k, v in var.workspaces : k => {
      location = v.location
    }
  }
}

main.tf

resource "azurerm_resource_group" "workspaces" {
  for_each = local.resource_groups

  name     = each.key
  location = each.value.location
}

resource "azurerm_log_analytics_workspace" "workspaces" {
  for_each = var.workspaces

  name                = each.key
  location            = each.value.location
  resource_group_name = azurerm_resource_group.workspaces[each.key].name
  sku                 = "PerGB2018"
  retention_in_days   = each.value.retention_in_days
}

variables.tf

variable "workspaces" {
  type = map(object({
    location          = string
    retention_in_days = number
  }))
  default = {
    workspace1 = {
      location          = "australiasoutheast"
      retention_in_days = 30
    }
    workspace2 = {
      location          = "australiaeast"
      retention_in_days = 30
    }
    # Add more workspaces as needed
  }
}

报错的outputs.tf

# Define outputs
output "workspace_ids" {
  value = azurerm_log_analytics_workspace.workspaces[*].id
}

output "workspace_names" {
  value = azurerm_log_analytics_workspace.workspaces[*].name
}

output "resource_group_ids" {
  value = azurerm_resource_group.workspaces[*].id
}

output "resource_group_names" {
  value = azurerm_resource_group.workspaces[*].name
}

output "resource_group_locations" {
  value = azurerm_resource_group.workspaces[*].location
}

错误原因

当资源使用for_each参数创建时,Terraform会将该资源实例化为映射(Map)类型(键为for_each的键值),而非列表类型。你在outputs中使用的[*]是列表专用的splat运算符,无法直接作用于映射类型资源,因此触发「Unsupported attribute」错误。

修正方案

针对映射类型资源,需先用values()函数提取所有实例转换为列表,再使用splat运算符获取属性;若需保留原键值对应关系,可直接返回映射结构。

修正后的outputs.tf

# 返回列表格式的输出(按var.workspaces的键排序)
output "workspace_ids" {
  value = values(azurerm_log_analytics_workspace.workspaces)[*].id
}

output "workspace_names" {
  value = values(azurerm_log_analytics_workspace.workspaces)[*].name
}

output "resource_group_ids" {
  value = values(azurerm_resource_group.workspaces)[*].id
}

output "resource_group_names" {
  value = values(azurerm_resource_group.workspaces)[*].name
}

output "resource_group_locations" {
  value = values(azurerm_resource_group.workspaces)[*].location
}

# 可选:返回带键值映射的输出(保留资源原标识,便于后续引用)
output "workspace_details_map" {
  value = {
    for workspace_key, workspace in azurerm_log_analytics_workspace.workspaces : workspace_key => {
      id          = workspace.id
      name        = workspace.name
      resource_group = azurerm_resource_group.workspaces[workspace_key].name
    }
  }
}

关键说明

  • values()函数可将映射类型的资源实例集合转换为列表,之后即可正常使用[*]运算符批量提取属性
  • 若需保留每个资源的原键名(如workspace1、workspace2)与属性的对应关系,使用for表达式构建映射式输出会更直观,也方便后续模块或其他资源引用特定实例的属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:35:36