如何通过Terraform为GCP存储桶现有对象更新KMS加密密钥?
问题解答
首先明确:仅通过Terraform的官方GCP资源(无需依赖gsutil等命令行工具),无法直接批量为存储桶内已有的对象完成加密。
原因如下:
- 你配置的
google_storage_bucket资源里的encryption块,只会设置存储桶的默认KMS密钥,这个配置仅对之后上传的新对象生效,不会自动重加密桶内已存在的对象——这是GCP存储服务的特性,而非Terraform的限制。 - Terraform没有提供原生的批量重加密存储对象的资源,单个的
google_storage_object资源只能处理单个对象,若要覆盖所有现有对象,需要提前枚举所有对象并动态生成对应资源,操作成本极高,且重写对象会产生额外的存储和网络费用。
如果一定要通过Terraform自动化完成这件事,有两种折中方案(但都不属于纯Terraform资源范畴):
- 用
null_resource配合gcloud storage objects rewrite命令(替代gsutil的同类操作),通过本地执行的方式批量触发对象重写,重写后的对象会自动使用桶的默认KMS密钥加密。示例配置大致如下:
resource "null_resource" "reencrypt_bucket_objects" { triggers = { bucket_name = google_storage_bucket.bucket-tf-creation2.name kms_key = google_storage_bucket.bucket-tf-creation2.encryption[0].default_kms_key_name } provisioner "local-exec" { command = "gcloud storage objects rewrite gs://${self.triggers.bucket_name}/** gs://${self.triggers.bucket_name}/ --destination-kms-key ${self.triggers.kms_key}" } }
- 利用Terraform的
httpprovider调用GCP Storage的API来批量重写对象,但这种方式需要处理分页枚举对象、认证等问题,实现复杂度很高,不推荐。
最后要注意:无论哪种方式,重加密操作都会产生对象读写的费用,且大对象较多时会消耗大量时间,执行前请评估成本和影响。
内容的提问来源于stack exchange,提问作者AnonyGummy
相关产品推荐
相关产品推荐

