Terraform修改Cloud SQL实例区域后,如何同步重建数据库?
解决Terraform中Cloud SQL实例变更区域时数据库未同步重建的问题
问题核心在于:你当前的google_sql_database资源仅通过实例名称关联SQL实例,但修改区域后新实例的名称和旧实例一致,Terraform无法识别到数据库需要关联新实例,因此不会在第一次apply时同步创建新数据库。
修改方案
将数据库资源的instance参数从引用实例名称改为引用实例的唯一标识符(比如self_link或id),这样当SQL实例因区域变更被销毁重建时,这个唯一标识符会发生变化,Terraform会自动触发数据库的销毁和重建操作,实现一步完成。
修改后的代码如下:
# main.tf resource "google_sql_database_instance" "database_instance" { database_version = "POSTGRES_14" deletion_protection = false instance_type = "CLOUD_SQL_INSTANCE" name = "test-database" project = var.project_name region = "europe-west1" # 修改为目标区域 root_password = null settings { activation_policy = "ALWAYS" availability_type = "ZONAL" collation = null connector_enforcement = "NOT_REQUIRED" disk_autoresize = true disk_autoresize_limit = 0 disk_type = "PD_SSD" edition = "ENTERPRISE" pricing_plan = "PER_USE" tier = "db-custom-1-3840" time_zone = null maintenance_window { day = 1 hour = 0 update_track = "stable" } } timeouts { create = null delete = null update = null } } resource "google_sql_database" "database" { # 关键修改:用self_link替代name,关联实例的唯一标识 instance = google_sql_database_instance.database_instance.self_link name = "new_database" project = var.project_name depends_on = [google_sql_database_instance.database_instance] }
原理说明
self_link是Google Cloud资源的全局唯一URL,每个SQL实例的self_link包含区域信息,当实例区域变更重建后,新实例的self_link会和旧实例完全不同。- Terraform会监控资源参数的变化,当
instance参数值改变时,会判定数据库资源需要销毁旧实例上的数据库,并在新实例上创建新的数据库,从而在一次terraform apply中完成所有操作。
内容的提问来源于stack exchange,提问作者LoicM
相关产品推荐
相关产品推荐

