for_each循环使用动态块和来自tfvars的值



我试图用动态块创建time_partitioning的某些BigQuery表,我想在运行时使用tfvars的值,如下所示:

。/表/tables.tf:

resource "google_bigquery_table" "tables" {
for_each            = var.tables == [] ? [] : toset(var.tables)
dataset_id          = var.db_id
deletion_protection = false
table_id            = each.key

dynamic "time_partitioning" {
for_each = var.partitioned_tables
content {
type  = "DAY"
field = time_partitioning.value.field
}
}
labels = {
environment = var.environment
application = var.application
}
schema = fileexists("${path.module}/${var.db_id}/${each.key}.json") ? file("${path.module}/${var.db_id}/${each.key}.json") : null
}

main.tf:

resource "google_bigquery_dataset" "database" {
count                      = length(var.dbs)
dataset_id                 = var.dbs[count.index].db_id
friendly_name              = var.dbs[count.index].db_name
description                = "TF"
location                   = "US"
delete_contents_on_destroy = var.delete_contents_on_destroy
labels = {
environment = var.environment
application = var.dbs[count.index].app_name
}
}
module "tables" {
source      = "./tables"
count       = length(var.dbs)
db_id       = google_bigquery_dataset.database[count.index].dataset_id
environment = var.environment
application = var.dbs[count.index].app_name
tables      = var.dbs[count.index].tables
partitioned_tables = var.dbs[count.index].partitioned_tables
}
module "iam" {
source      = "./iam"
count       = length(var.dbs)
db_id       = google_bigquery_dataset.database[count.index].dataset_id
iam_members = var.dbs[count.index].iam_members
}

dev.tfvars:

region     = "us-central1"
project_id = "some-project"
dbs = [
{
db_id    = "dataset1"
db_name  = "dataset1"
app_name = "hello"
iam_members = [
{
role   = "roles/bigquery.dataEditor"
member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com",
}
]
tables = ["daily_inventory", "dc_inventory", "products", "daily_sales", "planned_inventory", "stores", "stores_in_program"]
partitioned_tables = [
{
table = "daily_sales"
field = "sales_timestamp"
},
{
table = "daily_inventory"
field = "inventory_timestamp"
}
]
},
{
db_id    = "dataset2"
db_name  = "dataset2"
app_name = "hello"
iam_members = [
{
role   = "roles/bigquery.dataEditor"
member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com"
}
]
tables = []
}
]
environment                = "development"
delete_contents_on_destroy = true

var。DBS is type = list(any)

得到:

给定的值不适合var.dbs变量。Tf:9,1-15:所有列表元素必须具有相同的类型。

提前感谢!

list(any)并不意味着您可以拥有"任意"的元素。输入你的列表。所有元素必须具有相同类型的,并且不能像现在这样混合类型(即第二个元素缺少partitioned_tables)。any仅意味着TF将推断元素的单一类型,但所有元素必须是该单一类型。所以你有三个选择:

  1. removetype = list(any)
  2. 使用optional参数完全定义类型,而不是使用any
  3. 添加partitioned_tables到第二个元素:
[
{
db_id    = "dataset1"
db_name  = "dataset1"
app_name = "hello"
iam_members = [
{
role   = "roles/bigquery.dataEditor"
member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com",
}
]
tables = ["daily_inventory", "dc_inventory", "products", "daily_sales", "planned_inventory", "stores", "stores_in_program"]
partitioned_tables = [
{
table = "daily_sales"
field = "sales_timestamp"
},
{
table = "daily_inventory"
field = "inventory_timestamp"
}
]
},
{
db_id    = "dataset2"
db_name  = "dataset2"
app_name = "hello"
iam_members = [
{
role   = "roles/bigquery.dataEditor"
member = "serviceAccount:ser-sa@some-project.iam.gserviceaccount.com"
}
]
partitioned_tables = []
tables = []
}
]

相关内容

  • 没有找到相关文章

最新更新