Terraform配置BigQuery表时var.dbs类型不匹配报错求助
问题原因
你定义的var.dbs为list(any),但列表中两个数据库对象结构不一致——第一个包含partitioned_tables字段,第二个没有。Terraform对list(any)的元素会做类型推断,结构不一致会被判定为不同类型,因此触发报错。
解决方案
1. 修正var.dbs的类型定义
将var.dbs从模糊的list(any)改为明确的结构化类型,指定每个字段的类型,并将可选字段标记为可选。在variables.tf中修改:
variable "dbs" { type = list(object({ db_id = string db_name = string app_name = string iam_members = list(object({ role = string member = string })) tables = list(string) partitioned_tables = optional(list(object({ table = string field = string })), []) # 设为可选字段,默认值为空列表 })) description = "List of BigQuery datasets" }
2. 统一dev.tfvars中数据库对象的结构
给第二个数据库对象补上partitioned_tables字段(设为空列表),确保所有元素结构一致:
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 = [] partitioned_tables = [] # 补上字段,保持结构统一 } ]
3. 优化tables模块的分区逻辑(关键修复)
原代码会给所有表应用var.partitioned_tables里的所有分区配置,这不符合需求。修改./tables/tables.tf中的dynamic "time_partitioning"块,只给匹配的表添加对应分区:
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 = [for pt in var.partitioned_tables : pt if pt.table == each.key] 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 }
内容的提问来源于stack exchange,提问作者MassHysteria
相关产品推荐
相关产品推荐

