【问题标题】:Iterate a list inside an object with Terraform使用 Terraform 迭代对象内的列表
【发布时间】:2021-03-08 06:17:35
【问题描述】:

我正在尝试迭代一个对象列表,每个对象内部都有一个 String 列表,但我遇到了麻烦。

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

我是这样声明我的变量的:

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

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

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    您可以将您的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 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"
      }
    }
    

    我不确定你想在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
    }
    

    【讨论】:

    • 感谢您的回答!我使用动态的方式确实不正确,我调整并使用了环境变量块,但我需要该块和函数名上的“昵称”信息,所以没有按我的预期工作。您的回答对我不起作用,我收到“调用函数“合并”失败:参数必须是映射或对象,得到“元组”。错误。
    • @G.Falcão 您是否忘记将... 放入合并中。这很重要。
    • 是的,我删除了它,当我把它放回去时,它就像一个魅力!非常感谢,Marcin,我是 tf 的新手,我必须阅读更多内容。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2013-09-02
    • 2015-12-12
    相关资源
    最近更新 更多