Terraform抛出资源名称可能不为空错误

时间:2020-05-26 09:12:52

标签: kubernetes terraform terraform-provider-kubernetes

我收到以下我不明白的错误消息:

Error: resource name may not be empty

  on main.tf line 48, in data "kubernetes_service" "spark_master_service":
  48: data "kubernetes_service" "spark_master_service" {

相关的data source

data "kubernetes_service" "spark_master_service" {
    metadata {
        labels = {
            "app.kubernetes.io/component" = "master"
            "app.kubernetes.io/instance" = "spark"
            "app.kubernetes.io/name" = "spark"
        }
        namespace = var.namespace
    }
}

我的data有一个名字,所以我不太清楚Terraform在告诉我什么。

1 个答案:

答案 0 :(得分:3)

此令人困惑的错误是由于您不能将元数据标签用作数据源的输入,而只能提供名称空间和服务名称来查找它。

如果您查看source for the data source,则可以看到它仅使用namespacename字段:

func dataSourceKubernetesServiceRead(d *schema.ResourceData, meta interface{}) error {
    om := meta_v1.ObjectMeta{
        Namespace: d.Get("metadata.0.namespace").(string),
        Name:      d.Get("metadata.0.name").(string),
    }
    d.SetId(buildId(om))

    return resourceKubernetesServiceRead(d, meta)
}

docs确实表明,这是应该使用的仅有两个参数:

参数

  • 名称-(可选)服务名称,必须是唯一的。无法更新。有关更多信息,请参见Kubernetes参考
  • 名称空间-(可选)名称空间定义了服务名称必须唯一的空间。

不幸的是,文档指出名称空间和名称都是可选的,因为它们使用的共享架构部分对于大多数Kubernetes提供程序都是相同的,因此Terraform无法检查name字段之所以使用它,是因为基础实现需要它。

我还没有深入研究Kubernetes提供程序,但是对我来说这似乎是一个错误,如果资源或数据源在实践中与其他资源具有不同的架构,则该架构应与该实现相匹配。与如此多的Kubernetes模式共享可能会很棘手,但是如果没有它,您将失去很多Terraform的好处,因为它应该被强类型化并在执行某项操作时能够为您提供更好的错误消息错误的。