Terraform выдает имя ресурса не может быть пустым ошибка - PullRequest
1 голос
/ 26 мая 2020

Я получаю следующее сообщение об ошибке, которое я не понимаю:

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 Ответ

3 голосов
/ 26 мая 2020

Эта сбивающая с толку ошибка возникает из-за того, что вы не можете использовать метки метаданных в качестве входных данных для источника данных, а вместо этого можете предоставить только пространство имен и имя службы для ее поиска.

Если вы посмотрите на источник для источника данных , вы увидите, что он использует только поля namespace и name:

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 в том, что она должна быть довольно строго типизированной и иметь возможность лучше сообщать вам об ошибках, когда вы что-то делаете. неправильно.

...