Terraform模板渲染报错:不存在try函数
解决template_file模板中无法使用try函数的问题
问题原因
data "template_file" 使用的是HIL(HashiCorp插值语言),它的函数集合和Terraform主配置语言不兼容,try是Terraform配置语言特有的函数,HIL环境中不存在该函数,因此会抛出「Call to unknown function」错误。
解决方案
方案1:在传入变量时统一设置默认值
在调用template_file的地方,确保ACCESS_TO_SM变量始终有值(即使其他调用方未显式传入),可以用Terraform配置语言的lookup函数处理默认值:
data "template_file" "my_role_policy" { template = file("iam_role_policy_template.json") vars = { # 若调用方未传入ACCESS_TO_SM,默认设为false ACCESS_TO_SM = lookup(var, "ACCESS_TO_SM", false) FOO = bar } }
此时模板中可直接简化条件判断,无需额外函数:
%{ if ACCESS_TO_SM } { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": "s3://my-bucket/my-path" } %{ endif }
方案2:在模板中使用HIL原生的exists函数
HIL提供exists函数用于检查变量是否存在,结合逻辑与操作实现需求:
%{ if exists(ACCESS_TO_SM) && ACCESS_TO_SM } { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": "s3://my-bucket/my-path" } %{ endif }
当ACCESS_TO_SM未传入时,exists(ACCESS_TO_SM)返回false,条件不成立,不会渲染该段策略。
方案3:改用templatefile函数(推荐)
Terraform 0.12及以上版本推荐使用内置的templatefile函数替代template_file数据源,该函数直接使用Terraform配置语言的函数集,完全支持try:
locals { my_role_policy = templatefile("iam_role_policy_template.json", { ACCESS_TO_SM = try(var.ACCESS_TO_SM, false) FOO = bar }) }
模板中可直接保留原有的条件判断逻辑:
%{ if try(ACCESS_TO_SM, false) } { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": "s3://my-bucket/my-path" } %{ endif }
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

