使用Pulumi Go SDK部署GCP PostgreSQL时删除保护未生效问题
GCP Cloud SQL实例删除保护未生效问题排查与解决
我通过Pulumi Go SDK在GCP部署PostgreSQL实例时,已将deletionProtection参数设为true,但GCP控制台显示实例未开启删除保护,仍可直接删除,进而导致Pulumi状态损坏。相关资源配置预览如下:
+ gcp:sql/databaseInstance:DatabaseInstance: (create) [urn=urn:pulumi:us-east4-dev-google-cloud-sql-example::google-cloud-sql-example::gcp:myproject/sql:Database$gcp:sql/databaseInstance:DatabaseInstance::google-cloud-sql] databaseVersion : "POSTGRES_12" deletionProtection: true name : "google-cloud-sql-0b96b6d" project : "my-project" region : "us-east4" settings : { availabilityType : "REGIONAL" backupConfiguration: { enabled : false pointInTimeRecoveryEnabled: false } databaseFlags : [ [0]: { name : "auto_explain.log_analyze" value : "on" } [1]: { name : "max_connections" value : "800" } ] diskAutoresize : true diskAutoresizeLimit: 0 diskSize : 200 diskType : "PD_SSD" insightsConfig : { queryInsightsEnabled: false queryStringLength : 1024 } ipConfiguration : { ipv4Enabled : false privateNetwork: "projects/my-project/global/networks/dev-vpc" } pricingPlan : "PER_USE" tier : "db-custom-32-122880" userLabels : { compliance : "cisl1" criticality: "2" environment: "dev" monitored : "true" name : "myusername" owner : "devops_backend" persistence: "persistent" purpose : "pulumi-common-google-cloud-sql-example" } }
排查与解决步骤
1. 验证Provider版本
确认使用的gcp Pulumi Provider为最新稳定版。旧版本可能存在deletionProtection参数映射的bug,更新到最新版可解决此类问题。
2. 检查参数传递是否正确
- 执行
pulumi refresh刷新Pulumi状态,确认本地状态中deletionProtection仍为true。 - 通过GCP CLI查看实例实际配置:
检查输出中的gcloud sql instances describe google-cloud-sql-0b96b6d --project my-projectsettings.deletionProtection字段值。若为false,说明参数未正确下发到GCP。
3. 确认Go代码参数配置位置
deletionProtection是Cloud SQL实例的顶层参数,而非settings的子字段。确保Go代码中参数定义正确:
databaseInstance, err := sql.NewDatabaseInstance(ctx, "google-cloud-sql", &sql.DatabaseInstanceArgs{ DatabaseVersion: pulumi.String("POSTGRES_12"), DeletionProtection: pulumi.Bool(true), // 此处为顶层参数,不可嵌套到Settings中 Name: pulumi.String("google-cloud-sql-0b96b6d"), Project: pulumi.String("my-project"), Region: pulumi.String("us-east4"), Settings: sql.DatabaseInstanceSettingsArgs{ // 其他实例配置... }, })
若误将该参数放到Settings结构体中,GCP API会忽略该配置,导致删除保护不生效。
4. 排查配置覆盖问题
检查Pulumi栈配置或组件资源中是否存在全局参数覆盖,导致deletionProtection被重置为false。
5. 重新部署验证
若以上步骤确认配置无误,可先备份实例数据,执行pulumi destroy销毁当前实例,再重新pulumi up部署,确保参数正确传递。部署完成后再次通过GCP CLI和控制台验证删除保护状态。
内容的提问来源于stack exchange,提问作者Chanan Berler
相关产品推荐
相关产品推荐

