将 terraform HCL 变量 type=map(any) 转换为 JSON

Posted

技术标签:

【中文标题】将 terraform HCL 变量 type=map(any) 转换为 JSON【英文标题】:convert terraform HCL variable type=map(any) to JSON 【发布时间】:2021-11-25 05:30:20 【问题描述】:

我正在尝试将用 HCL 编写的 terraform 变量转换为动态生成的包含该变量的 tf.json 文件,但我遇到了错误。

我正在尝试转换的 HCL 版本:

variable "accounts" 
  type        = map(any)

  default = 
    acct1     = ["000000000001"]
    acct2     = ["000000000002"]
  

我尝试了以下格式:


  "variable": 
    "accounts": 
      "type": "map(any)",

      "default": [
         "acct1": "000000000001" ,
         "acct2": "000000000002"
      ]
    
  


  "variable": 
    "accounts": 
      "type": "map(any)",
      "default": [
        
          "acct1": ["000000000001"],
          "acct2": ["000000000002"]
        
      ]
    
  

我收到以下错误:

│ Error: Invalid default value for variable
│ 
│   on accounts.tf.json line 6, in variable.accounts:
│    6:       "default": [
This default value is not compatible with the variable's type constraint: map of any single type required.

是否有工具可以将 HCL 转换为有效的.tf.json 配置?或者我在这里的格式缺少什么?

【问题讨论】:

【参考方案1】:

您的默认值是地图列表,但它应该只是地图:

      "default": 
         "acct1": "000000000001",
         "acct2": "000000000002"
      

【讨论】:

【参考方案2】:

您为变量指定的类型是map(any),因此您的变量默认值也必须是map(any),不能是list(map(list(string)))


  "variable": 
    "accounts": 
      "type": "map(any)",
      "default": 
        "acct1": ["000000000001"],
        "acct2": ["000000000002"]
      
    
  

这将分配一个 object(list(string)) 类型的默认值,它与 HCL2 中相同的 object(list(string)) 类型结构匹配,并且也是指定 map(any) 的子集。

【讨论】:

以上是关于将 terraform HCL 变量 type=map(any) 转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将 Terraform 模板转换为 Cloudformation 模板

如何在“资源”部分转义包含 $aws:username 的 HCL 字符串?

将值动态注入 Terraform 中的变量

从 Terraform 地图变量中提取键/值

S3 存储桶 - Terraform:计划显示不存在的更改,默认值

如何在Terraform中将字符串添加到变量?