Terraform销毁GCP SSL证书时先删证书后更新HTTPS代理的问题求助
解决Terraform销毁GCP关联HTTPS代理的SSL证书时的资源占用错误
在使用Terraform管理GCP基础设施时,通过for_each配置了多实例google_compute_managed_ssl_certificate,同时有一个google_compute_target_https_proxy引用所有证书ID作为ssl_certificates列表。当需要销毁部分证书(比如var.apps移除对应条目)时,Terraform会先尝试删除证书,再更新代理配置,但GCP禁止删除正在被代理使用的证书,报错:
Error: Error when reading or editing ManagedSslCertificate: googleapi: Error 400: The ssl_certificate resource 'projects/XXX/global/sslCertificates/airflow' is already being used by 'projects/XXX/global/targetHttpsProxies/default', resourceInUseByAnotherResource
试过create_before_destroy、depends_on、-target参数都无法调整执行顺序,只能手动从状态中移除证书再删除。以下是无需手动操作的解决方案:
方法一:临时用prevent_destroy分两步执行
这是最可靠的方案,通过临时阻止证书销毁,先让Terraform更新代理移除证书引用,再销毁证书:
- 临时修改证书资源的
lifecycle,添加prevent_destroy = true:
resource "google_compute_managed_ssl_certificate" "app_cert" { for_each = var.apps project = var.project_id name = each.key managed { domains = [each.value.domain] } lifecycle { create_before_destroy = true prevent_destroy = true # 临时添加 } }
执行
terraform apply,此时Terraform会更新HTTPS代理,移除要删除的证书引用,但不会销毁证书,避免报错。删除刚才添加的
prevent_destroy = true,再次执行terraform apply,此时证书已脱离代理引用,可正常销毁。
方法二:通过计划文件筛选执行步骤
如果不想修改配置文件,可以生成计划文件并编辑,只保留更新代理的步骤:
- 生成执行计划并保存:
terraform plan -out=update-proxy.tfplan
打开
update-proxy.tfplan(操作前备份),删除所有销毁证书的步骤。执行修改后的计划:
terraform apply update-proxy.tfplan
- 完成后正常执行
terraform apply销毁剩余证书。
方法三:销毁阶段provisioner(备选)
通过local-exec在证书销毁前调用gcloud更新代理,依赖本地gcloud配置,仅作备选:
resource "google_compute_managed_ssl_certificate" "app_cert" { for_each = var.apps project = var.project_id name = each.key managed { domains = [each.value.domain] } lifecycle { create_before_destroy = true } provisioner "local-exec" { when = destroy command = "gcloud compute target-https-proxies update default --ssl-certificates=${join(",", [for c in google_compute_managed_ssl_certificate.app_cert : c.id if c.id != self.id])} --project=${var.project_id}" } }
内容的提问来源于stack exchange,提问作者piotrekkr
相关产品推荐
相关产品推荐

