Description
Hi there,
I'm trying to create a cloud function via terraform (which in this particular example forwards error logs to slack, but that's irrelevant for the issue).
The problem is it seems impossible to update a cloud functions source code after its initial deployment via terraform.
As an example below is my hcl config code. You can see that as part of that code I'm packaging a node.js app located under ./app
into a zip file, upload it to GCS and then use this as source for the cloud function. Whenever I change something in the source code under ./app
terraform will rezip and upload the new archive to GCS. However the corresponding cloud function does not reload the source code from GCS. This is because none of the input params of the cloud function resource has been changed. In the AWS lambda resource they use an attribute source_code_hash
to trigger updates to the function resource when the source code has changed.
The google_cloud_function resource doesn't have any attribute like that so I cannot trigger an update to the resource. I tried embedding the hash into the description or labels of the resource to trigger an update, and while this creates a new version, that new version still doesn't reload the new source code.
IMHO that makes the current terraform cloud function resource useless in practice. It can only be used to create an initial cloud function but not for updates.
Expectation:
Please add an attribute source_code_hash
or similar to the cloud function resource to allow updates of the source code via terraform.
Terraform Version
Terraform v0.11.7
+ provider.archive v1.1.0
+ provider.google v1.16.2
Affected Resource(s)
Please list the resources as a list, for example:
- google_cloudfunctions_function
Terraform Configuration Files
main.tf
locals {
error_log_filter = <<EOF
resource.type="k8s_container"
resource.labels.cluster_name="api-cluster-prod-b"
severity>=ERROR
EOF
function_name = "post-error-logs-to-slack"
functions_region = "us-central1"
}
terraform {
backend "gcs" {}
}
provider "google" {
project = "${var.gcp_project}"
region = "${var.gcp_region}"
version = "~> 1.16.2"
}
provider "archive" {
version = "~> 1.1.0"
}
resource "google_pubsub_topic" "error_logs" {
name = "error-logs"
}
resource "google_logging_project_sink" "error_logs_sink" {
name = "error-logs-sink"
destination = "pubsub.googleapis.com/projects/${var.gcp_project}/topics/${google_pubsub_topic.error_logs.name}"
filter = "${local.error_log_filter}"
}
resource "google_storage_bucket" "functions_store" {
name = "solvvy-prod-functions"
location = "${local.functions_region}"
}
data "archive_file" "function_dist" {
type = "zip"
source_dir = "./app"
output_path = "dist/${local.function_name}.zip"
}
resource "google_storage_bucket_object" "error_logs_to_slack_function_code" {
name = "${local.function_name}.zip"
bucket = "${google_storage_bucket.functions_store.name}"
source = "${data.archive_file.function_dist.output_path}"
}
resource "google_cloudfunctions_function" "post-error-logs-to-slack" {
name = "post-error-logs-to-slack"
description = "[Managed by Terraform] This function gets triggered by new messages in the ${google_pubsub_topic.error_logs.name} pubsub topic"
available_memory_mb = 128
source_archive_bucket = "${google_storage_bucket_object.error_logs_to_slack_function_code.bucket}"
source_archive_object = "${google_storage_bucket_object.error_logs_to_slack_function_code.name}"
entry_point = "sendErrorToSlack"
trigger_topic = "${google_pubsub_topic.error_logs.name}"
region = "${local.functions_region}"
}
b/249753001