另一种方式,因为 for_each 和 count 不能在同一个资源中

时间:2021-04-01 02:15:58

标签: terraform terraform-provider-aws terraform-provider-gcp

我的配置需要同时使用 count 和 for_each。 这是配置块

variable "all_zone" {
  type    = list(any)
  default = ["asia-southeast1-a", "asia-southeast1-b", "asia-southeast1-c"]
}

variable "backends" {
  description = "Map backend indices to list of backend maps."
  type = map(object({
    neg_name  = string
   }))
}

data "google_compute_network_endpoint_group" "get_neg" {
  for_each = var.backends
  count   = length(var.all_zone)
  zone    = var.all_zone[count.index]
  name    = lookup(each.value, "neg_name")
  
}

resource "google_compute_backend_service" "default" {
. . .
dynamic "backend" {
    for_each = [for b in data.google_compute_network_endpoint_group.get_neg[*].id : b]
    content {
      group = backend.value
    }
  }
}

有没有办法做到这一点?

更新:这里是示例 var.backends

backends = {
    default = {
        neg_name = 'name-1'
    }
}

更新:感谢@marcin 提供的解决方案。但我在访问这些数据时遇到了另一个问题。

在我使用 helper_map 之前


data "google_compute_network_endpoint_group" "get_neg" {
  count   = length(var.all_zone)
  zone    = var.all_zone[count.index]
  name    = 'name-1'
  
}

在这里构造输出数据:

neg = [
      + {
          + id                    = "projects/k8s-playground-public/zones/asia-southeast1-a/networkEndpointGroups/name-1"
          + name                  = "name-1"
          + zone                  = "https://www.googleapis.com/compute/v1/projects/k8s-playground-public/zones/asia-southeast1-a"
        },
      + {
          + id                    = "projects/k8s-playground-public/zones/asia-southeast1-b/networkEndpointGroups/name-1"
          + name                  = "name-1"
          + zone                  = "https://www.googleapis.com/compute/v1/projects/k8s-playground-public/zones/asia-southeast1-b"
        },
      + {
          + id                    = "projects/k8s-playground-public/zones/asia-southeast1-c/networkEndpointGroups/name-1"
          + name                  = "name-1"
          + zone                  = "https://www.googleapis.com/compute/v1/projects/k8s-playground-public/zones/asia-southeast1-c"
        },
    ]

这是我访问数据

for_each = [for b in data.google_compute_network_endpoint_group.get_neg[*].id : b]

使用后map_helper

neg = [
      + {
          + default-asia-southeast1-a  = {
              + id                    = "projects/k8s-playground-public/zones/asia-southeast1-a/networkEndpointGroups/k8s1-e051d246-default-gclb-poc-8080-ef51ff1c"
              + name                  = "name-1"
              + zone                  = "https://www.googleapis.com/compute/v1/projects/k8s-playground-public/zones/asia-southeast1-a"
            }
          + default-asia-southeast1-b  = {
              + id                    = "projects/k8s-playground-public/zones/asia-southeast1-b/networkEndpointGroups/name-1"
              + name                  = "name-1"
              + zone                  = "https://www.googleapis.com/compute/v1/projects/k8s-playground-public/zones/asia-southeast1-b"
            }
          + default-asia-southeast1-c  = {
              + id                    = "projects/k8s-playground-public/zones/asia-southeast1-c/networkEndpointGroups/name-1"
              + name                  = "name-1"
              + zone                  = "https://www.googleapis.com/compute/v1/projects/k8s-playground-public/zones/asia-southeast1-c"
            }
        },
    ]

以及我如何访问这 id 项数据。

1 个答案:

答案 0 :(得分:0)

我不确定您想用数据结构实现什么,但解决问题的一种方法是创建本地辅助变量,这将是您的 { {1}} 和 backends。例如:

all_zone

给出:


variable "backends" {

  description = "Map backend indices to list of backend maps."
  
  type = map(object({
    neg_name  = string
   }))
   
   default = {
        default = {
          neg_name = "name-1"
        }
  }
}


variable "all_zone" {
  type    = list(any)
  default = ["asia-southeast1-a", "asia-southeast1-b", "asia-southeast1-c"]
}

locals {

  helper_map = merge([
          for backend_key, backend_value in var.backends:
            {
              for zone in var.all_zone: 
              "${backend_key}-${zone}" => {
                  backend_value = backend_value.neg_name
                  zone = zone
              }
            }
        ]...)


}

然后,您可以轻松地遍历此连接结构(仅示例):

{
  "default-asia-southeast1-a" = {
    "backend_value" = "name-1"
    "zone" = "asia-southeast1-a"
  }
  "default-asia-southeast1-b" = {
    "backend_value" = "name-1"
    "zone" = "asia-southeast1-b"
  }
  "default-asia-southeast1-c" = {
    "backend_value" = "name-1"
    "zone" = "asia-southeast1-c"
  }
}

上述内容可能需要进一步调整以匹配您的数据结构,但使用本地辅助变量的总体思路保持不变。