You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform修改Google Secret Manager密钥值时保留旧版本的方法

解决Terraform管理Google Secret Manager时版本不保留的问题

问题背景

使用Terraform管理Google Secret Manager时,修改secret_data的值(比如从"very-secret"改成"very-secret2"),Terraform会自动销毁旧的密钥版本,只保留新的版本。尝试给google_secret_manager_secret_version资源添加prevent_destroy = true生命周期块后,又会触发「Error: Instance cannot be destroyed」错误。

问题原因

google_secret_manager_secret_version这个Terraform资源本质对应Secret Manager中的单个版本。默认情况下,当你修改secret_data时,Terraform会认为这个资源需要更新,而更新方式就是销毁旧版本、创建新版本。如果添加prevent_destroy = true,就会阻止Terraform销毁旧资源,导致更新操作失败报错。

解决方案

要保留旧版本,不能复用同一个google_secret_manager_secret_version资源,而是让每个密钥版本对应独立的资源实例。可以通过生成唯一的version_id来实现,比如用随机字符串:

完整示例代码

# 启用Secret Manager API
resource "google_project_service" "secret_manager" {
  project            = "buoyant-valve-34"
  service            = "secretmanager.googleapis.com"
  disable_on_destroy = true
}

# 创建Secret实体
resource "google_secret_manager_secret" "secret-basic" {
  secret_id = "new-secret-by-me"
  project   = "buoyant-valve-34"
  replication {
    automatic = true
  }
}

# 生成随机后缀作为版本ID的一部分,确保每个版本唯一
resource "random_pet" "secret_version_suffix" {
  length = 2
}

# 创建新的密钥版本,每次修改secret_data都会生成新的版本
resource "google_secret_manager_secret_version" "latest_secret" {
  secret      = google_secret_manager_secret.secret-basic.id
  secret_data = "very-secret2"
  version_id  = random_pet.secret_version_suffix.id
}

工作原理

  • 每次修改secret_data的值,random_pet会生成新的随机后缀,导致version_id变化,Terraform会创建一个新的google_secret_manager_secret_version资源实例
  • 旧的资源实例不会被销毁,对应的Secret Manager中的旧版本也会保留
  • 如果需要清理旧版本,可以手动删除对应的Terraform资源,或者添加额外逻辑批量管理历史版本

注意事项

  • 不要给google_secret_manager_secret_version添加prevent_destroy = true,否则会阻止正常的资源更新操作
  • 若不需要保留过多历史版本,可以定期清理旧的google_secret_manager_secret_version资源实例

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:50:40