使用 Terraform 在对象内迭代列表

Iterate a list inside an object with Terraform

我正在尝试迭代一个对象列表,每个对象内部都有一个字符串列表,但我遇到了问题。

我尝试使用动态块,但出现错误不支持的块类型

我这样声明我的变量:

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

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

我的资源是这样的:

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
    }
  }
}

如何迭代一个包含列表的对象?

您可以扁平化您的test为更for_each友好的结构:


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
                }
        }          
    ]...)
}

这将导致 test_flat

{
  "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"
  }
}

我不确定你想在 aws_lambda_function 中做什么,因为 nicknamesnicknames_list 等属性不正确 .但是您可以使用展平列表(仅作为示例,因为您的 aws_lambda_function 一开始就不正确)

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

  function_name            = each.value.name
  # some other attribute   = each.value.nickname
}