Terraform中的动态JSON

Terraform中的动态JSON,terraform,Terraform,我使用Terraform调用lambda函数,需要传递一个包含字符串值列表的输入JSON data "aws_lambda_invocation" "invo6" { function_name = "my_function" input = <<JSON { "pairs":[ { "principal":"ar

我使用Terraform调用lambda函数,需要传递一个包含字符串值列表的输入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
}
我尝试将“数据库”代码替换为:

input = <<JSON
    {
        "pairs":[
             {
                "principal":"arn:aws:iam::12345678901:role/myRole", 
                ${jsonencode("databases": [for each in var.gluedb_map : "my_db_${each}"], )}
            }
        ]
    } 
    JSON
但我得到了一个错误: 每个函数参数与下一个函数参数之间需要逗号分隔

谁能看出我哪里做错了? 谢谢

您可以尝试使用,并获得:

您可以尝试使用,并获得:


如果您只是对访问地图的键感兴趣,那么可以使用返回键列表。然后,您可以将其与使用字符串插入每个列表项相结合

我还建议对更广泛的数据结构使用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"}]}

如果您只是对访问地图的键感兴趣,那么可以使用返回键列表。然后,您可以将其与使用字符串插入每个列表项相结合

我还建议对更广泛的数据结构使用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"}]}

您是否可以编辑您的问题以显示示例输入,然后显示您期望从该输入获得的输出?添加了包含db名称的映射的详细信息。还扩展了我失败代码的代码。所需的输出是第一个代码部分,在这里我硬编码了db名称-我试图重新创建它,但不是硬编码,而是从映射填充。希望更清楚?您可以编辑您的问题以显示示例输入,然后显示您期望从该输入中获得的输出吗?添加了包含db名称的映射的详细信息。还扩展了我失败代码的代码。所需的输出是第一个代码部分,在这里我硬编码了db名称-我试图重新创建它,但不是硬编码,而是从映射填充。希望更清楚?