【问题标题】:Terraform interpolation syntax error for data template_file数据模板文件的 Terraform 插值语法错误
【发布时间】:2020-02-05 09:20:48
【问题描述】:

在我的 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”版本"~&gt; 2.7"

【问题讨论】:

  • 你应该可以只做file("${path.module}/templates/handler.js")

标签: terraform terraform-provider-aws


【解决方案1】:

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

  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]}"
}

如果两者都不是您想要的,您需要共享您的模板文件或重复错误的修改版本。

【讨论】:

    【解决方案2】:

    template_file 数据源对于 Terraform 0.11 及更早版本的用户仍然存在,但由于您使用的是 Terraform 0.12 版本,我建议您改用the templatefile function。因为它直接内置在 Terraform 中,所以能够产生更好的错误消息。

    要使用它,您可以直接调用templatefile 替换您对data.template_file.handler.rendered 的引用。如果您在多个位置使用该渲染结果,则可以将 templatefile 结果分配给 local value 并在多个位置引用它。

    templatefile("${path.module}/templates/handler.js", {
      ENDPOINT = var.domain
      PASSWORD = var.password
    })
    

    您看到的错误消息表明您的模板本身存在语法错误,但由于 template_file 是在单独的提供程序中实现的,它以一种无用的方式报告该语法错误,指向特定的源位置但不包括相关源码sn-p。

    如果您改用templatefile,Terraform 有望自行报告此语法错误并提供更好的相关信息。

    无论哪种方式,语法错误似乎在您的 handler.js 文件的第 280 行第 49 列,并且是由于 Terraform 的模板引擎希望找到 } 以关闭 ${ ... } 插值序列但发现其他内容反而。如果您更正了该语法错误,则模板渲染应该可以通过任何一种方法成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2016-10-14
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 2021-03-17
      • 2022-10-15
      相关资源
      最近更新 更多