使用动态 table 名称的 Terraform 访问 Bigquery 多表

Bigquery Multiple Tables access with Terraform with dynamic table name

我正在尝试使用本地列表创建多个 table 访问并将值传递到单个资源块中:

locals {
   map_of_all_tables = [
     {
     "table_name" : "table1"
     "dataset_id" : "dataset_id1"
     "table_id"   : "table_id1"
     },
     {
     "table_name" : "table2"
     "dataset_id" : "dataset_id2"
     "table_id"   : "table_id2"
     }
   ]
 }
resource "google_bigquery_table_iam_member" "access" {
   count = contains(var.table_name_list, local.map_of_all_tables[*].table_name) ? <(no. of matching tables)> : 0
   project = "test-project1"
   dataset_id = locals.map_of_all_tables[<indexOfMatchingTable>].dataset_id #dataset_id of matching table name
   table_id = locals.map_of_all_tables[<indexOfMatchingTable>].table_id #table_id of matching table name
   role = "roles/bigquery.dataViewer"
   member = "user:${var.user_email}"
 }

如果 var.table_name_list 包含任意数量的 table 与本地列表中的 table 名称相匹配,它应该为其中的每一个创建资源“access[]” tables 使用数据集 ID 和列表中的 table IDs 用于这些特定的 tables。这在 Terraform 中可能吗?任何帮助,将不胜感激。谢谢!

如果我对您的问题的理解正确,您在 var.table_name_list var 中有一个列表 tables 需要授予访问权限。所有表都存在于 local.map_of_all_tables 局部变量中,您想根据 var.table_name_list.

对其进行过滤

我假设上述情况,因为你还没有告诉 var.table_name_list 长什么样..

locals {
  map_of_all_tables = [
    {
      "table_name" : "table1"
      "dataset_id" : "dataset_id1"
      "table_id" : "table_id1"
    },
    {
      "table_name" : "table2"
      "dataset_id" : "dataset_id2"
      "table_id" : "table_id2"
    },
    {
      "table_name" : "table3"
      "dataset_id" : "dataset_id3"
      "table_id" : "table_id3"
    }
  ]

  ## this will filter
  table_access_list = [for table in local.map_of_all_tables : table if contains(var.table_name_list, table.table_name)]

}

## assuming the var like below
variable "table_name_list" {
  type    = list(any)
  default = ["table1", "table2"]
}

## output displaying the filtered tables
output "table_access_list" {
    value = local.table_access_list
}

然后,您可以遍历 local.table_access_list var 以仅授予对所需表的访问权限。

resource "google_bigquery_table_iam_member" "access" {
   for_each = {
      for table_access in local.table_access_list : table_access.table_name => table_access
   }
   project = "test-project1-${each.value.table_name}"
   dataset_id = local.table_access_list[each.value.table_name].dataset_id #dataset_id of matching table name
   table_id = local.table_access_list[each.value.table_name].table_id #table_id of matching table name
   role = "roles/bigquery.dataViewer"
   member = "user:${var.user_email}"
}