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
相关产品推荐
相关产品推荐

