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?
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With