Terraform JSON 生成

San*_*eep 1 amazon-s3 amazon-web-services terraform terraform-provider-aws

我正在尝试使用 terraform创建一个AWS 仪表板来显示 S3 指标。我正在考虑遍历存储在列表变量中的所有 S3 存储桶并生成仪表板 json。

for 循环能够添加指标,但我无法删除尾随逗号,这会导致错误的 json。

  1. 有没有一种简单的方法可以使用这种方法来修复这个 json?
  2. 有没有更好的方法来进行json处理?
  3. 我应该使用 terraform 进行此处理吗?

代码片段:-

dashboard_body = <<EOF
 {
  "start":"-P6M",
   "widgets": [
       {
          "type":"metric",
          "x":0,
          "y":0,
          "width":12,
          "height":6,
          "properties":{
             "metrics":[
%{ for bucket in var.buckets }
[
                   "AWS/S3",
                   "BucketSizeBytes",
                   "StorageType",
                   "StandardStorage",
                    "BucketName",
                   "${bucket}"
]
%{ endfor }
             ],
             "period":86400,
             "stat":"Average",
             "region":"us-east-1",
             "title":"Storage usage"
          }
       }
   ]
 }
 EOF
Run Code Online (Sandbox Code Playgroud)

解决方法:- 我最终在“metrics”数组的末尾硬编码了一个额外的聚合。无论如何我都需要总数,这是一个简单的解决方法。@kharandziuk 是理想的实现方式,但即使如此,您也可能需要使用此解决方法。

最终代码:-

{
  "start":"-P6M",
   "widgets": [
       {
          "type":"metric",
          "x":0,
          "y":0,
          "width":12,
          "height":6,
          "properties":{
             "metrics":[
                %{ for bucket in buckets }
                [
                   "AWS/S3",
                   "BucketSizeBytes",
                   "StorageType",
                   "StandardStorage",
                    "BucketName",
                   "${bucket}"
                ],
                %{ endfor }
                [
                  { "expression": "SUM(METRICS())", "label": "Total Storage", "id": "e3" }
                ]
             ],
             "period":86400,
             "stat":"Average",
             "region":"us-east-1",
             "title":"Storage usage"
          }
       }
   ]
 }
Run Code Online (Sandbox Code Playgroud)

kha*_*iuk 5

有没有一种简单的方法可以使用这种方法来修复这个 json?

我会使用jsonencode函数在 HCL 中制作地图并将其转换为 JSON。

有没有更好的方法来进行json处理?

有。试试templatefile功能。您将拥有一个模板并将一些变量插入其中。

我应该使用 terraform 进行此处理吗?

是的你应该。Terraform 提供了执行此操作的工具。代码应该类似于下面的示例代码:

variable "buckets" {
  default = ["max", "sandeep"]
}

locals{
  dashboard_body = templatefile("${path.module}/file.json.tmpl", {
    metrics = jsonencode( # we create the list in HCL and transform it into json
      [for bucket in var.buckets: [
          "AWS/S3",
          "BucketSizeBytes",
          "StorageType",
          "StandardStorage",
          "BucketName",
          "${bucket}"
        ]
      ]
    )
  })
}

output "result" {
  value = local.dashboard_body
}
Run Code Online (Sandbox Code Playgroud)

在哪里file.json.tmpl

{
  "start":"-P6M",
    "widgets": [
    {
      "type":"metric",
      "x":0,
      "y":0,
      "width":12,
      "height":6,
      "properties":{
        "metrics": ${metrics},
        "period":86400,
        "stat":"Average",
        "region":"us-east-1",
        "title":"Storage usage"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)