main.tf (163 lines of code) (raw):

/** * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /****************************************** Cloud Function Definition with Repo/Storage Build Source and Event Trigger *****************************************/ resource "google_cloudfunctions2_function" "function" { name = var.function_name location = var.function_location description = var.description project = var.project_id build_config { runtime = var.runtime entry_point = var.entrypoint environment_variables = var.build_env_variables service_account = var.build_service_account source { dynamic "storage_source" { for_each = var.repo_source == null ? [var.storage_source] : [] content { bucket = storage_source.value.bucket object = storage_source.value.object generation = storage_source.value.generation } } dynamic "repo_source" { for_each = var.storage_source == null ? [var.repo_source] : [] content { project_id = repo_source.value.project_id repo_name = repo_source.value.repo_name branch_name = repo_source.value.branch_name dir = repo_source.value.dir tag_name = repo_source.value.tag_name commit_sha = repo_source.value.commit_sha invert_regex = repo_source.value.invert_regex } } } worker_pool = var.worker_pool docker_repository = var.docker_repository } dynamic "event_trigger" { for_each = var.event_trigger != null ? [var.event_trigger] : [] content { trigger_region = event_trigger.value["trigger_region"] != null ? event_trigger.value["trigger_region"] : null event_type = event_trigger.value["event_type"] != null ? event_trigger.value["event_type"] : null pubsub_topic = event_trigger.value["pubsub_topic"] != null ? event_trigger.value["pubsub_topic"] : null service_account_email = event_trigger.value["service_account_email"] != null ? event_trigger.value["service_account_email"] : null retry_policy = event_trigger.value["retry_policy"] != null ? event_trigger.value["retry_policy"] : null dynamic "event_filters" { for_each = event_trigger.value.event_filters != null ? event_trigger.value.event_filters : [] content { attribute = event_filters.value.attribute value = event_filters.value.attribute_value operator = event_filters.value.operator } } } } dynamic "service_config" { for_each = var.service_config != null ? [var.service_config] : [] content { max_instance_count = service_config.value.max_instance_count min_instance_count = service_config.value.min_instance_count available_memory = service_config.value.available_memory available_cpu = service_config.value.available_cpu timeout_seconds = service_config.value.timeout_seconds environment_variables = service_config.value.runtime_env_variables != null ? service_config.value.runtime_env_variables : {} vpc_connector = service_config.value.vpc_connector vpc_connector_egress_settings = service_config.value.vpc_connector != null ? service_config.value.vpc_connector_egress_settings : null ingress_settings = service_config.value.ingress_settings service_account_email = service_config.value.service_account_email all_traffic_on_latest_revision = service_config.value.all_traffic_on_latest_revision dynamic "secret_environment_variables" { for_each = service_config.value.runtime_secret_env_variables != null ? service_config.value.runtime_secret_env_variables : [] iterator = sev content { key = sev.value.key_name project_id = sev.value.project_id secret = sev.value.secret version = sev.value.version } } dynamic "secret_volumes" { for_each = service_config.value.secret_volumes != null ? service_config.value.secret_volumes : [] content { mount_path = secret_volumes.value.mount_path project_id = secret_volumes.value.project_id secret = secret_volumes.value.secret dynamic "versions" { for_each = secret_volumes.value.versions != null ? secret_volumes.value.versions : [] content { version = versions.value.version path = versions.value.path } } } } } } labels = var.labels != null ? var.labels : {} } // IAM for invoking HTTP functions (roles/run.invoker) resource "google_cloudfunctions2_function_iam_member" "invokers" { for_each = toset(contains(keys(var.members), "invokers") ? var.members["invokers"] : []) location = google_cloudfunctions2_function.function.location project = google_cloudfunctions2_function.function.project cloud_function = google_cloudfunctions2_function.function.name role = "roles/cloudfunctions.invoker" member = each.value depends_on = [ google_cloudfunctions2_function.function ] } // Read and write access to all functions-related resources (roles/run.developer) resource "google_cloudfunctions2_function_iam_member" "developers" { for_each = toset(contains(keys(var.members), "developers") ? var.members["developers"] : []) location = google_cloudfunctions2_function.function.location project = google_cloudfunctions2_function.function.project cloud_function = google_cloudfunctions2_function.function.name role = "roles/cloudfunctions.developer" member = each.value depends_on = [ google_cloudfunctions2_function.function ] } // IAM for invoking HTTP functions (roles/run.invoker) resource "google_cloud_run_service_iam_member" "invokers" { for_each = toset(contains(keys(var.members), "invokers") ? var.members["invokers"] : []) location = google_cloudfunctions2_function.function.location project = google_cloudfunctions2_function.function.project service = google_cloudfunctions2_function.function.name role = "roles/run.invoker" member = each.value depends_on = [ google_cloudfunctions2_function.function ] } // Read and write access to all functions-related resources (roles/run.developer) resource "google_cloud_run_service_iam_member" "developers" { for_each = toset(contains(keys(var.members), "developers") ? var.members["developers"] : []) location = google_cloudfunctions2_function.function.location project = google_cloudfunctions2_function.function.project service = google_cloudfunctions2_function.function.name role = "roles/run.developer" member = each.value depends_on = [ google_cloudfunctions2_function.function ] }