5-app-infra/4-data-governance/envs/production/cloud_function.tf (211 lines of code) (raw):

/** * Copyright 2024 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. */ locals { cloud_functions = distinct([ for f in fileset("${path.module}/../../static_data", "cloud_functions/**") : split("/", f)[1] ]) domains = distinct(flatten([ for domain in var.dlp_job_inspect_datasets : [ for function in local.cloud_functions : { domain = domain.domain_name function = function } ] ])) bq_labels = { cdmc = "remote_functions" data_governance = true } } ###################################### # Development ###################################### module "bigquery_remote_functions_development" { source = "../../modules/bigquery" dataset_id = "remote_functions_dev" dataset_labels = merge(local.bq_labels, { environment = "development" }) dataset_name = "remote_functions_dev" delete_contents_on_destroy = true encryption_key = local.bq_data_quality_kms_key location = var.region project_id = local.data_governance_project_id } resource "google_storage_bucket" "function_bucket_development" { project = local.data_governance_project_id name = "bkt-cloud-function-development-${local.data_governance_project_id}" location = var.region uniform_bucket_level_access = true } resource "google_bigquery_connection" "connection_development" { connection_id = "remote-connection-development" project = local.data_governance_project_id location = var.region cloud_resource {} } resource "google_bigquery_connection_iam_member" "connection_development" { connection_id = google_bigquery_connection.connection_development.connection_id project = google_bigquery_connection.connection_development.project location = google_bigquery_connection.connection_development.location role = "roles/bigquery.connectionUser" member = "serviceAccount:${local.data_governance_sa_tag_creator}" } module "cloud_function_development_non_confidential" { for_each = { for domain in local.domains : "${domain.domain}-${domain.function}" => domain } source = "../../modules/cloud_function" bucket_name = google_storage_bucket.function_bucket_development.name source_path = "${path.module}/../../static_data/cloud_functions/${each.value.function}/function/${each.value.function}.zip" source_archive_object = "${each.value.function}.zip" region = var.region domain_name = each.value.domain function_description = "${each.value.function} Cloud Function" function_name = "${each.value.function}_dev" service_account_email = local.cloud_function_sa build_service_account_email = "projects/${local.data_governance_project_id}/serviceAccounts/${local.cloud_function_sa}" ingress_settings = "ALLOW_INTERNAL_AND_GCLB" entry_point = each.value.function == "ultimate_source" ? "process_request" : "event_handler" environment_variables = { REGION = var.region, PROJECT_ID_DATA = local.data_domain_non_conf_projects_dev[each.value.domain].project_id PROJECT_ID_GOV = local.data_governance_project_id } project_id = local.data_governance_project_id invoker_member = google_bigquery_connection.connection_development.cloud_resource[0].service_account_id template_path = "${path.module}/../../static_data/cloud_functions/${each.value.function}/sql" remote_connection_name = "remote-connection-development" dataset = "remote_functions_dev" depends_on = [ module.bigquery_remote_functions_development, google_storage_bucket.function_bucket_development, google_bigquery_connection.connection_development, ] } ###################################### # Production ###################################### module "bigquery_remote_functions_production" { source = "../../modules/bigquery" dataset_id = "remote_functions_prod" dataset_labels = merge(local.bq_labels, { environment = "production" }) dataset_name = "remote_functions_prod" delete_contents_on_destroy = true encryption_key = local.bq_data_quality_kms_key location = var.region project_id = local.data_governance_project_id } resource "google_storage_bucket" "function_bucket_production" { project = local.data_governance_project_id name = "bkt-cloud-function-production-${local.data_governance_project_id}" location = var.region uniform_bucket_level_access = true } resource "google_bigquery_connection" "connection_production" { connection_id = "remote-connection-production" project = local.data_governance_project_id location = var.region cloud_resource {} } resource "google_bigquery_connection_iam_member" "connection_production" { connection_id = google_bigquery_connection.connection_production.connection_id project = google_bigquery_connection.connection_production.project location = google_bigquery_connection.connection_production.location role = "roles/bigquery.connectionUser" member = "serviceAccount:${local.data_governance_sa_tag_creator}" } module "cloud_function_production_non_confidential" { for_each = { for domain in local.domains : "${domain.domain}-${domain.function}" => domain } source = "../../modules/cloud_function" bucket_name = google_storage_bucket.function_bucket_production.name source_path = "${path.module}/../../static_data/cloud_functions/${each.value.function}/function/${each.value.function}.zip" source_archive_object = "${each.value.function}.zip" region = var.region domain_name = each.value.domain function_description = "${each.value.function} Cloud Function" function_name = "${each.value.function}_prod" service_account_email = local.cloud_function_sa build_service_account_email = "projects/${local.data_governance_project_id}/serviceAccounts/${local.cloud_function_sa}" ingress_settings = "ALLOW_INTERNAL_AND_GCLB" entry_point = each.value.function == "ultimate_source" ? "process_request" : "event_handler" environment_variables = { REGION = var.region, PROJECT_ID_DATA = local.data_domain_non_conf_projects_prod[each.value.domain].project_id PROJECT_ID_GOV = local.data_governance_project_id } project_id = local.data_governance_project_id invoker_member = google_bigquery_connection.connection_production.cloud_resource[0].service_account_id template_path = "${path.module}/../../static_data/cloud_functions/${each.value.function}/sql" remote_connection_name = "remote-connection-production" dataset = "remote_functions_prod" depends_on = [ module.bigquery_remote_functions_production, google_storage_bucket.function_bucket_production, google_bigquery_connection.connection_production, ] } ###################################### # Non Production ###################################### module "bigquery_remote_functions_non_production" { source = "../../modules/bigquery" dataset_id = "remote_functions_nonp" dataset_labels = merge(local.bq_labels, { environment = "non_production" }) dataset_name = "remote_functions_nonp" delete_contents_on_destroy = true encryption_key = local.bq_data_quality_kms_key location = var.region project_id = local.data_governance_project_id } resource "google_storage_bucket" "function_bucket_non_production" { project = local.data_governance_project_id name = "bkt-cloud-function-non-prod-${local.data_governance_project_id}" location = var.region uniform_bucket_level_access = true } resource "google_bigquery_connection" "connection_non_production" { connection_id = "remote-connection-non-production" project = local.data_governance_project_id location = var.region cloud_resource {} } resource "google_bigquery_connection_iam_member" "connection_non_production" { connection_id = google_bigquery_connection.connection_non_production.connection_id project = google_bigquery_connection.connection_non_production.project location = google_bigquery_connection.connection_non_production.location role = "roles/bigquery.connectionUser" member = "serviceAccount:${local.data_governance_sa_tag_creator}" } module "cloud_function_non_production_non_confidential" { for_each = { for domain in local.domains : "${domain.domain}-${domain.function}" => domain } source = "../../modules/cloud_function" bucket_name = google_storage_bucket.function_bucket_non_production.name source_path = "${path.module}/../../static_data/cloud_functions/${each.value.function}/function/${each.value.function}.zip" source_archive_object = "${each.value.function}.zip" region = var.region domain_name = each.value.domain function_description = "${each.value.function} Cloud Function" function_name = "${each.value.function}_nonp" service_account_email = local.cloud_function_sa build_service_account_email = "projects/${local.data_governance_project_id}/serviceAccounts/${local.cloud_function_sa}" ingress_settings = "ALLOW_INTERNAL_AND_GCLB" entry_point = each.value.function == "ultimate_source" ? "process_request" : "event_handler" environment_variables = { REGION = var.region, PROJECT_ID_DATA = local.data_domain_non_conf_projects_nonp[each.value.domain].project_id PROJECT_ID_GOV = local.data_governance_project_id } project_id = local.data_governance_project_id invoker_member = google_bigquery_connection.connection_non_production.cloud_resource[0].service_account_id template_path = "${path.module}/../../static_data/cloud_functions/${each.value.function}/sql" remote_connection_name = "remote-connection-non-production" dataset = "remote_functions_nonp" depends_on = [ module.bigquery_remote_functions_non_production, google_storage_bucket.function_bucket_non_production, google_bigquery_connection.connection_non_production, ] }