You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform能否从远程文件引入newrelic_one_dashboard资源的page块配置

可以实现,你可以通过Terraform的http数据源拉取远程配置文件,配合dynamic动态块渲染page嵌套块的方式满足需求,具体实现方案如下:

准备工作

先把page块的配置内容转为结构化的JSON/YAML格式,存储到你的远程文件服务(比如对象存储、私有配置中心等)。单页面配置的JSON示例如下:

// page1.json 示例内容
{
  "name": "Page1",
  "widget_bar": [
    {
      "title": "Average transaction duration, by application",
      "row": 1,
      "column": 1,
      "filter_current_dashboard": true,
      "nrql_query": "FROM Transaction SELECT count(1) FACET appName"
    }
  ],
  "widget_line": [
    {
      "title": "response time view",
      "row": 2,
      "column": 1,
      "width": 4,
      "height": 4,
      "nrql_query": "FROM Transaction SELECT average(duration) FACET appName"
    }
  ]
}

如果是多页面统一存储的文件,直接把上面的结构包在一个数组里即可。

方案1:单独存储每个page的配置(对应第一种期望写法)

# 拉取所有远程page配置文件
data "http" "page_config" {
  for_each = toset(["page1", "page2", "page3"])
  url = "https://你的远程文件地址前缀/${each.key}.json"
  # 私有文件可在请求头加鉴权信息
  # request_headers = {
  #   Authorization = "Bearer ${var.config_token}"
  # }
}

locals {
  # 解析所有page的配置内容
  page_list = [for k in data.http.page_config : jsondecode(data.http.page_config[k].response_body)]
}

resource "newrelic_one_dashboard" "exampledash" {
  name = "New Relic Terraform Example with three pages"

  # 动态渲染所有page块
  dynamic "page" {
    for_each = local.page_list
    content {
      name = page.value.name

      # 渲染bar组件
      dynamic "widget_bar" {
        for_each = page.value.widget_bar
        content {
          title = widget_bar.value.title
          row = widget_bar.value.row
          column = widget_bar.value.column
          filter_current_dashboard = widget_bar.value.filter_current_dashboard

          nrql_query {
            account_id = var.account_id
            query = widget_bar.value.nrql_query
          }
        }
      }

      # 渲染line组件
      dynamic "widget_line" {
        for_each = page.value.widget_line
        content {
          title = widget_line.value.title
          row = widget_line.value.row
          column = widget_line.value.column
          width = widget_line.value.width
          height = widget_line.value.height

          nrql_query {
            account_id = var.account_id
            query = widget_line.value.nrql_query
          }
        }
      }
    }
  }
}

方案2:所有page配置统一存储在单个远程文件(对应第二种期望写法)

# 拉取包含所有page配置的单个远程文件
data "http" "all_page_config" {
  url = "https://你的远程文件地址/all_pages.json"
}

locals {
  all_pages = jsondecode(data.http.all_page_config.response_body)
}

resource "newrelic_one_dashboard" "exampledash" {
  name = "New Relic Terraform Example with three pages"

  # 动态渲染所有page块,逻辑和方案1完全一致
  dynamic "page" {
    for_each = local.all_pages
    content {
      name = page.value.name
      # 后续widget_bar、widget_line的渲染逻辑和方案1完全相同,这里省略
    }
  }
}

注意事项

  • 如果远程配置需要使用Terraform变量,可以将远程文件存为模板格式,拉取后通过templatefile函数或字符串替换逻辑完成变量插值
  • 注意管控远程文件的访问权限,避免敏感配置泄露
  • 远程配置的字段结构需要和动态块中引用的字段完全匹配,否则会出现解析报错

内容的提问来源于stack exchange,提问作者Selva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:45:03