GCP Cloud SQL 未能删除实例,因为 `deletion_protection` 设置为 true

Posted

技术标签:

【中文标题】GCP Cloud SQL 未能删除实例,因为 `deletion_protection` 设置为 true【英文标题】:GCP Cloud SQL failed to delete instance because `deletion_protection` is set to true 【发布时间】:2021-02-13 01:52:10 【问题描述】:

我有一个用于配置 Cloud SQL 实例的 tf 脚本,还有几个数据库和一个管理员用户。我已重命名该实例,因此创建了一个新实例,但 terraform 在删除旧实例时遇到了问题。

Error: Error, failed to delete instance because deletion_protection is set to true. Set it to false to proceed with instance deletion

我尝试将deletion_protection 设置为false,但我一直收到同样的错误。有没有办法检查哪些资源需要将 deletion_protection 设置为 false 才能被删除? 我只是将它添加到google_sql_database_instance 资源中。

我的 tf 脚本:

// Provision the Cloud SQL Instance
resource "google_sql_database_instance" "instance-master" 
  name             = "instance-db-$random_id.random_suffix_id.hex"
  region           = var.region
  database_version = "POSTGRES_12"

  project = var.project_id

  settings 
    availability_type = "REGIONAL"
    tier              = "db-f1-micro"
    activation_policy = "ALWAYS"
    disk_type         = "PD_SSD"

    ip_configuration 
      ipv4_enabled    = var.is_public ? true : false
      private_network = var.network_self_link
      require_ssl     = true

      dynamic "authorized_networks" 
        for_each = toset(var.is_public ? [1] : [])

        content 
          name  = "Public Internet"
          value = "0.0.0.0/0"
        
      
    

    backup_configuration 
      enabled = true
    

    maintenance_window 
      day  = 2
      hour = 4

      update_track = "stable"
    

    dynamic "database_flags" 
      iterator = flag
      for_each = var.database_flags

      content 
        name  = flag.key
        value = flag.value
      
    

    user_labels = var.default_labels
  

  deletion_protection = false
  depends_on          = [google_service_networking_connection.cloudsql-peering-connection, google_project_service.enable-sqladmin-api]


// Provision the databases
resource "google_sql_database" "db" 
  name     = "orders-placement"
  instance = google_sql_database_instance.instance-master.name
  project  = var.project_id


// Provision a super user
resource "google_sql_user" "admin-user" 
  name     = "admin-user"
  instance = google_sql_database_instance.instance-master.name
  password = random_password.user-password.result
  project  = var.project_id


// Get latest CA certificate
locals 
  furthest_expiration_time = reverse(sort([for k, v in google_sql_database_instance.instance-master.server_ca_cert : v.expiration_time]))[0]
  latest_ca_cert           = [for v in google_sql_database_instance.instance-master.server_ca_cert : v.cert if v.expiration_time == local.furthest_expiration_time]


// Get SSL certificate
resource "google_sql_ssl_cert" "client_cert" 
  common_name = "instance-master-client"
  instance    = google_sql_database_instance.instance-master.name

【问题讨论】:

您是否将带有deletion_protection 的旧版本更新为false? 您使用的是哪个版本的 terraform?我发现this Github issue 提到这已在较新版本的 terraform 上解决 【参考方案1】:

您的代码似乎要重新创建此 sql 实例。但是您当前的 tfstate 文件包含一个实例代码,其中 true 值为 deletion_protection 参数。在这种情况下,您首先需要在 tfstate 文件中手动将此参数的值更改为false,或者在代码中添加deletion_protection = true,然后运行terraform apply 命令(注意:您的代码不应该重新创建实例)。在这些操作之后,你可以对你的 SQL 实例做任何事情

【讨论】:

deletion_protection = true 是最近 terraform 版本设置的默认值,如果在应用步骤中未定义(至少对于 Google SQL)。因此,需要先将其设置为禁用,然后才能像 Aron 所写的那样进行销毁工作。另一种方法是进入控制台并删除那里的实例,然后再次运行 terraform destroy 以继续。【参考方案2】:

您必须设置deletion_protection=false,应用它,然后继续删除。

根据文档

在较新版本的提供程序上,您必须显式设置 delete_protection=false(并运行 terraform apply 以将字段写入状态)才能销毁实例。建议在您准备好销毁实例及其数据库之前不要设置此字段(或将其设置为 true)。

Link

不建议直接/手动编辑 Terraform 状态文件

【讨论】:

【参考方案3】:

如果您在创建数据库实例后将deletion_protection 添加到google_sql_database_instance,则需要在运行terraform destroy 之前运行terraform apply,以便将数据库实例上的deletion_protection 设置为false。

【讨论】:

这不起作用,因为删除保护无法设置到云 SQL 实例。

以上是关于GCP Cloud SQL 未能删除实例,因为 `deletion_protection` 设置为 true的主要内容,如果未能解决你的问题,请参考以下文章

用于 Postgres 的 GCP Cloud SQL 查询日志记录

GCP cloud sql postgres连接计数丢失

将 GCP Cloud SQL SocketFactory 与 Hibernate 配置一起使用

Spring GCP 服务未连接到 Cloud SQL 数据库

Ingress-Nginx-Controller未能找到部署在Google Cloud Platform上的第二项服务

从另一个 GCP 项目访问 Cloud SQL