在 Terraform 中转义美元符号

Tar*_*Tar 22 terraform hcl

在尝试创建$disconnect为 API 网关命名的路由键时,我运行下面的代码片段,同时var.route_name应该收到字符串“disconnect”:

resource "aws_apigatewayv2_route" "route" {
  api_id    = var.apigw_api.id
  route_key = "$${var.route_name}"
  # more stuff...
}
Run Code Online (Sandbox Code Playgroud)

但它并没有正确地转义它。我找不到正确的方法来发出 a $,后跟var.route_names 的内容。

怎么做?

Mar*_*ins 29

Terraform 的模板语言中,该序列$${是文字的转义序列${,因此不幸的是,在您的示例中,Terraform 将理解$${var.route_name}为文字${var.route_name},而不是字符串插值。

为了避免这种情况,您可以使用任何使初始值$与后续值分开的策略${,以便 Terraform 将第一个值理解$为文字,将其余部分理解为插值序列。

一种方法是$通过插值序列本身来呈现初始文字:

"${"$"}${var.route_name}"
Run Code Online (Sandbox Code Playgroud)

上面使用的插值序列通常多余的——它的值本身就是一个文字字符串——但在这种情况下,改变 Terraform 对初始美元符号的解释在语法上是有用的。

其他一些排列:

join("", ["$", var.route_name])
Run Code Online (Sandbox Code Playgroud)
format("$%s", var.route_name)
Run Code Online (Sandbox Code Playgroud)
locals {
  dollar = "$"
}

resource "aws_apigatewayv2_route" "route" {
  route_key = "${local.dollar}${var.route_name}"
  # ...
}
Run Code Online (Sandbox Code Playgroud)

同样,所有这些只是用于$以各种方式呈现文字,避免其后跟{or ${,从而避免 Terraform 的解析器将其视为模板序列或模板转义。