Terraform JSON поколение - PullRequest
       137

Terraform JSON поколение

1 голос
/ 14 июля 2020

Я пытаюсь создать панель управления AWS, используя terraform для отображения показателей S3. Я думал перебрать все сегменты S3, хранящиеся в переменной списка, и сгенерировать панель управления json.

The for l oop может добавлять метрики, но я не могу удалить конечная запятая, что приводит к ошибочному 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

Обходной путь: - Я закончил жесткое кодирование дополнительная агрегация в конце массива «метрик». В любом случае мне нужна была сумма, и это было простым решением. @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"
          }
       }
   ]
 }

1 Ответ

3 голосов
/ 14 июля 2020

Есть ли простой способ исправить это 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"
      }
    }
  ]
}
...