'Complex object map iterable for Terraform aws_ecs_task_definition

I have the following aws_ecs_task_definition defined:

resource aws_ecs_task_definition static_task_definition {
  for_each        = toset({for customers in var.customers: customers.CustomerProvider => customers})
  container_definitions = format(
  "[%s]",
  join(
  ",",
  concat(
  [replace(module.manager_container_definition.json, "%CUSTOMERPROVIDER%", each.value["CustomerProvider"]), replace(module.listgetter_container_definition.json, "%CUSTOMERPROVIDER%", each.value["CustomerProvider"])],
  each.value["ReadOnlyProvider"] ? [] : [replace(module.deleter_container_definition.json, "%CUSTOMERPROVIDER%", each.value["CustomerProvider"])]
  )
  )
  )

  volume {
    name      = "sftp-upload-key"
    host_path = "/var/microservices/${var.ecs_service_name}/${each.value["CustomerProvider"]}/sftp_uploader"
  }

  cpu                      = var.task_cpu
  memory                   = var.task_memory
  network_mode             = "awsvpc"
  requires_compatibilities = ["EC2"]
  task_role_arn            = module.ecs_task_role.role_arn

Here is what the customers var looks like:

variable customers {
  type = list(object({
    CustomerProvider = string
    ReadOnlyProvider = bool
  }))
  default = [
    {
    CustomerProvider = "C"
    ReadOnlyProvider = true
    },
    {
      CustomerProvider = "AW"
      ReadOnlyProvider = false
    },
    {
      CustomerProvider = "AA"
      ReadOnlyProvider = false
    },
    {
      CustomerProvider = "AC"
      ReadOnlyProvider = false
    }
  ]

  validation {
    condition     = length(var.customers) == length(distinct([for o in var.customers: o.CustomerProvider]))
    error_message = "CustomerProvider entries must be unique in list."
  }
}

What I am trying to achieve is a little complex - I basically want to make a task def for each CustomerProvider, but also use the boolean information in the object to determine which container definitions are included in the task. My iterable is thus each individual object and pair of attributes. The error I get is below:

Error: Invalid function argument
  on .terraform/modules/service/task_definitions.tf line 181, in resource "aws_ecs_task_definition" "scaling_task_definition":
 181:   for_each = toset({for customers in var.customers: customers.CustomerProvider => customers})
    |----------------
    | var.customers is list of object with 4 elements
Invalid value for "v" parameter: cannot convert object to set of any single
type.

Any ideas on how to resolve the error while preserving my intent?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source