【问题标题】:Escaping dollar sign in Terraform在 Terraform 中转义美元符号
【发布时间】:2021-07-01 08:51:32
【问题描述】:

在尝试为 API 网关创建名为 $disconnect 的路由密钥时,我正在运行下面的 sn-p,而 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 的内容。

怎么做?

【问题讨论】:

    标签: terraform hcl


    【解决方案1】:

    在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 的解析器将其视为模板序列或模板转义。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        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...
        }
        

        【讨论】:

          猜你喜欢
          • 2015-06-17
          • 1970-01-01
          • 2022-11-22
          • 1970-01-01
          • 2017-02-19
          • 1970-01-01
          • 2021-04-25
          • 2013-05-28
          • 1970-01-01
          相关资源
          最近更新 更多