【问题标题】:Terraform throws resource name may not be empty errorTerraform 抛出资源名称可能不是空的错误
【发布时间】:2020-09-13 01:05:00
【问题描述】:

我收到以下我不理解的错误消息:

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 告诉我什么。

【问题讨论】:

    标签: kubernetes terraform terraform-provider-kubernetes


    【解决方案1】:

    这个令人困惑的错误来自这样一个事实,即您不能将元数据标签用作数据源的输入,而只能提供服务的名称空间和名称来查找它。

    如果您查看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 确实表明这是唯一应该使用的两个参数:

    参数

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

    不幸的是,文档声明命名空间和名称都是可选的,因为它们使用的共享模式部分对于大部分 Kubernetes 提供程序都是相同的,因此 Terraform 无法检查是否使用了 name 字段因为底层实现需要它。

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

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      相关资源
      最近更新 更多