【问题标题】:Dynamic JSON in TerraformTerraform 中的动态 JSON
【发布时间】:2020-08-05 20:12:04
【问题描述】:

我正在使用 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
}

我不想对这些数据库名称进行硬编码,而是想从我的 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

但我得到错误: 需要用逗号将每个函数参数与下一个函数参数分开。

谁能发现我哪里出错了? 谢谢

【问题讨论】:

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

标签: terraform


【解决方案1】:

如果您只是对访问地图的键感兴趣,那么您可以使用keys function 返回键列表。然后,您可以将其与 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"}]}

【讨论】:

  • 所以您只是复制粘贴了 Tasos 的答案(2 小时前发布)并添加了水?
  • @nickolay.laptev 我不确定你的意思是什么?它使用了一些相同的功能,但这个答案有一个稍微不同的方法来实现它,并且更深入地解释它。如果您认为它没有添加任何内容,那么欢迎您对这个答案投反对票并为另一个答案投赞成票,但我个人认为这个答案添加的内容足以比其他答案更有用。
【解决方案2】:

您可以尝试使用keysformatlistjoin获取:

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

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2020-08-18
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2023-02-07
    • 2021-10-17
    相关资源
    最近更新 更多