如何处理 terraform 中的可选动态块

won*_*eak 4 terraform terraform0.12+

我正在尝试使用可能具有可选嵌套对象的动态块来迭代资源“launchdarkly_feature_flag”变量 - “variations”(可能是 0 或 2+):

variable "feature_flags" {
  default = {
    flag_1 = {
      project_key = "project"
      key         = "number example"
      name        = "number example flag"
      description = "this is a multivariate flag with number variations."
      variation_type = "number"
      variations = {
        value = 100
      }
      variations = {
        value = 300
      }
      tags = ["example"]
    },
    flag_2 = {
      project_key = "project"
      key = "boolean example"
      name = "boolean example flag"
      description = "this is a boolean flag"
      variation_type = "boolean"
      tags = ["example2"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试过各种如何获取所有标志的场景,但总是面临不同的问题。一段代码:

resource "launchdarkly_feature_flag" "ffs" {
  for_each = var.feature_flag_map
  project_key = each.value.project_key
  key  = each.value.key
  name = each.value.name
  description = each.value.description
  variation_type = each.value.variation_type
  
  # main problem here
  dynamic variations {
    for_each = lookup(each.value, "variations", {}) == {} ? {} : {
      content {
        value = each.value.variations.value
      }
    }
  }
  tags = each.value.tags
}
Run Code Online (Sandbox Code Playgroud)

你能帮忙吗?我正在使用 0.14v 的 Terraform

Mar*_*ins 12

第一步是告诉 Terraform 该变量需要什么类型的值。虽然通常可以省略简单值的显式类型并让 Terraform 自动从 推断它default,但当数据结构如此复杂时,最好告诉 Terraform 您的意图,因为这样您就可以避免它错误地“猜测”并给出结果你混淆了错误消息。

以下看起来像是您显示的默认值的合适类型约束:

variable "feature_flags" {
  type = map(object({
    project_key    = string
    key            = string
    name           = string
    description    = string
    variation_type = string
    tags           = set(string)
    variations = list(object({
      value = string
    }))
  }))
}
Run Code Online (Sandbox Code Playgroud)

写出类型后,Terraform 将保证任何var.feature_flags值都符合该类型约束,这意味着您可以根据值是否null符合做出动态决策:

resource "launchdarkly_feature_flag" "ffs" {
  for_each = var.feature_flags

  project_key    = each.value.project_key
  key            = each.value.key
  name           = each.value.name
  description    = each.value.description
  variation_type = each.value.variation_type
  tags           = each.value.tags

  dynamic "variations" {
    for_each = each.value.variations != null ? each.value.variations : []
    content {
      variations.value.value
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如上所述,Terraform 将要求所有值都feature_flags定义了所有属性,尽管调用者可以将它们设置为 来null指示它们未设置。

在撰写本文时,Terraform v0.14 中有一个实验性功能,用于将属性标记为可选,一旦稳定,它似乎适合此用例。将部分或全部属性标记为 ,optional将允许调用者省略它们,从而导致 Terraform自动将它们设置为null,而不是调用者必须自己显式写出值null

希望该功能在 v0.15 中稳定下来,此时您可以返回到此并将注释添加optional到某些属性,而无需更改有关模块的任何其他内容。