Как разрешить упорядоченный список в пользовательском ресурсе поставщика терраформ?

У меня есть настраиваемый поставщик терраформ с ресурсом, который принимает список в качестве одного из входов. Когда я объявляю список, он должен быть задан как несколько блоков, как показано ниже:

        policies {
    rules {
      name = "foobar"
      v    = "shared"
    }
    rules {
      name = "batz"
      v    = "shared"
    }
  }

Вместо этого я хочу иметь возможность объявить это следующим образом:

        policies {
    rules = [
    {
      name = "foobar"
      v    = "shared"
    },
    {
      name = "batz"
      v    = "shared"
    }
    ]
  }

Это вызывает следующую ошибку:

      Error: Unsupported argument
  on main.tf line 79, in resource "myresource" "sp":
  79:     rules = [
An argument named "rules" is not expected here. Did you mean to define a block
of type "rules"?

Почему я не могу использовать упорядоченный список и как разрешить его использование?

1 ответ

Используемый вами Terraform SDK изначально был разработан для Terraform v0.11 и более ранних версий, поэтому он не поддерживает конструкции конфигурации, которые не поддерживали эти более ранние версии Terraform, а Terraform v0.11 и более ранние версии не поддерживали списки объектов в так, как вы собираетесь здесь.

Чтобы использовать все возможности современного языка Terraform, вы можете вместо этого создать свой провайдер с более новой Plugin Framework, которая разработана на основе современной системы языковых типов Terraform, хотя в настоящее время она также менее зрелая, чем более старый SDK из-за разницы в возрасте. .

В новой структуре вы можете объявитьtfsdk.Attributeкоторый имеет Attributesполе установлено вtfsdk.ListNestedAttributesрезультат:

      tfsdk.Attribute{
    Attributes: tfsdk.ListNestedAttributes(
        map[string]tfsdk.Attribute{
            "name": tfsdk.Attribute{
                // ...
            },
            "namespace": tfsdk.Attribute{
                // ...
            },
        },
        tfsdk.ListNestedAttributesOptions{},
    ),

    // ...
}

В приведенном выше (частичном) примере объявляется атрибут, который ожидает список объектов, где каждый объект может иметь nameа также namespaceатрибутирует себя.

Самое близкое к этому в старом SDK — это последовательность блоков, показанная в вашем примере. В более старых провайдерах, созданных с помощью этого SDK, общим шаблоном здесь было бы присвоение блоку имени в единственном числе. policy, а не во множественном числе policies, чтобы в конфигурации было понятнее, что каждый блок объявляет только одну политику в последовательности.

Другие вопросы по тегам