【问题标题】:Terraform JSON generationTerraform JSON 生成
【发布时间】:2020-11-03 09:46:54
【问题描述】:

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

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

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

代码 sn-p :-

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

解决方法:- 我最终在“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"
          }
       }
   ]
 }

【问题讨论】:

    标签: amazon-web-services amazon-s3 terraform terraform-provider-aws


    【解决方案1】:

    有没有一种简单的方法可以使用这种方法来修复这个 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
    }
    

    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"
          }
        }
      ]
    }
    

    【讨论】:

    • 我确实尝试了 jsonencode,即使使用它,尾随逗号(在度量中的最后一个元素之后)仍然存在。
    • @Sandeep 我添加了一个完整的解决方案。再试一次。如果您还有任何问题,请告诉我。
    • 谢谢@kharandziuk。我也这样做了,唯一的问题是 terraform 不接受指标中的最后一个逗号。我最终在聚合指标中添加了一个额外的数组,无论如何我都需要它。我会用详细信息更新我的帖子。我接受这个作为完整的答案,因为这仍然是一个很好的参考。
    • 也请考虑Generating JSON or YAML from a template 中的建议。在复杂情况下很难通过字符串连接生成 JSON。
    猜你喜欢
    • 2019-04-01
    • 2020-12-25
    • 2023-03-27
    • 2022-07-23
    • 2020-11-03
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多