terraform - 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
解决方案
我今天偶然发现了同样的问题,经过快速搜索后,我发现最好的(实际上是我的出路)是针对我的变量类型而不是让 Terraform 试图找出它(并在此过程中失败) )。让我解释一下自己:
用作变量类型非常方便map(any)
,它会导致 Terraform 无法推断这些类型的情况。
对于我们人类来说,两者都"usr1": {}
非常"usr2": {"tags": {"key": "value"}}
适合该map(any)
类别,因为任何东西都可以是地图,无论是否为空,这是有道理的。然而,对于 Terraform,它看起来像这样:
"usr1": {} = map
"usr2": {"tags": {"key": "value"}} = map(object({key: string}))
导致 Terraform 向您发送该错误消息。在我看来,虽然在any
一定程度上具有灵活性是“可能的”,但您希望并期望您对要使用的类型尽可能具体。如果您想进一步了解该主题,可以查看先前回复中的错误链接以及此问题。两者都由同一个人参加,这使其在特定类型的解决方案上保持一致。
推荐阅读
- javascript - 循环带有获胜条件的基本 Javascript 游戏
- python - 替换python数组或数组中的引号
- python - PyCharm 导入 matplotlib.pyplot 显示错误
- symfony - 使用 RMQ 在 Symfony Messenger 中处理来自不同命名空间的消息
- vuejs2 - 如何对 vuejs 中两个或多个监视属性的更改做出一次反应
- bash - 比较第一个以 ; 结尾的字符串 在 2 个 txt 文件中,只获取那些唯一的行
- excel - 一次运行多个工作簿
- oracle - ORA-00923 FROM 关键字未指定
- sql - 使用 PowerShell 将 SSIS 项目部署到 Azure SSIS DB 时出错
- c# - 选择属性包含某个子字符串的元素