【问题标题】:Terraform JSON Error when using for_each inside of resource inside of json file在 json 文件内的资源中使用 for_each 时出现 Terraform JSON 错误
【发布时间】:2019-10-31 05:37:10
【问题描述】:

我正在尝试在 .tf.json 文件的资源中使用新的 for_each

目标是能够传递员工地图并以编程方式为每个人生成一个 gsuite_user,而无需重新声明每个资源(也因为模块还不能循环)

{
  "resource": {
    "gsuite_user": {
      "for_each": "${var.employee_map}",
      "employee": {
        "change_password_next_login": true,
        "name": {
          "family_name": "${each.value.last_name}",
          "given_name": "${each.value.first_name}"
        },
        "password": "password",
        "primary_email" :"${var.first_name}.${var.last_name}@email",
        "lifecycle": {
          "ignore_changes": ["password", "change_password_next_login"]
        }
      }
    }
}

我收到以下错误:

Error: Incorrect JSON value type

  on ../modules/employees/main.tf.json line 4, in resource.gsuite_user:
   4:       "for_each": "${var.employee_map}",


Either a JSON object or a JSON array is required, representing the contents of
one or more "resource" blocks.

我的变量文件是

{
  "employee_map": {
    "john.doe": {
      "first_name": "john",
      "last_name": "doe"
    },
    "jane.doey": {
      "first_name": "jane",
      "last_name": "doey"
    }
  }
}

【问题讨论】:

    标签: json terraform


    【解决方案1】:

    出现此错误是因为您的资源声明中缺少嵌套级别。

    以如下原生语法声明为例:

    resource "gsuite_user" "employee" {
      for_each = var.employee_map
    
      change_password_next_login = true
      # etc, etc
    }
    

    请注意,在上面,for_each 参数位于 resource 块内,还有 change_password_next_login 参数以及随后的所有其他参数。为了在 JSON 中模拟这一点,"for_each" 属性必须在代表该块的 JSON 对象内:

    {
      "resource": {
        "gsuite_user": {
          "employee": {
            "for_each": "${var.employee_map}",
            "change_password_next_login": true,
            "name": {
              "family_name": "${each.value.last_name}",
              "given_name": "${each.value.first_name}"
            },
            "password": "password",
            "primary_email" :"${var.first_name}.${var.last_name}@email",
            "lifecycle": {
              "ignore_changes": ["password", "change_password_next_login"]
            }
          }
        }
      }
    }
    

    如果您将for_each 直接放在gsuite_user 对象内,则JSON 解码器假定您正在尝试声明resource "gsuite_user" "for_each" 块,因此尝试将"${var.employee_map}" 解释为该块的主体。这是无效的,因为块的主体必须始终表示为 JSON 对象。 (它也可以是一个数组,在这种情况下它会声明一个或多个块,但这在这种情况下没有意义,因为资源块标签在模块中必须是唯一的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2014-09-26
      • 1970-01-01
      • 2023-03-03
      • 2021-09-24
      • 2021-10-04
      • 2023-02-08
      相关资源
      最近更新 更多