Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterate a list inside an object with Terraform

I'm trying to iterate a list of objects, which each one has a list of String inside, but I'm having trouble with it.

I tried to use dynamic blocks, but I'm getting the error Unsupported block type.

I'm declaring my variable that way:

variable "test" {
  type = list(object({
    name = string
    nicknames = list(string)
  }))

  default = [
    {
      name = "Phoebe"
      nicknames = ["Pheebs", "Phalange"]
    },
    {
      name = "Chandler"
      nicknames = ["Chanchan", "Mr. Bing"]
    }
  ]
}

And my resource is that way:

resource "aws_lambda_function" "test_lambda" {
  for_each = {for i, v in var.teste:  i => v}
  name             = each.value.name
  nicknames  = each.value.nicknames
  dynamic "nicknames_list" {
    for_each = [each.value.nicknames]
    content {
      opn = nicknames_list.value
    }
  }
}

How can I iterate an object with a list inside?

like image 239
G. Falcão Avatar asked Nov 05 '25 08:11

G. Falcão


1 Answers

You can to flatten your test into more for_each friendly structure:


variable "test" {
  type = list(object({
    name = string
    nicknames = list(string)
  }))

  default = [
    {
      name = "Phoebe"
      nicknames = ["Pheebs", "Phalange"]
    },
    {
      name = "Chandler"
      nicknames = ["Chanchan", "Mr. Bing"]
    }
  ]
}


locals {

  test_flat = merge([
      for idx, val in var.test:
        {
          for name, nickname in val.nicknames:         
              "${idx}-${name}-${nickname}" => {
                  name = name
                  nickname = nickname
                }
        }          
    ]...)
}

which will result in test_flat of

{
  "0-0-Pheebs" = {
    "name" = 0
    "nickname" = "Pheebs"
  }
  "0-1-Phalange" = {
    "name" = 1
    "nickname" = "Phalange"
  }
  "1-0-Chanchan" = {
    "name" = 0
    "nickname" = "Chanchan"
  }
  "1-1-Mr. Bing" = {
    "name" = 1
    "nickname" = "Mr. Bing"
  }
}

I'm not sure what do you want to do in your aws_lambda_function as attributes such as nicknames or nicknames_list are incorrect. But you could use the flatten list (example only, as your aws_lambda_function is incorrect to begin with)

resource "aws_lambda_function" "test_lambda" {
  
  for_each                 = local.test_flat

  function_name            = each.value.name
  # some other attribute   = each.value.nickname
}
like image 165
Marcin Avatar answered Nov 07 '25 04:11

Marcin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!