在 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...
}
试图为 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...
}