如何使用Terraform修改Google Cloud现有App Engine默认存储桶的CORS
问题
用Terraform创建App Engine时,会自动生成一个默认存储桶。想要在同一段Terraform代码中修改该桶的CORS配置,但使用以下代码时,Terraform会尝试创建一个新桶:
resource "google_storage_bucket" "app_engine_bucket" { name = local.app_engine_default_bucket location = "US" cors { origin = ["*"] method = ["GET", "PUT", "DELETE"] response_header = ["Content-Type"] max_age_seconds = 3600 } }
原因
google_storage_bucket资源块的作用是让Terraform创建并管理新存储桶。而App Engine的默认桶是GCP自动创建的,不在当前Terraform状态文件中,所以Terraform会判定你要新建同名桶,进而引发冲突。
解决方案
有两种可行方式修改默认桶的CORS配置:
方式一:单独管理CORS配置(推荐)
使用google_storage_bucket_cors资源单独配置CORS,无需重新定义整个存储桶。先通过数据源获取App Engine默认桶信息,再关联CORS资源:
- 获取App Engine应用及默认桶信息:
data "google_app_engine_application" "app" { project = var.project_id } locals { app_engine_default_bucket = data.google_app_engine_application.app.default_bucket }
- 配置CORS规则:
resource "google_storage_bucket_cors" "app_engine_bucket_cors" { bucket = local.app_engine_default_bucket cors { origin = ["*"] method = ["GET", "PUT", "DELETE"] response_header = ["Content-Type"] max_age_seconds = 3600 } }
方式二:将默认桶导入Terraform状态后管理
先把GCP自动创建的默认桶导入Terraform状态,再用google_storage_bucket资源管理,但要避免指定会触发桶重建的参数(比如location,默认桶的存储区域是固定的,无法修改):
- 执行导入命令(替换为你的默认桶名称):
terraform import google_storage_bucket.app_engine_bucket gs://<你的默认桶名称>
- 修改Terraform代码,仅保留CORS相关配置:
resource "google_storage_bucket" "app_engine_bucket" { name = local.app_engine_default_bucket # 不要指定location等默认桶的固有属性,否则会触发重建 cors { origin = ["*"] method = ["GET", "PUT", "DELETE"] response_header = ["Content-Type"] max_age_seconds = 3600 } }
内容的提问来源于stack exchange,提问作者Aseem
相关产品推荐
相关产品推荐

