首页 > 解决方案 > terraform 查找默认值必须与地图元素具有相同的类型

问题描述

只是尝试使用可选标签创建 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

标签: terraformterraform-provider-awsterraform0.12+

解决方案


我今天偶然发现了同样的问题,经过快速搜索后,我发现最好的(实际上是我的出路)是针对我的变量类型而不是让 Terraform 试图找出它(并在此过程中失败) )。让我解释一下自己:

用作变量类型非常方便map(any),它会导致 Terraform 无法推断这些类型的情况。

对于我们人类来说,两者都"usr1": {}非常"usr2": {"tags": {"key": "value"}}适合该map(any)类别,因为任何东西都可以是地图,无论是否为空,这是有道理的。然而,对于 Terraform,它看起来像这样:

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

导致 Terraform 向您发送该错误消息。在我看来,虽然在any一定程度上具有灵活性是“可能的”,但您希望并期望您对要使用的类型尽可能具体。如果您想进一步了解该主题,可以查看先前回复中的错误链接以及此问题。两者都由同一个人参加,这使其在特定类型的解决方案上保持一致。


推荐阅读