【问题标题】:Pass list variable to JSON template in terraform将列表变量传递给 terraform 中的 JSON 模板
【发布时间】:2021-01-20 17:02:27
【问题描述】:

我正在尝试在 terraform 中创建一个可通过变量配置的 cloudwatch 仪表板。我意识到仪表板主体是一个 JSON 字符串,因此基本插值(如下面的“区域”属性)有效。但是对于“指标”之类的东西,我需要传递一个列表 - 并且 terraform 会引发“无效插值”错误。有没有办法让我可以在其中传递复杂变量的可配置模板?

resource "aws_cloudwatch_dashboard" "dashboard" {
  dashboard_name = "dashboard"

  dashboard_body = <<EOF
  {
    "widgets": [
      {
        "type": "metric",
        "width": 12,
        "properties": {
          "metrics": ${local.database_metrics},
          "region": "${var.aws_region}"
        }
      }
    ]
  }
  EOF
}

【问题讨论】:

    标签: json amazon-web-services templates terraform amazon-cloudwatch


    【解决方案1】:

    Terraform 有一个jsonencode function

    【讨论】:

    • 很有趣,谢谢。所以基本上我可以在一个变量中创建一个完整的结构,然后 jsonencode 它。但大部分模板是静态的,不变的,只有少数活动部分。有没有办法加载静态模板并用值替换变量?
    • @YuriyGalanter 是的,有一个 templatefile 函数可以完全按照您的描述:terraform.io/docs/configuration/functions/templatefile.html
    • 我对此进行了研究,但除非我误解了它支持与常规 terraform 代码相同类型的字符串插值。这意味着我不能将列表或地图作为变量传递。还是我错了?
    • 您将传递 jsonencode(list)jsonencode(map) 作为变量,因为您正在呈现 JSON。
    • 如果您确实打算使用templatefile 将其拆分为一个单独的文件,请注意the advice in the documentation 关于使用单个调用jsonencode 来生成整个文件立即构建结构,而不是尝试通过字符串连接来生成 JSON。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2018-09-07
    • 1970-01-01
    • 2017-11-10
    • 2021-01-15
    • 1970-01-01
    • 2023-03-23
    • 2012-11-01
    相关资源
    最近更新 更多