数据的 Terraform 插值语法错误 template_file
Terraform interpolation syntax error for data template_file
在我的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 是否允许插值内部插值?如果是这样 - 任何关于指向错误位置的建议将不胜感激。
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]}"
}
如果两者都不是您要查找的内容,您需要共享您的模板文件或重现该错误的修改版本。
对于 Terraform 0.11 及更早版本的用户,template_file
数据源继续存在,但由于您使用的是 Terraform 0.12 版本,我建议改用 the templatefile
function。因为它直接内置于 Terraform 中,所以能够生成更好的错误消息。
要使用它,您可以将对 data.template_file.handler.rendered
的引用替换为对 templatefile
的直接调用。如果您在多个位置使用该渲染结果,您可以将 templatefile
结果分配给 local value 并在多个位置引用它。
templatefile("${path.module}/templates/handler.js", {
ENDPOINT = var.domain
PASSWORD = var.password
})
您看到的错误消息表明您的模板本身存在语法错误,但由于 template_file
是在单独的提供程序中实现的,因此它以无用的方式报告该语法错误,指向特定的源位置但不包括相关的源代码片段。
如果您改用 templatefile
,Terraform 有望自行报告此语法错误并提供更好的相关信息。
无论哪种方式,语法错误似乎都在您的 handler.js
文件的第 280 行第 49 列,并且是由 Terraform 的模板引擎期望找到 }
以关闭 ${ ... }
插值序列,而是找到其他东西。如果您更正该语法错误,模板渲染应该可以通过任何一种方法成功。
在我的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 是否允许插值内部插值?如果是这样 - 任何关于指向错误位置的建议将不胜感激。
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]}"
}
如果两者都不是您要查找的内容,您需要共享您的模板文件或重现该错误的修改版本。
对于 Terraform 0.11 及更早版本的用户,template_file
数据源继续存在,但由于您使用的是 Terraform 0.12 版本,我建议改用 the templatefile
function。因为它直接内置于 Terraform 中,所以能够生成更好的错误消息。
要使用它,您可以将对 data.template_file.handler.rendered
的引用替换为对 templatefile
的直接调用。如果您在多个位置使用该渲染结果,您可以将 templatefile
结果分配给 local value 并在多个位置引用它。
templatefile("${path.module}/templates/handler.js", {
ENDPOINT = var.domain
PASSWORD = var.password
})
您看到的错误消息表明您的模板本身存在语法错误,但由于 template_file
是在单独的提供程序中实现的,因此它以无用的方式报告该语法错误,指向特定的源位置但不包括相关的源代码片段。
如果您改用 templatefile
,Terraform 有望自行报告此语法错误并提供更好的相关信息。
无论哪种方式,语法错误似乎都在您的 handler.js
文件的第 280 行第 49 列,并且是由 Terraform 的模板引擎期望找到 }
以关闭 ${ ... }
插值序列,而是找到其他东西。如果您更正该语法错误,模板渲染应该可以通过任何一种方法成功。