数据的 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"

不太清楚您的模板文件是什么样子或您要做什么,所以这里有几个不同的答案。

  1. 您可以使用双美元符号转义插值:$${foo} 将呈现为文字 ${foo}

  2. 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 的模板引擎期望找到 } 以关闭 ${ ... } 插值序列,而是找到其他东西。如果您更正该语法错误,模板渲染应该可以通过任何一种方法成功。