我使用Terraform来管理谷歌云功能的资源。但是,尽管云功能的初始部署是有效的,但当我在更新源归档后使用terraform apply
时,没有重新部署更改了云功能源代码的进一步部署(源归档sourcecode.zip
(。
存储桶对象得到更新,但这不会触发云功能资源的更新/重新部署。
这是提供者的错误吗?当代码发生变化时,有没有办法在地形中重新部署函数
我正在使用的简化源代码:
resource "google_storage_bucket" "cloud_function_source_bucket" {
name = "${local.project}-function-bucket"
location = local.region
uniform_bucket_level_access = true
}
resource "google_storage_bucket_object" "function_source_archive" {
name = "sourcecode.zip"
bucket = google_storage_bucket.cloud_function_source_bucket.name
source = "./../../../sourcecode.zip"
}
resource "google_cloudfunctions_function" "test_function" {
name = "test_func"
runtime = "python39"
region = local.region
project = local.project
available_memory_mb = 256
source_archive_bucket = google_storage_bucket.cloud_function_source_bucket.name
source_archive_object = google_storage_bucket_object.function_source_archive.name
trigger_http = true
entry_point = "trigger_endpoint"
service_account_email = google_service_account.function_service_account.email
vpc_connector = "projects/${local.project}/locations/${local.region}/connectors/serverless-main"
vpc_connector_egress_settings = "ALL_TRAFFIC"
ingress_settings = "ALLOW_ALL"
}
您可以将zip内容的MD5或SHA256校验和附加到bucket对象的名称中。这将在源代码发生更改时触发云函数的重新创建。
${data.archive_file.function_src.output_md5}
data "archive_file" "function_src" {
type = "zip"
source_dir = "SOURCECODE_PATH/sourcecode"
output_path = "./SAVING/PATH/sourcecode.zip"
}
resource "google_storage_bucket_object" "function_source_archive" {
name = "sourcecode.${data.archive_file.function_src.output_md5}.zip"
bucket = google_storage_bucket.cloud_function_source_bucket.name
source = data.archive_file.function_src.output_path
}
你可以在这里阅读更多关于地形档案的信息-地形档案_file
您可能会认为这是一个缺陷。就我个人而言,我不太确定。
Terraform有一些逻辑;应用";命令被执行。
需要思考的问题是,terraform如何知道云函数的源代码发生了变化,云函数将被重新部署?Terraform没有";读取";云函数的源代码,没有将其与以前的版本进行比较。它只读取地形的脚本文件。如果这些文件中没有任何更改(与状态文件和GCP项目中存在的资源相比(,则不需要重新部署任何内容。
因此,有些事情需要改变。例如,存档文件的名称。在这种情况下,terraform发现必须重新部署云函数(因为状态文件具有存档对象的旧名称(。云功能已重新部署。
不久前提供了一个带有更详细解释的代码示例:不要考虑问题的有效性,只需阅读答案