Terraform 地形;为什么元数据是通过列表索引语法引用的?

Terraform 地形;为什么元数据是通过列表索引语法引用的?,terraform,Terraform,例如: 我们看到: resource "kubernetes_service_account" "example" { metadata { name = "terraform-example" } secret { name = "${kubernetes_secret.example.metadata.0.name}" } } 元数据不是列表,为什么secret/name值使用.

例如:

我们看到:

resource "kubernetes_service_account" "example" {
  metadata {
    name = "terraform-example"
  }
  secret {
    name = "${kubernetes_secret.example.metadata.0.name}"
  }
}

元数据不是列表,为什么secret/name值使用
.0
引用元数据?

提供程序已将
元数据
块类型定义为在内部表示为对象列表。这在今天的Terraform提供程序中很常见,因为Terraform v0.12之前的Terraform版本要求提供程序仅在列表和集合之间进行选择,作为嵌套块类型的支持数据类型

Terraform v0.12及更高版本确实支持将单例块表示为单个对象,但Terraform v0.12版本之前的提供程序仍倾向于使用列表表示以实现向后兼容性。(在撰写本文时,大多数提供商在其新版本中仍然与Terraform v0.11和v0.12兼容。)

(在我撰写本文时仍在开发中)是专门为Terraform v0.12及更高版本构建的,因此它能够更直接地反映底层的Kubernetes模式,包括将
元数据
视为单个对象。有关新提供商版本的公告包括以下示例:

resource "kubernetes_manifest" "example_crd" {
  provider = kubernetes-alpha

  manifest = {
    apiVersion = "apiextensions.k8s.io/v1"
    kind = "CustomResourceDefinition"
    metadata = {
      name = "testcrds.hashicorp.com"
      labels = {
        app = "test"
      }
    }
    spec = {
      group = "hashicorp.com"
      names = {
        kind = "TestCrd"
        plural = "testcrds"
      }
      scope = "Namespaced"
      versions = [
        {
          name = "v1"
          served = true
          storage = true
          schema = {
            openAPIV3Schema = {
              type = "object"
              properties = {
                data = {
                  type = "string"
                }
                refs = {
                  type = "number"
                }
              }
            }
          }
        }
      ]
    }
  }
}
可以更直观地访问此新提供程序的元数据名称,因为
metadata
是单个对象:

kubernetes_manifest.example_crd.manifest.metadata.name

你用.0和不用.0测试过吗?结果如何?如果0没有抱怨元数据是一个列表,我会问清楚为什么是这样,因为它似乎是一个对象,我想不出一个例子,在一个数组中需要两个或N个元数据块?很好的解释,我永远不会发现这种“历史”推理,非常感谢