添加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
相关产品推荐
相关产品推荐

