在terraform中呈现模板时没有名为try的函数



我正在呈现包含策略的.json文档:

data "template_file" "my_role_policy" {
template = file("iam_role_policy_template.json")
vars = {
ACCESS_TO_SM   = false
FOO            = bar
}
}
iam_role_policy_template.json中,我有以下代码片段

%{ if try(ACCESS_TO_SM, false) }
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
],
"Resource": "s3://my-bucket/my-path"
}
%{ endif }

这是因为有其他使用相同模板的.tf文件(出于某种原因)可能不传递此变量。

计划失败,报错

错误:渲染失败::20,15-18:调用未知函数;没有名为"try"的函数。

我认为可以在模板中使用它。

自2019年以来,hashicorp/template提供程序及其template_file数据源已经过时,因此该提供程序中的可用函数和语言特性集有效地冻结在当时支持的任何Terraform上。对于那些使用非常旧的Terraform模块的用户,它仍然可以向后兼容。

try函数相对较新,因此它在该提供程序中不可用,并且永远不会可用。根据template_file文档中的建议,您应该迁移到使用templatefile函数,它是Terraform语言的内置部分,因此始终与您正在使用的任何版本的Terraform的功能相匹配。

你可以用一个本地值替换data "template_file"块,它的定义是对templatefile函数的调用:

locals {
role_policy = templatefile("${path.module}/iam_role_policy_template.json", {
ACCESS_TO_SM   = false
FOO            = "bar"
})
}

在你的模块的其他地方,你引用data.template_file.my_role_policy.rendered的每个地方,你可以引用local.role_policy代替。

一旦你做了这个更改,Terraform应该接受你在模板中使用try


单独:在您的示例中,try函数调用没有实现任何东西,因为像ACCESS_TO_SM这样的顶级变量总是定义或引发静态引用错误。你不能使用try直接访问顶级模板变量,集合的属性和元素。

例如,如果你传递一个映射到你的模板中,那么你可以使用try来处理预期的映射键不存在的情况:

templatefile(..., {
example_map = tomap({
"a" = 1
})
})
${ try(example.map["b"], 2) }

…但是当try的第一个参数只是一个变量的直接引用时,使用它是无效的,因为Terraform要求你定义模板使用的所有变量,所以如果你没有在定义的变量集中包含ACCESS_TO_SM,模板将根本不会被计算。

不能使用%{}指令的try。你必须在template:

之前使用try
data "template_file" "my_role_policy" {
template = file("iam_role_policy_template.json")
vars = {
ACCESS_TO_SM   = try(SOME-EXPRESSION, false)
FOO            = "bar"
}
}

则模板为:

%{ if ACCESS_TO_SM == "true" }
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
],
"Resource": "s3://my-bucket/my-path"
}
%{ endif }

最新更新