从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 } ]...)
关键说明
- 通过列表推导式生成多个独立的小map,每个对应一个客户的配置项
- 使用
merge([...])...的展开语法,将列表内的所有map合并为一个单层map - 修正了原代码中的笔误:
Referer字段的值误写为databaseName,现已改为referer
修改后customerAppSettingsFromJson为标准map,merge函数可正常执行,将其与var.app_settings合并为最终的app_settings。
内容的提问来源于stack exchange,提问作者Stuart.Sklinar
相关产品推荐
相关产品推荐

