首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理地形中可选的动态块

如何处理地形中可选的动态块
EN

Stack Overflow用户
提问于 2020-12-18 13:23:24
回答 1查看 7K关注 0票数 3

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

代码语言:javascript
运行
复制
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"]
    }
  }
}

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

代码语言:javascript
运行
复制
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
}

你能帮个忙吗?我用的是0.14v的地形

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-19 00:53:26

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

对于您显示的默认值,下面的类型约束看起来很合适:

代码语言:javascript
运行
复制
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
    }))
  }))
}

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

代码语言:javascript
运行
复制
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
    }
  }
}

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

在编写本报告时,在Terraformv0.14中,有一个将属性标记为可选属性的实验特性,它似乎一旦稳定下来,就适合这个用例。将部分或所有属性标记为optional将允许调用方省略它们,从而使Terraform自动将它们设置为null,而不是调用方必须自己显式地写出null值。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65357827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档