如何通过Terraform部署Google Cloud Function无需使用存储桶?
结论
不存在完全不使用Cloud Storage存储桶部署1代Cloud Function的方案,不管是通过gcloud CLI还是Terraform,底层Cloud Functions API都要求代码源必须指向GCS中的压缩包对象。
你观察到的gcloud functions deploy --source=本地路径的能力,是gcloud客户端做的封装逻辑,不是API原生支持:执行命令时gcloud会自动把本地目录打包为zip,在当前项目下自动创建/复用命名格式为gcf-sources-<项目编号>-<区域>的临时GCS桶,上传压缩包后再调用API传GCS路径完成部署,全程只是把GCS相关操作对你隐藏了而已。
Terraform下无需手动预创建存储桶的可行方案
如果你不想提前手动准备固定的GCS存储桶,可以通过Terraform资源组合模拟gcloud的自动临时桶逻辑,所有资源都纳入Terraform生命周期管理,和你直接用gcloud传本地路径的体验基本一致:
- 用内置的
archive_file数据源自动把本地jar所在的部署目录打包为zip包,自动跟踪文件变化触发更新data "archive_file" "func_src" { type = "zip" source_dir = "${path.module}/target/deployment" output_path = "${path.module}/temp_func_src.zip" } - 定义和gcloud命名规则一致的临时GCS桶,开启强制销毁和7天生命周期自动清理,避免残留无用文件:
resource "google_storage_bucket" "gcf_auto_temp" { name = "gcf-sources-${var.project_number}-${var.region}" location = var.region force_destroy = true lifecycle_rule { condition { age = 7 } action { type = "Delete" } } } - 自动把打包好的源码zip上传到临时桶,再引用到Cloud Function资源中:
resource "google_storage_bucket_object" "func_src" { name = "jar-example-${data.archive_file.func_src.output_md5}.zip" bucket = google_storage_bucket.gcf_auto_temp.name source = data.archive_file.func_src.output_path } resource "google_cloudfunctions_function" "jar_example" { name = "jar-example" runtime = "java11" entry_point = "Example" trigger_http = true available_memory_mb = 256 source_archive_bucket = google_storage_bucket.gcf_auto_temp.name source_archive_object = google_storage_bucket_object.func_src.name }
不推荐的替代方案
如果你完全不想在Terraform模板中显式定义GCS相关资源,可以用null_resource配合local-exec执行器直接调用本地的gcloud命令完成部署:
resource "null_resource" "jar_func_deploy" { triggers = { source_hash = filesha256("${path.module}/target/deployment") } provisioner "local-exec" { command = <<EOT gcloud functions deploy jar-example \ --entry-point=Example \ --runtime=java11 \ --trigger-http \ --source=${path.module}/target/deployment \ --project=${var.project_id} \ --region=${var.region} EOT } }
这个方案本质还是会用到GCS存储桶,只是桶由gcloud自动创建、不在Terraform管控范围内,缺点是Terraform无法跟踪函数的实际状态,后续修改、删除资源容易出现状态漂移,仅适合本地快速测试,不要在生产环境使用。
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

