在我的 lambda.tf 中,我有一个数据资源
data "template_file" "handler" {
template = "${file("${path.module}/templates/handler.js")}"
vars = {
ENDPOINT = "${var.domain}"
PASSWORD = "${var.password}"
}
}
但是 - 我遇到语法错误:
Error: failed to render : <template_file>:280,49-50: Extra characters after interpolation expression; Expected a closing brace to end the interpolation expression, but found extra characters.
on ../docs/lambda.tf line 1, in data "template_file" "handler":
1: data "template_file" "handler" {
Terraform 是否允许在插值中进行插值?如果是这样 - 任何关于指出错误位置的建议将不胜感激。
大地形态v0.12.9
. 提供程序"aws"版本"~> 2.7"
不完全清楚你的模板文件是什么样子的,或者你想做什么,所以这里有几个不同的答案。
-
您可以使用双美元符号来转义插值:
$${foo}
将呈现为文字${foo}
。 -
Terraform 不允许动态构造变量名称,因为它需要能够静态分析配置(即,无需计算任何表达式(,以确定表达式必须解析的顺序。
Terraform 支持可用于实现此效果的地图数据结构。
variable "var1" {
default = "value1"
}
variable "var2" {
default = "value2"
}
locals {
var3 = "${var.var1}_${var.var2}"
values = {
"value1_value2" = "local1"
"value2_value3" = "local2"
"value3_value4" = "local3"
}
}
output "val_output" {
value = "${local.values[local.var3]}"
}
如果两者都不是您要查找的内容,则需要共享模板文件或复制错误的修改版本。
对于 Terraform0.11 及更早版本的用户,template_file
数据源仍然存在,但由于您使用的是 Terraform 0.12 版本,因此我建议改用templatefile
函数。因为它直接内置在 Terraform 中,所以它能够生成更好的错误消息。
要使用它,您可以将对data.template_file.handler.rendered
的引用替换为对templatefile
的直接调用。如果在多个位置使用该渲染结果,则可以将templatefile
结果分配给本地值,并在多个位置引用该值。
templatefile("${path.module}/templates/handler.js", {
ENDPOINT = var.domain
PASSWORD = var.password
})
您看到的错误消息表明模板本身存在语法错误,但由于template_file
是在单独的提供程序中实现的,因此它以无用的方式报告该语法错误,指向特定的源位置,但不包括相关的源代码片段。
如果您改用templatefile
,Terraform 有望报告此语法错误本身并提供有关它的更好信息。
无论哪种方式,语法错误似乎都在handler.js
文件的第 280 行第 49 列上,并且是由 Terraform 的模板引擎引起的,该引擎期望找到关闭${ ... }
插值序列}
,但找到其他内容。如果更正该语法错误,则模板呈现应通过任一方法成功。