modules/secure_data_warehouse/harness.tf (277 lines of code) (raw):
/**
* Copyright 2023 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 {
random_id = var.deployment_id != null ? var.deployment_id : random_id.default.0.hex
default_apis_data_ingest = [
"accesscontextmanager.googleapis.com",
"appengine.googleapis.com",
"artifactregistry.googleapis.com",
"bigquery.googleapis.com",
"cloudbilling.googleapis.com",
"cloudbuild.googleapis.com",
"cloudkms.googleapis.com",
"cloudresourcemanager.googleapis.com",
"cloudscheduler.googleapis.com",
"compute.googleapis.com",
"datacatalog.googleapis.com",
"dataflow.googleapis.com",
"dlp.googleapis.com",
"dns.googleapis.com",
"iam.googleapis.com",
"pubsub.googleapis.com",
"serviceusage.googleapis.com",
"storage-api.googleapis.com"
]
project_services_data_ingest = local.default_apis_data_ingest
default_apis_data_govern = [
"accesscontextmanager.googleapis.com",
"cloudbilling.googleapis.com",
"cloudkms.googleapis.com",
"cloudresourcemanager.googleapis.com",
"datacatalog.googleapis.com",
"dlp.googleapis.com",
"iam.googleapis.com",
"serviceusage.googleapis.com",
"storage-api.googleapis.com",
"secretmanager.googleapis.com"
]
project_services_data_govern = var.billing_budget_pubsub_topic ? distinct(concat(local.default_apis_data_govern,["pubsub.googleapis.com"])) : local.default_apis_data_govern
default_apis_non_conf_data = [
"accesscontextmanager.googleapis.com",
"bigquery.googleapis.com",
"cloudbilling.googleapis.com",
"cloudkms.googleapis.com",
"cloudresourcemanager.googleapis.com",
"iam.googleapis.com",
"serviceusage.googleapis.com",
"storage-api.googleapis.com"
]
project_services_non_conf_data = local.default_apis_non_conf_data
default_apis_conf_data = [
"accesscontextmanager.googleapis.com",
"artifactregistry.googleapis.com",
"bigquery.googleapis.com",
"cloudbilling.googleapis.com",
"cloudbuild.googleapis.com",
"cloudkms.googleapis.com",
"cloudresourcemanager.googleapis.com",
"compute.googleapis.com",
"datacatalog.googleapis.com",
"dataflow.googleapis.com",
"dlp.googleapis.com",
"dns.googleapis.com",
"iam.googleapis.com",
"serviceusage.googleapis.com",
"storage-api.googleapis.com"
]
project_services_conf_data = local.default_apis_conf_data
project_services_external_flex_template = local.default_apis_external_flex_template
default_apis_external_flex_template = [
"cloudresourcemanager.googleapis.com",
"storage-api.googleapis.com",
"serviceusage.googleapis.com",
"iam.googleapis.com",
"cloudbilling.googleapis.com",
"artifactregistry.googleapis.com",
"cloudbuild.googleapis.com",
"compute.googleapis.com"
]
enable_services = length(local.project_services_data_ingest)> 0 || length(local.project_services_data_govern)> 0 || length(local.project_services_non_conf_data)> 0 || length(local.project_services_conf_data)> 0 ? true : false
perimeter_additional_members = distinct(concat([
for i in var.perimeter_additional_members : (
length(regexall("gserviceaccount.com", "${i}")) > 0 ? "serviceAccount:${i}" : "user:${i}"
)
]))
projects_ids = {
data_ingestion = module.project_radlab_sdw_data_ingest.project_id,
governance = module.project_radlab_sdw_data_govern.project_id,
non_confidential = module.project_radlab_sdw_non_conf_data.project_id,
confidential = module.project_radlab_sdw_conf_data.project_id
}
secret_name = "wrapped_key"
kek_keyring = "kek_keyring_${local.random_id}"
kek_key_name = "kek_key_${local.random_id}"
key_rotation_period_seconds = "2592000s" #30 days
use_temporary_crypto_operator_role = true
gcloud_impersonate_flag = length(var.resource_creator_identity) != 0 ? "--impersonate-service-account=${var.resource_creator_identity}" : ""
}
resource "random_id" "default" {
count = var.deployment_id == null ? 1 : 0
byte_length = 2
}
module "project_radlab_sdw_data_ingest" {
# count = var.create_project ? 1 : 0
source = "terraform-google-modules/project-factory/google"
version = "~> 10.0"
name = format("%s-data-ingest-%s", var.project_id_prefix, local.random_id) #radlab-sdw-data-ingest-1234
folder_id = var.folder_id
billing_account = var.billing_account_id
org_id = var.organization_id
default_service_account = "deprivilege"
activate_apis = []
}
resource "google_project_service" "enabled_services_data_ingest" {
for_each = toset(local.project_services_data_ingest)
project = module.project_radlab_sdw_data_ingest.project_id
service = each.value
disable_dependent_services = true
disable_on_destroy = true
}
module "project_radlab_sdw_data_govern" {
# count = var.create_project ? 1 : 0
source = "terraform-google-modules/project-factory/google"
version = "~> 10.0"
name = format("%s-data-govern-%s", var.project_id_prefix, local.random_id) #radlab-sdw-data-govern-1234
random_project_id = false
folder_id = var.folder_id
billing_account = var.billing_account_id
org_id = var.organization_id
default_service_account = "deprivilege"
activate_apis = []
}
resource "google_project_service" "enabled_services_data_govern" {
for_each = toset(local.project_services_data_govern)
project = module.project_radlab_sdw_data_govern.project_id
service = each.value
disable_dependent_services = true
disable_on_destroy = true
}
module "project_radlab_sdw_conf_data" {
# count = var.create_project ? 1 : 0
source = "terraform-google-modules/project-factory/google"
version = "~> 10.0"
name = format("%s-conf-data-%s", var.project_id_prefix, local.random_id) #radlab-sdw-conf-data-1234
random_project_id = false
folder_id = var.folder_id
billing_account = var.billing_account_id
org_id = var.organization_id
default_service_account = "deprivilege"
activate_apis = []
}
resource "google_project_service" "enabled_services_conf_data" {
for_each = toset(local.project_services_conf_data)
project = module.project_radlab_sdw_conf_data.project_id
service = each.value
disable_dependent_services = true
disable_on_destroy = true
}
module "project_radlab_sdw_non_conf_data" {
# count = var.create_project ? 1 : 0
source = "terraform-google-modules/project-factory/google"
version = "~> 10.0"
name = format("%s-non-conf-data-%s", var.project_id_prefix, local.random_id) #radlab-sdw-non-conf-data-1234
random_project_id = false
folder_id = var.folder_id
billing_account = var.billing_account_id
org_id = var.organization_id
default_service_account = "deprivilege"
activate_apis = []
}
resource "google_project_service" "enabled_services_non_conf_data" {
for_each = toset(local.project_services_non_conf_data)
project = module.project_radlab_sdw_non_conf_data.project_id
service = each.value
disable_dependent_services = true
disable_on_destroy = true
}
module "iam_projects" {
source = "GoogleCloudPlatform/secured-data-warehouse/google//test/setup/iam-projects"
data_ingestion_project_id = module.project_radlab_sdw_data_ingest.project_id
non_confidential_data_project_id = module.project_radlab_sdw_non_conf_data.project_id
data_governance_project_id = module.project_radlab_sdw_data_govern.project_id
confidential_data_project_id = module.project_radlab_sdw_conf_data.project_id
service_account_email = var.secure_datawarehouse_service_acccount
depends_on = [
time_sleep.wait_120_seconds
]
}
resource "time_sleep" "wait_60_seconds_projects" {
create_duration = "60s"
depends_on = [
module.iam_projects
]
}
# resource "google_project_iam_binding" "remove_owner_role" {
# for_each = local.projects_ids
# project = each.value
# role = "roles/owner"
# members = []
# depends_on = [
# time_sleep.wait_60_seconds_projects
# ]
# }
module "template_project" {
source = "GoogleCloudPlatform/secured-data-warehouse/google//test/setup/template-project"
org_id = var.organization_id
folder_id = var.folder_id
billing_account = var.billing_account_id
location = var.region
service_account_email = var.secure_datawarehouse_service_acccount
}
module "kek" {
source = "terraform-google-modules/kms/google"
version = "~> 1.2"
project_id = module.project_radlab_sdw_data_govern.project_id
labels = { environment = "dev" }
location = var.region
keyring = local.kek_keyring
key_rotation_period = local.key_rotation_period_seconds
keys = [local.kek_key_name]
key_protection_level = "HSM"
prevent_destroy = !var.delete_contents_on_destroy
depends_on = [
time_sleep.wait_120_seconds
]
}
resource "google_secret_manager_secret" "wrapped_key_secret" {
provider = google-beta
secret_id = local.secret_name
labels = { environment = "dev" }
project = module.project_radlab_sdw_data_govern.project_id
replication {
user_managed {
replicas {
location = var.region
}
}
}
depends_on = [
time_sleep.wait_120_seconds
]
}
resource "null_resource" "wrapped_key" {
triggers = {
secret_id = google_secret_manager_secret.wrapped_key_secret.id
}
provisioner "local-exec" {
command = <<EOF
${path.module}/scripts/build/wrapped_key.sh \
${var.secure_datawarehouse_service_acccount} \
${module.kek.keys[local.kek_key_name]} \
${google_secret_manager_secret.wrapped_key_secret.name} \
${module.project_radlab_sdw_data_govern.project_id} \
${local.use_temporary_crypto_operator_role} \
${local.gcloud_impersonate_flag}
EOF
}
# depends_on = [
# google_project_iam_binding.remove_owner_role
# ]
}
data "google_secret_manager_secret_version" "wrapped_key" {
project = module.project_radlab_sdw_data_govern.project_id
secret = google_secret_manager_secret.wrapped_key_secret.id
depends_on = [
null_resource.wrapped_key
]
}
module "centralized_logging" {
source = "GoogleCloudPlatform/secured-data-warehouse/google//modules/centralized-logging"
projects_ids = local.projects_ids
logging_project_id = module.project_radlab_sdw_data_govern.project_id
kms_project_id = module.project_radlab_sdw_data_govern.project_id
bucket_name = "bkt-logging-${module.project_radlab_sdw_data_govern.project_id}"
logging_location = var.region
delete_contents_on_destroy = var.delete_contents_on_destroy
key_rotation_period_seconds = local.key_rotation_period_seconds
depends_on = [
module.iam_projects
]
}