terraform/main.tf (168 lines of code) (raw):

# Copyright 2021 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. provider "google" { project = var.project region = var.compute_region impersonate_service_account = local.terraform_service_account_email } provider "google-beta" { project = var.project region = var.compute_region impersonate_service_account = local.terraform_service_account_email } data google_project "gcp_project" { project_id = var.project } locals { // Which SA should have access to the GCS flags bucket? // In all deployments, use these SAs common_gcs_admins = [ "serviceAccount:${module.common-stack.sa_tagging_dispatcher_email}", "serviceAccount:${module.common-stack.sa_tagger_email}" ] // In Inspection Mode deployment (is_auto_dlp = false) use these: inspection_gcs_admins = var.is_auto_dlp_mode ? [] : [ "serviceAccount:${module.inspection-stack[0].sa_inspection_dispatcher_email}", "serviceAccount:${module.inspection-stack[0].sa_inspector_email}" ] tagging_dispatcher_service_image_uri = "${var.compute_region}-docker.pkg.dev/${var.project}/${var.gar_docker_repo_name}/${var.tagging_dispatcher_service_image}" inspection_dispatcher_service_image_uri = "${var.compute_region}-docker.pkg.dev/${var.project}/${var.gar_docker_repo_name}/${var.inspection_dispatcher_service_image}" inspector_service_image_uri = "${var.compute_region}-docker.pkg.dev/${var.project}/${var.gar_docker_repo_name}/${var.inspector_service_image}" tagger_service_image_uri = "${var.compute_region}-docker.pkg.dev/${var.project}/${var.gar_docker_repo_name}/${var.tagger_service_image}" dlp_service_account_email = "service-${data.google_project.gcp_project.number}@dlp-api.iam.gserviceaccount.com" cloud_scheduler_account_email = "service-${data.google_project.gcp_project.number}@gcp-sa-cloudscheduler.iam.gserviceaccount.com" terraform_service_account_email = "${var.terraform_service_account}@${var.project}.iam.gserviceaccount.com" // create a list of distinct projects where data to be inspected resides data_projects = distinct(concat( flatten([for dataset in var.datasets_include_list : split(".", dataset)[0]]), // parse project_name from "project_name.dataset_name" var.projects_include_list // concat to the list of projects )) } module "gcs" { source = "./modules/gcs" gcs_flags_bucket_name = "${var.project}-${var.gcs_flags_bucket_name}" project = var.project region = var.compute_region # because it's used by the cloud run services # both dispatchers should be admins. Add the inspection-dispatcher-sa only if it's being deployed gcs_flags_bucket_admins = var.is_auto_dlp_mode ? local.common_gcs_admins : concat(local.common_gcs_admins, local.inspection_gcs_admins) terraform_data_deletion_protection = var.terraform_data_deletion_protection } module "common-stack" { source = "./stacks/common" classification_taxonomy = var.classification_taxonomy cloud_scheduler_account = local.cloud_scheduler_account_email cron_expression = var.tagging_cron_expression datasets_exclude_list = var.datasets_exclude_list datasets_include_list = var.datasets_include_list dispatcher_service_image = local.tagging_dispatcher_service_image_uri dlp_service_account = local.dlp_service_account_email domain_mapping = var.domain_mapping iam_mapping = var.iam_mapping is_dry_run_tags = var.is_dry_run_tags is_dry_run_labels = var.is_dry_run_labels project = var.project projects_include_list = var.projects_include_list compute_region = var.compute_region data_region = var.data_region tables_exclude_list = var.tables_exclude_list tagger_service_image = local.tagger_service_image_uri bigquery_dataset_name = var.bigquery_dataset_name dispatcher_pubsub_sub = var.tagging_dispatcher_pubsub_sub dispatcher_pubsub_topic = var.tagging_dispatcher_pubsub_topic dispatcher_service_name = var.tagging_dispatcher_service_name log_sink_name = var.log_sink_name sa_tagger = var.sa_tagger sa_tagger_tasks = var.sa_tagger_tasks scheduler_name = var.tagging_scheduler_name tagger_pubsub_sub = var.tagger_pubsub_sub tagger_pubsub_topic = var.tagger_pubsub_topic tagger_role = var.tagger_role tagger_service_name = var.tagger_service_name is_auto_dlp_mode = var.is_auto_dlp_mode auto_dlp_results_table_name = var.auto_dlp_results_table_name standard_dlp_results_table_name = var.standard_dlp_results_table_name sa_tagging_dispatcher = var.sa_tagging_dispatcher sa_tagging_dispatcher_tasks = var.sa_tagging_dispatcher_tasks data_catalog_taxonomy_activated_policy_types = var.data_catalog_taxonomy_activated_policy_types gcs_flags_bucket_name = module.gcs.create_gcs_flags_bucket_name dispatcher_service_timeout_seconds = var.dispatcher_service_timeout_seconds dispatcher_subscription_ack_deadline_seconds = var.dispatcher_subscription_ack_deadline_seconds dispatcher_subscription_message_retention_duration = var.dispatcher_subscription_message_retention_duration tagger_service_timeout_seconds = var.tagger_service_timeout_seconds tagger_subscription_ack_deadline_seconds = var.tagger_subscription_ack_deadline_seconds tagger_subscription_message_retention_duration = var.tagger_subscription_message_retention_duration promote_mixed_info_types = var.promote_mixed_info_types custom_info_types_dictionaries = var.custom_info_types_dictionaries custom_info_types_regex = var.custom_info_types_regex source_data_regions = var.source_data_regions taxonomy_name_suffix = var.taxonomy_name_suffix terraform_data_deletion_protection = var.terraform_data_deletion_protection } module "inspection-stack" { source = "./stacks/inspection" // deploy the inspection stack only if the we are not in auto_dlp_mode count = var.is_auto_dlp_mode ? 0 : 1 bigquery_dataset_name = module.common-stack.bq_results_dataset cloud_scheduler_account = local.cloud_scheduler_account_email cron_expression = var.inspection_cron_expression datasets_exclude_list = var.datasets_exclude_list datasets_include_list = var.datasets_include_list dispatcher_service_image = local.inspection_dispatcher_service_image_uri dlp_inspection_templates_ids = module.common-stack.dlp_inspection_templates_ids inspector_service_image = local.inspector_service_image_uri project = var.project projects_include_list = var.projects_include_list compute_region = var.compute_region data_region = var.data_region source_data_regions = var.source_data_regions table_scan_limits_json_config = jsonencode(var.table_scan_limits_json_config) tables_exclude_list = var.tables_exclude_list tagger_topic_id = module.common-stack.tagger_topic_id dispatcher_pubsub_sub = var.inspection_dispatcher_pubsub_sub dispatcher_pubsub_topic = var.inspection_dispatcher_pubsub_topic dispatcher_service_name = var.inspection_dispatcher_service_name inspector_pubsub_sub = var.inspector_pubsub_sub inspector_pubsub_topic = var.inspector_pubsub_topic inspector_service_name = var.inspector_service_name sa_inspector = var.sa_inspector sa_inspector_tasks = var.sa_inspector_tasks scheduler_name = var.inspection_scheduler_name standard_dlp_results_table_name = var.standard_dlp_results_table_name sa_inspection_dispatcher = var.sa_inspection_dispatcher sa_inspection_dispatcher_tasks = var.sa_inspection_dispatcher_tasks dlp_max_findings_per_item = var.dlp_max_findings_per_item dlp_min_likelihood = var.dlp_min_likelihood dlp_sampling_method = var.dlp_sampling_method gcs_flags_bucket_name = module.gcs.create_gcs_flags_bucket_name dispatcher_service_timeout_seconds = var.dispatcher_service_timeout_seconds dispatcher_subscription_ack_deadline_seconds = var.dispatcher_subscription_ack_deadline_seconds dispatcher_subscription_message_retention_duration = var.dispatcher_subscription_message_retention_duration inspector_service_timeout_seconds = var.inspector_service_timeout_seconds inspector_subscription_ack_deadline_seconds = var.inspector_subscription_ack_deadline_seconds inspector_subscription_message_retention_duration = var.inspector_subscription_message_retention_duration } # Helper functions for data analysis module "bq-remote-func-get-table-policy-tags" { source = "./modules/bq-remote-function" function_name = var.bq_remote_func_get_policy_tags_name cloud_function_src_dir = "../helpers/bq-remote-functions/get-policy-tags" cloud_function_temp_dir = "/tmp/get-policy-tags.zip" service_account_name = var.sa_bq_remote_func_get_policy_tags function_entry_point = "process_request" env_variables = {} project = var.project compute_region = var.compute_region data_region = var.data_region bigquery_dataset_name = module.common-stack.bq_results_dataset deployment_procedure_path = "modules/bq-remote-function/procedures/deploy_get_policy_tags_remote_func.tpl" cloud_functions_sa_extra_roles = [] depends_on = [module.common-stack] } # Assign permissions for the service accounts used in this solution on the data projects when using standard mode. # For this to run, the terraform service account must have permissions to set IAM policies on each data project. You can achieve this by running scripts/prepare_terraform_service_account_on_data_projects.sh "data-project-1" "data-project-2". # If you can't grant the terraform account such access, this step can also be done via scripts/prepare_data_projects_for_standard_mode.sh by an authorized user module "data_projects_permissions_in_standard_mode" { source = "./modules/data_project_permissions_in_standard_mode" // deploy this module only if we are in standard mode count = var.is_auto_dlp_mode? 0: length(local.data_projects) target_project = local.data_projects[count.index] sa_bq_remote_func_get_policy_tags_email = module.bq-remote-func-get-table-policy-tags.cloud_function_sa_email sa_dlp_email = local.dlp_service_account_email sa_inspection_dispatcher_email = module.inspection-stack[0].sa_inspection_dispatcher_email sa_inspector_email = module.inspection-stack[0].sa_inspector_email sa_tagger_email = module.common-stack.sa_tagger_email sa_tagging_dispatcher_email = module.common-stack.sa_tagging_dispatcher_email }