0

I'm trying to load some external data from a json file into Terraform to merge into an appSettings map

It's loading it in as a tuple - and no matter what conversion I do, I can't get a map out of it:

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

Json File

[
  {
    "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 block, has inferred ones, ones from vars and ones from json

app_settings = merge({}, var.app_settings, local.customerAppSettingsFromJson)
Stuart.Sklinar
  • 3,683
  • 4
  • 35
  • 89

1 Answers1

2

You were very close to the solution, but here is how to convert the list of objects into a map:

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

  customerAppSettingsFromJson = {
    for index, externalCustomer in local.customerSettings :
    index => {
      "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}"
    }
  }
Marko E
  • 13,362
  • 2
  • 19
  • 28
  • Thanks for that - unfortunately - it's a no go - "attribute "app_settings": all map elements must have the same type." – Stuart.Sklinar Jan 03 '23 at 11:02
  • Had to unmap the map - this sorted it - `flatCustomers = { for entry in flatten([for val in local.customerAppSettingsFromJson : [for k, v in val : { "key" = k, "val" = v }]]) : entry.key => entry.val }` – Stuart.Sklinar Jan 03 '23 at 13:30
  • You actually didn't post the `app_settings` variable and it's a different issue compared to the original one. – Marko E Jan 03 '23 at 21:48