在 Terraform 中转义美元符号

Escaping dollar sign in Terraform

试图为 API 网关创建一个名为 $disconnect 的路由键,我是 运行 下面的代码片段,而 var.route_name 应该接收字符串“断开连接”:

resource "aws_apigatewayv2_route" "route" {
  api_id    = var.apigw_api.id
  route_key = "$${var.route_name}"
  # more stuff...
}

但它没有正确转义。我找不到发出 $ 后跟 var.route_name 内容的正确方法。

怎么做?

在 hcl2 字符串插值中可能存在更简单的转义 $ 的方法,但 format function 也可以在此处为您提供帮助:

resource "aws_apigatewayv2_route" "route" {
  api_id    = var.apigw_api.id
  route_key = format("$%s", var.route_name)
  # more stuff...
}

Terraform's template language 中,序列 $${ 是文字 ${ 的转义序列,因此不幸的是,在您的示例中,Terraform 会将 $${var.route_name} 理解为文字 [=17] =],而不是作为字符串插值。

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

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

"${"$"}${var.route_name}"

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

其他一些排列:

join("", ["$", var.route_name])
format("$%s", var.route_name)
locals {
  dollar = "$"
}

resource "aws_apigatewayv2_route" "route" {
  route_key = "${local.dollar}${var.route_name}"
  # ...
}

同样,所有这些都只是为了以各种方式呈现文字 $,避免其后跟 {${,从而避免 Terraform 的解析器处理它作为模板序列或模板转义。

如果您试图动态设置变量名(即变量名取决于另一个变量),这是不可能的。否则你可以这样做:

resource "aws_apigatewayv2_route" "route" {
  api_id    = var.apigw_api.id
  route_key = "$$${var.route_name}"
  # more stuff...
}

相反,创建一个映射 route_keys 并根据名称选择键:

locals {
  route_keys = {
    route_name1 = ...
    route_name2 = ...
  }
}

resource "aws_apigatewayv2_route" "route" {
  api_id    = var.apigw_api.id
  route_key = local.route_keys[var.route_name]
  # more stuff...
}