Terraform批量创建BigTable表报错:列族属性需字符串类型
解决Terraform批量创建BigTable表时列族类型不匹配的错误
问题场景
使用Terraform批量创建GCP BigTable实例和多个表时,执行terraform plan报错,提示family属性需要字符串类型,但当前返回列表类型。
原模块代码
resource "google_project_service" "gcp_services" { for_each = toset(var.gcp_service_list) project = var.project_id service = each.key } resource "google_bigtable_instance" "instance" { name = var.bigtable_instance_name project = var.project_id deletion_protection = var.deletion_protection labels = var.labels cluster { cluster_id = var.bigtable_cluster_name zone = var.zone storage_type = var.bigtable_storage_type autoscaling_config { min_nodes = var.min_nodes max_nodes = var.max_nodes cpu_target = var.cpu_target } } lifecycle { prevent_destroy = false } depends_on = [ google_project_service.gcp_services ] } resource "google_bigtable_table" "table" { count = var.bigtable_count name = element(var.bigtable_table_name, count.index) instance_name = google_bigtable_instance.instance.name split_keys = [ "a", "b", "c"] project = var.project_id lifecycle { prevent_destroy = false } column_family { family = lookup(var.family_type, element(var.bigtable_table_name, count.index ), [] ) } }
变量配置
variable "bigtable_count" { type = number } variable "family_type" { type = map(list(string)) default = { "test-bigtable-tablename"= ["r", "s"] "test2-bigtable-tablename"= ["r", "o"] } }
错误信息
on ../../main.tf line 48, in resource "google_bigtable_table" "table": │ 48: family = lookup(var.family_type, element(var.bigtable_table_name, count.index ), []) │ ├──────────────── │ │ count.index is a number, known only after apply │ │ var.bigtable_table_name is a list of string, known only after apply │ │ var.family_type is a map of list of string, known only after apply │ │ Inappropriate value for attribute "family": string required. ╵ Operation failed: failed running terraform plan (exit 1)
错误原因
google_bigtable_table资源的column_family块中,family字段要求单个字符串类型的值,但当前代码直接将lookup(var.family_type, ...)返回的列族列表赋值给它,类型不匹配。每个列族需要单独定义一个column_family块,而非把多个列族塞进同一个块的family字段。
修正方案
使用Terraform的**动态块(dynamic block)**遍历每个表对应的列族列表,为每个列族生成独立的column_family块:
修正后的google_bigtable_table资源代码
resource "google_bigtable_table" "table" { count = var.bigtable_count name = element(var.bigtable_table_name, count.index) instance_name = google_bigtable_instance.instance.name split_keys = [ "a", "b", "c"] project = var.project_id lifecycle { prevent_destroy = false } # 动态生成列族块 dynamic "column_family" { # 遍历当前表对应的列族列表 for_each = lookup(var.family_type, element(var.bigtable_table_name, count.index), []) content { family = column_family.value } } }
说明
dynamic "column_family"会根据for_each中的列表元素数量,自动生成对应数量的column_family块column_family.value取列表中的单个字符串值,匹配family字段的类型要求- 如果某个表在
family_type中没有对应配置,lookup会返回空列表,此时不会生成任何列族块
内容的提问来源于stack exchange,提问作者Ashok Reddy
相关产品推荐
相关产品推荐

