Terraform Generate Nested data - filter by field

I have the following input in terraform, but couldn’t able to generate to desired output.

I dont see any option in tf to filter by field [resource_app_id] in “for” loop.

Stuck on this for past couple of days . Any help is appreciated!!!

input_data = [
  {
    "resource_app_id" = "62ec2d38-2d53-4204-989b-053a65534873"
    "id" = "b43b06f7-92d1-0a98-bcc5-b6d13557fafd"
    "Type"  = "Role"
  },
  {
    "resource_app_id" = "62ec2d38-2d53-4204-989b-053a65534873"
    "id" = "019aa34d-20ce-f301-586c-c5a1cbe410cf"
    "type"  = "Role"
  },
  {
    "resource_app_id" = "193b6dcb-1323-4f56-8dc5-eed6f9a2789e"
    "id" = "c72de1fc-b40d-4bfc-a08a-79a23c486cc7"    
    "type"  = "Role"
  },
]

Desired output

requiredResourceAccess": [
        {
            "resourceAppId": "62ec2d38-2d53-4204-989b-053a65534873",
            "resourceAccess": [
                {
                    "id": "b43b06f7-92d1-0a98-bcc5-b6d13557fafd",
                    "type": "Role"
                },
                {
                    "id": "019aa34d-20ce-f301-586c-c5a1cbe410cf",
                    "type": "Role"
                }
            ]
        },
        {
            "resourceAppId": "193b6dcb-1323-4f56-8dc5-eed6f9a2789e",
            "resourceAccess": [
                {
                    "id": "c72de1fc-b40d-4bfc-a08a-79a23c486cc7",
                    "type": "Role"
                } 
            ]
        }

Hi @mukeshinit ,

The following Terraform configuration should work. I’ve attached the output below the config.

This approach uses ... to group together results that have a common key rather than filter by field, but produces the result that you want. There’s a typo in your input_data, the first item uses Type instead of type for one of the keys.

Hope this helps!

variable "initial" {
  default = [
    {
      "resource_app_id" = "62ec2d38-2d53-4204-989b-053a65534873"
      "id"              = "b43b06f7-92d1-0a98-bcc5-b6d13557fafd"
      "type"            = "Role"
    },
    {
      "resource_app_id" = "62ec2d38-2d53-4204-989b-053a65534873"
      "id"              = "019aa34d-20ce-f301-586c-c5a1cbe410cf"
      "type"            = "Role"
    },
    {
      "resource_app_id" = "193b6dcb-1323-4f56-8dc5-eed6f9a2789e"
      "id"              = "c72de1fc-b40d-4bfc-a08a-79a23c486cc7"
      "type"            = "Role"
    },
  ]
}

locals {
  middle = { for i in var.initial: i["resource_app_id"] => i... }
}

output "middle" {
  value    = local.middle
}

output "desired" {
  value    = [ 
    for k, v in local.middle: {
      "resourceAppId": k,
      "resourceAccess": [ for rav in v: {
        "id": rav["id"],
        "type": rav["type"],
      }]
    }
  ]
}

Results:

Outputs:

desired = [
  {
    "resourceAccess" = [
      {
        "id" = "c72de1fc-b40d-4bfc-a08a-79a23c486cc7"
        "type" = "Role"
      },
    ]
    "resourceAppId" = "193b6dcb-1323-4f56-8dc5-eed6f9a2789e"
  },
  {
    "resourceAccess" = [
      {
        "id" = "b43b06f7-92d1-0a98-bcc5-b6d13557fafd"
        "type" = "Role"
      },
      {
        "id" = "019aa34d-20ce-f301-586c-c5a1cbe410cf"
        "type" = "Role"
      },
    ]
    "resourceAppId" = "62ec2d38-2d53-4204-989b-053a65534873"
  },
]
middle = {
  "193b6dcb-1323-4f56-8dc5-eed6f9a2789e" = [
    {
      "id" = "c72de1fc-b40d-4bfc-a08a-79a23c486cc7"
      "resource_app_id" = "193b6dcb-1323-4f56-8dc5-eed6f9a2789e"
      "type" = "Role"
    },
  ]
  "62ec2d38-2d53-4204-989b-053a65534873" = [
    {
      "id" = "b43b06f7-92d1-0a98-bcc5-b6d13557fafd"
      "resource_app_id" = "62ec2d38-2d53-4204-989b-053a65534873"
      "type" = "Role"
    },
    {
      "id" = "019aa34d-20ce-f301-586c-c5a1cbe410cf"
      "resource_app_id" = "62ec2d38-2d53-4204-989b-053a65534873"
      "type" = "Role"
    },
  ]
}
1 Like

Thank you so much for the help and prompt reply … This resolved my issue !!!

1 Like