Dynami c JSON в Terraform - PullRequest
       17

Dynami c JSON в Terraform

1 голос
/ 05 августа 2020

Я использую Terraform для вызова лямбда-функции, и мне нужно передать ввод JSON, который включает список строковых значений.

 data "aws_lambda_invocation" "invo6" {
   function_name = "my_function"
   input = <<JSON
   {
     "pairs":[
       {
         "principal":"arn:aws:iam::12345678901:role/myRole", 
         "databases":[
           "my_db_apple", "my_db_banana", "my_db_orange"
          ]
       }
     ] 
  } 
  JSON
}

Вместо жесткого кодирования этих имен баз данных я хочу чтобы вытащить карту, которая уже существует в другом месте в моих tf файлах.

variable "gluedb_map" {
  type = map(map(string))
  default = {
    "apple" = {             
       description = "my apple db"          
       catalog = ""
       location_uri = "s3://mybucket/"          
       params = ""
    }       
    "banana" = {            
       description = "my banana db"
       catalog = ""
       location_uri = "s3://anotherpath/"
       params = "" 
    }

Я попытался заменить код базы данных для этого:

input = <<JSON
    {
        "pairs":[
             {
                "principal":"arn:aws:iam::12345678901:role/myRole", 
                ${jsonencode("databases": [for each in var.gluedb_map : "my_db_${each}"], )}
            }
        ]
    } 
    JSON

, но затем я получаю ошибку : Запятая требуется для отделения каждого аргумента функции от следующего.

Может ли кто-нибудь определить, где я ошибаюсь? Спасибо

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Если вас просто интересует доступ к клавишам карты, вы можете использовать keys функцию , чтобы вернуть список ключей. Затем вы можете объединить это с formatlist, чтобы интерполировать каждый элемент списка строкой.

Я бы также рекомендовал использовать карту HCL для более широкой структуры данных, а затем кодировать в JSON вместо того, чтобы пытаться JSON кодировать его часть и передергивать вещи, чтобы придать ему подходящую форму.

Полностью отработанный пример будет выглядеть примерно так:

variable "gluedb_map" {
  type = map(map(string))
  default = {
    "apple" = {             
       description = "my apple db"          
       catalog = ""
       location_uri = "s3://mybucket/"          
       params = ""
    }       
    "banana" = {            
       description = "my banana db"
       catalog = ""
       location_uri = "s3://anotherpath/"
       params = "" 
    }
  }
}

output "json" {
  value = jsonencode({
    pairs: [
      {
        principal = "arn:aws:iam::12345678901:role/myRole"
        databases = formatlist("my_db_%s", keys(var.gluedb_map))
      }
    ]
  })
}

Применение этого результата выдаст следующее:

json = {"pairs":[{"databases":["my_db_apple","my_db_banana"],"principal":"arn:aws:iam::12345678901:role/myRole"}]}
1 голос
/ 05 августа 2020

Вы можете попробовать использовать ключи , список форматов и присоединиться , чтобы получить:

${jsonencode("databases": [join("," , formatlist("my_db_%s", keys(var.gluedb_map))  )}
...