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

从JSON加载数据到Terraform Map时merge函数报错求助

Terraform合并JSON数据到appSettings时tuple转map失败问题

我尝试将JSON文件中的外部数据加载到Terraform中,合并至appSettings map,但数据加载后为tuple类型,无论进行何种转换都无法得到map,报错信息如下:

Call to function "merge" failed: arguments must be maps or objects, got "tuple".

JSON文件内容

[
  {
    "appCode": "value",
    "containerName": "value",
    "databaseName": "value",
    "referer": "bvalue",
    "shortCode": "value",
    "user": "value"
  },
  {
    "appCode": "value",
    "containerName": "value",
    "databaseName": "value",
    "referer": "value",
    "shortCode": "value",
    "user": "value"
  }
]

原Locals代码

customerSettings = jsondecode(file("vars/${var.environment}.json"))

customerAppSettingsFromJson = {
  for index, externalCustomer in local.customerSettings :
  externalCustomer => {
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__AppCode"       = "${externalCustomer.appCode}"
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__ContainerName" = "${externalCustomer.containerName}"
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__DatabaseName"  = "${externalCustomer.databaseName}"
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__Referer"       = "${externalCustomer.databaseName}"
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__ShortCode"     = "${externalCustomer.shortCode}"
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__User"          = "${externalCustomer.user}"
  }
}

原Main.tf中appSettings块

app_settings = merge({}, var.app_settings, local.customerAppSettingsFromJson)

解决方案

问题根源在于你用externalCustomer(一个对象)作为map的key,Terraform不允许用对象作为map键,这会导致customerAppSettingsFromJson被隐式转为tuple而非预期的单层map。

修改Locals代码,生成单层map后再合并:

customerSettings = jsondecode(file("vars/${var.environment}.json"))

customerAppSettingsFromJson = merge([
  for index, externalCustomer in local.customerSettings : {
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__AppCode"       = externalCustomer.appCode
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__ContainerName" = externalCustomer.containerName
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__DatabaseName"  = externalCustomer.databaseName
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__Referer"       = externalCustomer.referer
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__ShortCode"     = externalCustomer.shortCode
    "DynamicCosmosDbSettings__CosmosHostSettings__${index}__User"          = externalCustomer.user
  }
]...)

关键说明

  1. 通过列表推导式生成多个独立的小map,每个对应一个客户的配置项
  2. 使用merge([...])...的展开语法,将列表内的所有map合并为一个单层map
  3. 修正了原代码中的笔误:Referer字段的值误写为databaseName,现已改为referer

修改后customerAppSettingsFromJson为标准map,merge函数可正常执行,将其与var.app_settings合并为最终的app_settings。

内容的提问来源于stack exchange,提问作者Stuart.Sklinar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:45:41