Terraform管理GCP云函数 避免本地apply覆盖部署适配CI流程
Terraform管理GCP Cloud Function时禁止本地apply覆写代码的实现方案
问题根因
你当前配置每次执行terraform apply都会触发代码重传的核心原因有两个:
- 定义的
google_storage_bucket_object.archive资源绑定了本地zip路径,Terraform默认会每次计算本地文件的哈希值,只要本地文件发生变化(哪怕是重新打包导致的时间戳变动),就会判定存储对象需要更新 google_cloudfunctions_function资源强依赖上述存储对象的输出属性,一旦判定存储对象变更,就会连带触发Cloud Function的代码更新逻辑,覆盖线上版本
即时解决方案(阻止本地apply重传代码)
按以下两步调整配置即可,不需要依赖Cloud Build、Artifact Registry的特殊能力:
- 调整Cloud Function资源配置,添加生命周期忽略规则,解耦代码源的变更管控
把原有函数资源配置修改为如下内容:resource "google_cloudfunctions_function" "backend_function" { name = "backend_function" runtime = "nodejs16" project = "owlee-software" region = "europe-west2" available_memory_mb = 128 source_archive_bucket = google_storage_bucket.owlee_functions_bucket.name source_archive_object = "index.zip" # 直接写固定对象名,不要关联storage_object的动态属性 trigger_http = true entry_point = "OWLEE" # 核心配置:忽略代码源字段的变更,首次创建后不再由Terraform管控这部分内容 lifecycle { ignore_changes = [ source_archive_bucket, source_archive_object ] } } - 移除原有配置中绑定本地zip路径的
google_storage_bucket_object.archive资源。
首次创建函数前,手动上传一份可用的初始代码包到存储桶的index.zip路径即可,后续这个对象的版本更新完全不需要Terraform参与。
调整完成后,本地执行terraform apply时,Terraform只会校验内存、运行时、触发器、入口点等基础设施配置的差异,完全不会比对代码包版本,不会触发任何代码重传、版本覆盖操作。
非Terraform托管CI代码部署流程
上述配置调整完成后,就可以实现基础设施和代码部署流程的完全解耦,是非常成熟的落地方案:
- Terraform侧只负责管控存储桶、Cloud Function的基础属性(权限、网络、运行时配置、资源规格、触发器规则等),和代码版本完全解绑
- CI侧部署代码不需要执行任何Terraform命令,打包完代码后直接用GCP原生命令完成上传和发布即可,参考命令:
# 上传最新代码包到存储桶 gsutil cp ../apps/backend/dist/index.zip gs://owlee_functions_bucket/index.zip # 触发Cloud Function更新代码版本,不会改动其他基础设施配置 gcloud functions deploy backend_function \ --source=gs://owlee_functions_bucket/index.zip \ --region=europe-west2 \ --project=owlee-software
注意事项
- 首次执行
terraform apply创建Cloud Function前,必须保证存储桶内存在可运行的初始index.zip包,否则资源会创建失败 lifecycle.ignore_changes规则仅会忽略指定字段的更新操作,资源的删除、其他非忽略字段的变更仍正常由Terraform托管,不会出现资源失控的问题- 不要保留绑定本地文件路径的
google_storage_bucket_object资源,这类资源的默认哈希比对逻辑是导致本地执行apply时误触发代码更新的核心诱因
内容的提问来源于stack exchange,提问作者SebastianG
相关产品推荐
相关产品推荐

