【问题标题】:Use for_each to fill in list argument使用 for_each 填写列表参数
【发布时间】:2023-04-01 10:11:02
【问题描述】:

我正在尝试向google_monitoring_metric_descriptor resource 上的labelsmetadata 子块添加条目。我很难让for_each 循环遍历每个度量描述符的结构图,以及labelsmetadata 的内部集合。它似乎不接受块内的内部for_each,并且尝试使用= 分配给它似乎也不起作用。


locals {
  metrics = {
    gsuite_user_count = {
      name = "projects/my-gcp-project-123/metricDescriptors/custom.googleapis.com/gsuite_user_count",
      labels = [
        {
          key = "gsuite_domain"
        },
        {
          key         = "opencensus_task",
          description = "Opencensus task identifier"
        }
      ],
      metricKind  = "GAUGE",
      valueType   = "INT64",
      unit        = "1",
      description = "Number of users in GSuite Directory.",
      displayName = "custom.googleapis.com/gsuite_user_count",
      type        = "custom.googleapis.com/gsuite_user_count"
    }
  }
}

resource "google_monitoring_metric_descriptor" "basic" {
  provider     = google-beta
  for_each     = local.metrics
  description  = lookup(each.value, "description")
  display_name = each.value.displayName

  # How do I do this?
  labels = [for label in each.value.labels : {
    key   = label.key
    value = label.value
  }]

  //  launch_stage = each.value.launchStage
  //  metadata     = each.value.metadata
  metric_kind = each.value.metricKind
  type        = each.value.type
  unit        = each.value.unit
  value_type  = each.value.valueType
  project     = var.project_id
}

这会在terraform apply 上出现此错误:

Error: Unsupported argument

  on /Users/jaycarlton/repos/workbench/ops/terraform/modules/workbench/modules/monitoring/modules/metrics/main.tf line 32, in resource "google_monitoring_metric_descriptor" "basic":
  32:   labels = [for label in each.value.labels : {

An argument named "labels" is not expected here. Did you mean to define a
block of type "labels"?

【问题讨论】:

  • 您的错误消息表明您将labels 指定为参数而不是块。在继续添加迭代之前,您需要先解决这个问题。
  • 是的。在找到这个错误之前,我经历了许多错误。

标签: terraform hcl


【解决方案1】:

标签可以使用dynamic blocks 反复设置。可能是这样的:

  dynamic "labels" {
    for_each = each.value.labels
    content {
      key   = labels.key
      value = labels.value
    }
  }

【讨论】:

  • 这是有道理的。一次只有一个each吗?
  • @JayCarlton 不确定你的意思是什么?
  • 我觉得这个后续问题是关于 dynamic 块内的迭代器变量。名称each 始终是主资源for_each 的迭代器;每个动态块都有自己的迭代器变量(默认情况下)以块类型命名,这就是为什么 labels.keylabels.value 在块内是相关的。
  • @MartinAtkins 说得好。迭代器总是被命名为each,除非它不是。如果我在深入研究之前学习了基础知识,这可能会更自然。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多