Terraform 查找函数 - 错误:应为数字,实际类型为字符串
Posted
技术标签:
【中文标题】Terraform 查找函数 - 错误:应为数字,实际类型为字符串【英文标题】:Terraform lookup function - Error: Expected to be number, actual type is String 【发布时间】:2019-08-04 06:12:45 【问题描述】:我正在使用 Terraform 构建一些 AWS VPC 组件,例如下面的 aws_route
。
我正在尝试使用count
参数动态扩展 NAT 网关的数量:
resource "aws_route" "my_nat_gw"
route_table_id = "$var.rt_id"
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = "$nat_gw_id"
#I have an error here - on the "lookup" term
count = "$length(var.azs) * lookup(map(var.enable_nat_gateway, 1), "true", 0)"
为简洁起见,让我们在count
计算中忽略length(var.azs)
的部分。
我在lookup(map(var....)
部分收到以下错误:
应为数字,实际类型为字符串更多
enable_nat_gateway
变量是布尔值。
我还尝试了以下方法:
lookup(map(true, 1), true, 0)
lookup(map("true", 1), "true", 0)
但还是不行。
知道怎么解决吗?
对于不熟悉map 和lookup 语法的人的一些计算:
如果enable_nat_gateway
等于true,那么'map' is equal totrue=1
和总查找项应该等于1。
其他:
如果enable_nat_gateway
等于false,那么'map' is equal totrue=0
和总查找项应该等于0。
请注意,我使用的是 Terraform 0.11.11,因此仍然支持 map
函数。
【问题讨论】:
你到底想在这里实现什么?如果 NAT 网关存在,只是将路由添加到路由表?为什么要为同一个路由表中的每个 AZ 建立一个? 这是一个模块的一部分,我希望它根据具体需求动态设置。 是的,但是为什么要在同一个路由表中有多个路由到同一个 NAT 网关? 这就是我没有添加所有代码的原因 - 所以答案将针对错误(:但无论如何,我正在创建多个子网,每个子网都有自己的路由表、路由和NAT 网关。 事实上,问题中的代码不符合minimal reproducible example 标准,因为它不够完整,任何人都无法运行以查看您的问题。最终,尽管您的计数过于复杂而没有任何好处。您最好使用适当的三元语句,例如count = "$var.enable_nat_gateway ? length(var.azs) : 0"
。
【参考方案1】:
如果您尝试有条件地添加 n 路由资源,那么您应该在此处使用ternary statement,例如:
resource "aws_route" "my_nat_gw"
count = "$var.enable_nat_gateway ? length(var.azs) : 0"
route_table_id = "$var.rt_id"
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = "$var.nat_gw_id"
这会检查enable_nat_gateway
变量的计算结果是否为true
,如果是,则为azs
变量中的每个元素创建一个资源。如果它不是真的,那么它不会创建任何资源。
【讨论】:
看起来不错,但我会再等一会,寻找原始问题的可能解决方案。它可能会帮助其他人在未来面临同样的错误。 这种语法非常复杂,来自于 Terraform 之前的 hack,添加了不稳定的三元语句。如果您真的想使用该 hack,那么您可能可以使用count = "$length(var.azs) * var.enable_nat_gateway"
之类的东西并依靠布尔值只是 0/1 整数这一事实,除非它们被扭曲为字符串,此时您基本上被卡住了。 以上是关于Terraform 查找函数 - 错误:应为数字,实际类型为字符串的主要内容,如果未能解决你的问题,请参考以下文章
使用 terraform 创建 lambda 函数时出错获取验证错误
Terraform 错误更新 CloudFront Distribution InvalidLambdaFunctionAssociation: 该函数不能有环境变量