Terraform创建BigQuery谷歌表格外部表如何取消自动设置的compression参数
问题描述
使用Terraform的google_bigquery_table资源创建基于Google Sheets的BigQuery外部表时,未定义compression参数,但部署后BigQuery中该表自动被设置了compression参数;而通过SQL语句创建同类型表时,该参数不会被设置,需要通过Terraform实现相同效果。
解决方案
1. 显式设置compression为null
在external_data_configuration块中添加compression = null,让Terraform向BigQuery API发送请求时不包含该参数,避免自动填充默认值:
resource "google_bigquery_table" "external_table" { dataset_id = "dataset_test" table_id = "external_table_test" external_data_configuration { autodetect = true source_format = "GOOGLE_SHEETS" ignore_unknown_values = false compression = null # 显式设置为null,避免自动填充参数 google_sheets_options { skip_leading_rows = 1 range = local.table_range } source_uris = [local.external_table_uri] } deletion_protection = false }
2. 使用lifecycle忽略compression参数差异
如果上述方法不生效,可通过lifecycle块的ignore_changes属性,让Terraform忽略compression参数的状态差异,即使BigQuery中存在该参数,Terraform也不会试图修改或设置它:
resource "google_bigquery_table" "external_table" { dataset_id = "dataset_test" table_id = "external_table_test" external_data_configuration { autodetect = true source_format = "GOOGLE_SHEETS" ignore_unknown_values = false google_sheets_options { skip_leading_rows = 1 range = local.table_range } source_uris = [local.external_table_uri] } deletion_protection = false lifecycle { ignore_changes = [ external_data_configuration[0].compression, # 忽略compression参数的变更 ] } }
3. 升级Terraform Google Provider版本
部分旧版本的Terraform Google Provider会默认填充compression参数,尝试升级到最新稳定版可修复该问题:
在versions.tf中更新版本约束:
terraform { required_providers { google = { source = "hashicorp/google" version = "~> 5.0" # 使用最新稳定版 } } }
执行terraform init -upgrade完成provider升级。
原理说明
Terraform的google_bigquery_table资源中,compression为可选参数,但部分旧版本provider会默认填充为NONE并发送给BigQuery API;而SQL创建时API不会自动添加该参数。显式设置compression = null会让Terraform不向API传递该字段,实现和SQL创建一致的效果;ignore_changes则是让Terraform忽略该参数的状态差异,保持BigQuery中无该参数的状态。
内容的提问来源于stack exchange,提问作者User1234

