4-projects/modules/data_domain/kms.tf (170 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 { key_sa_map = flatten([ for key_ring in local.shared_kms_key_ring : [ { key_ring = key_ring location = split("/", key_ring)[3] key = "data_ingestion_key_${var.business_code}_${var.data_domain.name}_${var.env}" sa = [ "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}", "serviceAccount:service-${module.ingestion_project.project_number}@gcp-sa-pubsub.iam.gserviceaccount.com", "serviceAccount:service-${module.ingestion_project.project_number}@dataflow-service-producer-prod.iam.gserviceaccount.com", "serviceAccount:service-${module.ingestion_project.project_number}@compute-system.iam.gserviceaccount.com", "serviceAccount:bq-${module.nonconfidential_project.project_number}@bigquery-encryption.iam.gserviceaccount.com", ] }, { key_ring = key_ring location = split("/", key_ring)[3] key = "bigquery_key_${var.business_code}_${var.data_domain.name}_${var.env}" sa = [ "serviceAccount:${data.google_bigquery_default_service_account.nonconfidential_bigquery_sa.email}", "serviceAccount:${local.data_governance_sa_cloud_function}" ] }, { key_ring = key_ring location = split("/", key_ring)[3] key = "reidentification_key_${var.business_code}_${var.data_domain.name}_${var.env}" sa = [ "serviceAccount:${data.google_storage_project_service_account.confidential_gcs_account.email_address}", "serviceAccount:service-${module.confidential_project.project_number}@dataflow-service-producer-prod.iam.gserviceaccount.com", "serviceAccount:service-${module.confidential_project.project_number}@compute-system.iam.gserviceaccount.com", ] }, { key_ring = key_ring location = split("/", key_ring)[3] key = "confidential_bigquery_key_${var.business_code}_${var.data_domain.name}_${var.env}" sa = [ "serviceAccount:${data.google_bigquery_default_service_account.confidential_bigquery_sa.email}", ] }, ] ]) deidentification_key_sas = { sa-dataflow-controller = "serviceAccount:${google_service_account.ingestion_service_accounts["sa-dataflow-controller"].email}", dataflow-service-producer-prod = "serviceAccount:service-${module.ingestion_project.project_number}@dataflow-service-producer-prod.iam.gserviceaccount.com", compute-system = "serviceAccount:service-${module.ingestion_project.project_number}@compute-system.iam.gserviceaccount.com", } keyrings = { for key_ring in var.key_rings : (split("/", key_ring)[3]) => key_ring } deidentification_keys = flatten([ for key_name, key_id in local.deidentify_keys : [ for sa_id, sa in local.deidentification_key_sas : [ { key_id = key_id name = key_name location = split("/", key_id)[3] sa_id = sa_id sa = sa } ] ] ]) } resource "time_sleep" "wait_for_sa" { create_duration = "30s" depends_on = [ google_project_service_identity.nonconfidential, data.google_storage_project_service_account.gcs_account, data.google_storage_project_service_account.confidential_gcs_account, data.google_bigquery_default_service_account.nonconfidential_bigquery_sa, data.google_bigquery_default_service_account.confidential_bigquery_sa, ] } data "google_storage_project_service_account" "gcs_account" { project = module.ingestion_project.project_id } data "google_storage_project_service_account" "confidential_gcs_account" { project = module.confidential_project.project_id } data "google_bigquery_default_service_account" "nonconfidential_bigquery_sa" { project = module.nonconfidential_project.project_id } data "google_bigquery_default_service_account" "confidential_bigquery_sa" { project = module.confidential_project.project_id } module "data_mesh_keys" { source = "../kms" for_each = { for key_ring in local.key_sa_map : "${key_ring.key}-${key_ring.location}" => key_ring } name = each.value.key key_ring = each.value.key_ring key_rotation_period = var.key_rotation_period prevent_destroy = var.kms_key_prevent_destroy encrypter_decrypters = each.value.sa depends_on = [time_sleep.wait_for_sa] } resource "google_kms_crypto_key_iam_member" "deidentify_encrypt_decrypter" { for_each = { for key in local.deidentification_keys : "${key.sa_id}-${key.location}" => key } role = "roles/cloudkms.cryptoKeyEncrypterDecrypter" crypto_key_id = each.value.key_id member = each.value.sa } module "ingestion_project_keys" { source = "../kms" for_each = local.keyrings name = module.ingestion_project.project_id key_ring = each.value key_rotation_period = var.key_rotation_period prevent_destroy = var.kms_key_prevent_destroy enable_cloudbuild_deploy = true project_id = local.env_kms_project_id app_infra_pipeline_service_account = local.app_infra_pipeline_service_accounts["${var.data_domain.name}-ingest"] encrypter_decrypters = [ "serviceAccount:service-${module.ingestion_project.project_number}@gs-project-accounts.iam.gserviceaccount.com", "serviceAccount:service-${module.ingestion_project.project_number}@gcp-sa-pubsub.iam.gserviceaccount.com", "serviceAccount:${local.app_infra_pipeline_service_accounts["${var.data_domain.name}-ingest"]}", ] depends_on = [ google_project_service_identity.ingestion, ] } module "nonconfidential_project_keys" { source = "../kms" for_each = local.keyrings name = module.nonconfidential_project.project_id key_ring = each.value key_rotation_period = var.key_rotation_period prevent_destroy = var.kms_key_prevent_destroy enable_cloudbuild_deploy = true project_id = local.env_kms_project_id app_infra_pipeline_service_account = local.app_infra_pipeline_service_accounts["${var.data_domain.name}-non-conf"] encrypter_decrypters = [ "serviceAccount:service-${module.nonconfidential_project.project_number}@gs-project-accounts.iam.gserviceaccount.com", "serviceAccount:service-${module.nonconfidential_project.project_number}@gcp-sa-pubsub.iam.gserviceaccount.com", "serviceAccount:${local.app_infra_pipeline_service_accounts["${var.data_domain.name}-non-conf"]}" ] depends_on = [google_project_service_identity.nonconfidential] } module "confidential_project_keys" { source = "../kms" for_each = local.keyrings name = module.confidential_project.project_id key_ring = each.value key_rotation_period = var.key_rotation_period prevent_destroy = var.kms_key_prevent_destroy enable_cloudbuild_deploy = true project_id = local.env_kms_project_id app_infra_pipeline_service_account = local.app_infra_pipeline_service_accounts["${var.data_domain.name}-conf"] encrypter_decrypters = [ "serviceAccount:service-${module.confidential_project.project_number}@gs-project-accounts.iam.gserviceaccount.com", "serviceAccount:service-${module.confidential_project.project_number}@gcp-sa-pubsub.iam.gserviceaccount.com", "serviceAccount:${local.app_infra_pipeline_service_accounts["${var.data_domain.name}-conf"]}" ] depends_on = [google_project_service_identity.confidential] }