Search code examples
amazon-web-servicesterraformterraform-provider-awsaws-security-group

zipmap function in condition expression giving true and false result expressions must have consistent types error


Variables: ingress_ports_udp is of type string with comma seprated values. ingress_cidr_udp is of type string with comma seprated values.

Code:

  dynamic "ingress" {
    iterator           = rule
    for_each           = zipmap(split(",", var.ingress_ports_udp),split(",", var.ingress_cidr_udp)) != "" ? zipmap(split(",", var.ingress_ports_udp),split(",", var.ingress_cidr_udp)) : ""
    content {
      from_port        = rule.key
      to_port          = rule.key
      protocol         = "udp"
      cidr_blocks      = rule.value
    }
  }

Issue: Getting error for the expression zipmap(split(",", var.ingress_ports_udp),split(",", var.ingress_cidr_udp)) != "" ? zipmap(split(",", var.ingress_ports_udp),split(",", var.ingress_cidr_udp)) : ""

"msg": "Failed to validate Terraform configuration files:\r\n\u001b[31m\n\u001b[1m\u001b[31mError: \u001b[0m\u001b[0m\u001b[1mInconsistent conditional result types\u001b[0m\n\n\u001b[0m  on security-group.tf line 9, in resource \"aws_security_group\" \"default-sg\":\n   9:     for_each           = zipmap(split(\",\", var.ingress_ports_udp),split(\",\", var.ingress_cidr_udp)) != \"\" ? \u001b[4mzipmap(split(\",\", var.ingress_ports_udp),split(\",\", var.ingress_cidr_udp)) : \"\"\u001b[0m\n\u001b[0m\nThe true and false result expressions must have consistent types. The given\nexpressions are map of string and string, respectively.\n\u001b[0m\u001b[0m\n\u001b[31m\n\u001b[1m\u001b[31mError: \u001b[0m\u001b[0m\u001b[1mInconsistent conditional result types\u001b[0m\n\n\u001b[0m  on security-group.tf line 20, in resource \"aws_security_group\" \"default-sg\":\n  20:     for_each           = zipmap(split(\",\", var.ingress_ports_udp),split(\",\", var.ingress_cidr_udp)) != \"\" ? \u001b[4mzipmap(split(\",\", var.ingress_ports_udp),split(\",\", var.ingress_cidr_udp)) : \"\"\u001b[0m\n\u001b[0m\nThe true and false result expressions must have consistent types. The given\nexpressions are map of string and string, respectively.\n\u001b[0m\u001b[0m\n"

Requirment: I dont want to run the dynamic ingress block if the zipmap(split(",", var.ingress_ports_udp),split(",", var.ingress_cidr_udp)) is empty i.e. if ingress_ports_udp and ingress_cidr_udp string types are empty. Please help.


Solution

  • You can't use empty string for false, as its different type then the result of true condition. You can check with:

    for_each           = zipmap(split(",", var.ingress_ports_udp),split(",", var.ingress_cidr_udp)) != "" ? zipmap(split(",", var.ingress_ports_udp),split(",", var.ingress_cidr_udp)) : {}