如何解决在 Terraform 中转义美元符号
在尝试为 API 网关创建名为 $disconnect
的路由键时,我正在运行下面的代码段,而 var.route_name
应接收字符串“disconnect”:
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}
理解为字面上的 ${var.route_name}
,而不是作为字符串插值。
为避免这种情况,您可以使用任何使初始 $
与后面的 ${
分开的策略,以便 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...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。