首页 > 解决方案 > Terraform 在 gcp 中使用两个不同的地图进行资源创建

问题描述

我们正在尝试将组分配给 gcp 项目下的特定角色。我们为 gcp 项目相关变量定义了映射

project_details = {
  "test-project-1" = {
    project_id   = "test-project-1"
    project_name = "test-project-1"
  }
   "test-project-2" = {
    project_id   = "test-project-2"
    project_name = "test-project-2"
  }
}

我们有另一个用角色和成员定义的地图,这是非常静态的。

role_bind = {
  "billing_admin" = {
   name = "roles/billing.admin"
   member = ["group:gcp-******"]
  }
   "billing_viewer" = {
   name = "roles/billing.viewer"
   member = ["group:gcp-******"]
  }
}

我们想使用 google_project_iam_member 资源来循环使用映射变量 project_details 的项目 ID

喜欢

    for_each = var.project_details 

    project = each.value.project_id

然后对于每个项目 ID,我们希望使用另一个映射变量 role_bind 分配角色。

我们可以通过任何方式实现这一点(for_each 中的 for_each)吗?任何帮助,将不胜感激。

标签: google-cloud-platformterraformterraform-provider-gcp

解决方案


Terraform 不支持每个嵌套或嵌套计数。这通常完成的两种方法是使用计数len(var.role_bind) * len(varproject_details)并使用模查找元素,或者使用嵌套推导。嵌套推导更具可读性,所以让我们开始吧:

locals {
    project_role = flatten([for pi : project in var.project_details : 
        [ for ri : role in var.role_details {
            rolename    = role.name
            projectname = project.project_name
            projectid   = project.project_id
            member      = role.member
        }]
    ])
}

然后你会local.project_role在你的陈述中使用计数。


推荐阅读