使用动态 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}"
}
我正在尝试使用本地列表创建多个 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}"
}