【问题标题】:Terraform-Datadog: Locate index inside a map elementTerraform-Datadog:在地图元素内定位索引
【发布时间】:2022-01-27 20:49:46
【问题描述】:

我创建了一个监视器和 slo 资源,它们遍历地图并创建了几个类似的对象。 现在我正在尝试创建一个仪表板,并希望指向特定的地图索引以查找 slo 资源。示例:

我有下面的地图:

example_map = {
    example_key0 = "example_value0"
    example_key1 = "example_value1"
    example_key2 = "example_value2"
}

我创建了波纹管 slo(以类似方式创建的监视器):

resource "datadog_service_level_objective" "example_SLO" {
  count = length(var.example_map)
  name               = "example_slo_${keys(var.example_map)[count.index]}"
  type               = "monitor"
  description        = "${keys(var.example_map)[count.index]} metric SLO"
  monitor_ids        = ["${datadog_monitor.example_monitor[count.index].id}"]
  thresholds {
    timeframe = "90d"
    target = 99
    warning = 99.9
  }
  tags = ["type:slo_alerts"]
}

然后这些资源中的每一个都由索引标识(example_SLO[0]、example_SLO[1] 等。) 在仪表板上,我想指出示例键以获取它的索引。波纹管失败了,但我希望这个例子能解释我要实现的目标:

widget {
      service_level_objective_definition {
        title = "example SLO"
        view_type = "detail"
        slo_id = datadog_service_level_objective.example_SLO[${index(keys(var.example_map), example_key2)}].id
        show_error_budget = true
        view_mode = "overall"
        time_windows = [
          "7d",
          "30d",
          "previous_month"]
      }
    }

是否可以为小部件创建 for_eachcount 参数?从同一个小部件创建多个对象。

非常感谢您的任何帮助,因为这已成为我尝试通过地图迭代减少配置的障碍。这带来了几个层次的复杂性。

【问题讨论】:

    标签: terraform datadog


    【解决方案1】:

    在 Terraform 中,地图是无序的,这意味着它们没有索引。虽然当然可以提取带有键的列表并从中获取索引,但这在某种程度上违背了拥有地图的目的。

    由于您有一个字符串映射,您可以使用 for_each 遍历它:

    resource "datadog_service_level_objective" "example_SLO" {
      for_each           = var.example_map
      name               = "example_slo_${each.key}"
      type               = "monitor"
      description        = "${each.key} metric SLO"
      monitor_ids        = [datadog_monitor.example_monitor[each.key].id]
      thresholds {
        timeframe = "90d"
        target = 99
        warning = 99.9
      }
      tags = ["type:slo_alerts"]
    }
    

    请注意,您的datadog_monitor.example_monitor 资源也必须使用类似的for_each

    对于widget,您可能可以使用dynamic blocs,这将允许有一个for_each 参数。

    dynamic "widget" {
        for_each = var.example_map
        content {
          service_level_objective_definition {
            title             = "example SLO"
            view_type         = "detail"
            slo_id            = datadog_service_level_objective.example_SLO[each.key].id
            show_error_budget = true
            view_mode         = "overall"
            time_windows = [
              "7d",
              "30d",
            "previous_month"]
          }
        }
      }
    

    【讨论】:

    • 非常感谢您的时间和回答。似乎动态小部件不适用于这种情况。是否有某种方法可以识别地图中元素的位置?
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多