如何从两个列表的笛卡尔积中生成映射以在Terraform资源的for_each上使用

131次阅读
没有评论

问题描述

在使用Terraform时遇到一个问题:他需要使用资源datadog_synthetics_test创建Datadog合成监视器。他希望能够监视多个集群,每个集群有多个视角。

他有两个变量:
datadog_gke_clusters:代表不同集群的列表,每个集群具有名称、环境和URL。
gke_slo:代表不同视角的列表,每个视角有区域(zone)和响应时间阈值(monitor_threshold)。

他的目标是将这两个列表的元素进行组合,然后以映射的形式传递给datadog_synthetics_test资源的for_each参数。

解决方案

为了实现这个目标,用户可以分为两个步骤。首先,他需要在变量中创建一个变量,用于存储两个列表的笛卡尔积的组合。然后,他可以在资源定义中使用这个新变量。

以下是解决方案的详细步骤:

步骤1:创建笛卡尔积的组合变量

在Terraform中,可以通过两个循环来生成两个列表的笛卡尔积。用户可以将这个步骤放在一个本地(locals)块中,以便稍后在资源定义中引用。以下是示例代码:

locals {
  datadog_gke_clusters_by_pov = flatten([
    for cluster in var.datadog_gke_clusters : [
      for pov in var.gke_slo : {
        cluster = cluster
        pov     = pov
      }
    ]
  ])
}

在上面的代码中,datadog_gke_clusters_by_pov变量将存储每个集群和每个视角的组合。

步骤2:在资源定义中使用组合变量

现在,用户可以在资源定义中使用上一步中创建的变量。他需要将组合变量转换为映射形式,其中键是组合的唯一标识符(例如,集群名称和视角区域的组合),值是组合本身。以下是示例代码:

resource "datadog_synthetics_test" "gke-monitoring" {
  for_each = {
    for value in local.datadog_gke_clusters_by_pov :
    "${value.cluster.name}-${value.pov.zone}" => value
  }

  # 在这里可以使用 each.value.cluster.* 和 each.value.pov.* 进行资源定义
  type    = "api"
  subtype = "http"
  # 其他资源配置...
}

在上面的代码中,我们使用了for_each参数来迭代local.datadog_gke_clusters_by_pov变量中的每个组合,并以${value.cluster.name}-${value.pov.zone}作为键。这将产生一个映射,其中键是组合的唯一标识符,值是组合本身。用户可以根据需要使用each.value.cluster.*each.value.pov.*访问资源配置。

结论

通过按照上述步骤操作,用户可以实现从两个列表的笛卡尔积中生成映射,并将其用于Terraform资源的for_each参数。这将帮助用户有效地管理和配置Datadog合成监视器,以监视多个集群和视角。

请注意,上述示例代码仅为参考,用户需要根据自己的实际情况进行适当的调整和配置。在进行任何更改之前,请务必先备份相关代码和配置。

正文完