значение по умолчанию для поиска в terraform должно иметь тот же тип, что и элементы карты

#terraform #terraform-provider-aws #terraform0.12

#terraform #terraform-поставщик-aws #terraform0.12

Вопрос:

Просто пытаюсь создать пользователей IAM с дополнительными тегами:

 resource "aws_iam_user" "root" {
  for_each = var.iam_users_root
  name     = each.key
  tags     = lookup(each.value, "tags", {})
}
 

Переменная:

 variable "iam_users_root" {
  type        = map(any)
  default     = {}
}
 

tfvars:

 iam_users_root = {
  "usr1": {},
  "usr2": {"tags": {"key": "value"}},
}
 

Однако terraform выдает ошибку:

 Error: Invalid function argument

  on iam_users.tf line 4, in resource "aws_iam_user" "root":
   4:   tags     = lookup(each.value, "tags", {})

Invalid value for "default" parameter: the default value must have the same
type as the map elements.
 

Интересно, что если у всех пользователей нет тегов, то terraform не жалуется:

 iam_users_root = {
  "usr1": {},
  "usr2": {},
}
 

Есть идеи?

КСТАТИ:

 > terraform --version
Terraform v0.14.2
 

Комментарии:

1. Я не получаю сообщение об ошибке с этим, но я должен был догадаться о том, как вы определили переменную iam_users_root . Может быть, вы могли бы опубликовать воспроизводимый пример?

2. @MarkM Смотрите редактирование, теперь есть все данные, необходимые для воспроизведения.

3. Похоже, это, вероятно, ошибка , по крайней мере, в GitHub есть аналогичная открытая проблема.

Ответ №1:

Сегодня я столкнулся с той же проблемой, и после некоторого быстрого поиска я обнаружил, что лучшим (и фактически моим выходом из этого) было указать конкретные типы моих переменных вместо того, чтобы позволять Terraform пытаться это выяснить (и потерпеть неудачу в процессе). Позвольте мне объясниться:

Его довольно удобно использовать map(any) в качестве типа переменной, это приводит к ситуациям, когда Terraform не может определить эти типы.

Для нас, людей, и "usr1": {} то, и "usr2": {"tags": {"key": "value"}} другое идеально вписывается в эту map(any) категорию, поскольку имеет смысл, что любая карта может быть пустой или нет. Однако для Terraform это будет выглядеть так:

 "usr1": {} = map
"usr2": {"tags": {"key": "value"}} = map(object({key: string}))
 

В результате чего Terraform отправляет вам это сообщение об ошибке. Мне кажется, что, хотя «возможно» иметь any определенную гибкость, желательно и ожидается, что вы будете максимально конкретны в отношении типов, которые вы собираетесь использовать. Если вы хотите прочитать немного больше по этому вопросу, вы можете проверить как ссылку на ошибку в предыдущих ответах, так и эту проблему. В обоих случаях присутствовал один и тот же парень, что делает его последовательным в решении проблемы специфичности типа.