4-projects/modules/data_domain/main.tf (225 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 {
default_ingestion_apis = [
"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",
"dataform.googleapis.com",
"datapipelines.googleapis.com",
"dlp.googleapis.com",
"dns.googleapis.com",
"iam.googleapis.com",
"logging.googleapis.com",
"monitoring.googleapis.com",
"pubsub.googleapis.com",
"serviceusage.googleapis.com",
"storage-api.googleapis.com",
]
default_non_confidential_apis = [
"accesscontextmanager.googleapis.com",
"bigquery.googleapis.com",
"cloudbilling.googleapis.com",
"cloudbuild.googleapis.com",
"cloudkms.googleapis.com",
"cloudresourcemanager.googleapis.com",
"datacatalog.googleapis.com",
"iam.googleapis.com",
"logging.googleapis.com",
"monitoring.googleapis.com",
"pubsub.googleapis.com",
"serviceusage.googleapis.com",
"storage-api.googleapis.com",
"storage.googleapis.com",
"orgpolicy.googleapis.com",
]
default_confidential_apis = [
"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",
"dataform.googleapis.com",
"datapipelines.googleapis.com",
"dlp.googleapis.com",
"dns.googleapis.com",
"iam.googleapis.com",
"logging.googleapis.com",
"monitoring.googleapis.com",
"serviceusage.googleapis.com",
"storage-api.googleapis.com",
"orgpolicy.googleapis.com",
]
ingestion_service_identities_apis = [
"dataflow.googleapis.com",
"pubsub.googleapis.com",
"storage.googleapis.com",
"cloudbuild.googleapis.com",
]
nonconfidential_service_identities_apis = [
"dataflow.googleapis.com",
"pubsub.googleapis.com",
"storage.googleapis.com",
"cloudbuild.googleapis.com",
]
confidential_service_identities_apis = [
"dataflow.googleapis.com",
]
}
module "ingestion_project" {
source = "../single_project"
org_id = local.org_id
billing_account = local.billing_account
folder_id = var.folder_name
environment = var.env
project_budget = var.project_budget
project_prefix = local.project_prefix
vpc = "restricted"
shared_vpc_host_project_id = local.restricted_host_project_id
shared_vpc_subnets = local.restricted_subnets_self_links
enable_cloudbuild_deploy = true
app_infra_pipeline_service_accounts = local.app_infra_pipeline_service_accounts
# Metadata
project_suffix = "${var.data_domain.name}-ngst"
application_name = "${var.business_code}-${var.data_domain.name}-ingestion"
billing_code = "1234"
primary_contact = "example@example.com"
secondary_contact = "example2@example.com"
business_code = var.business_code
activate_apis = concat(local.default_ingestion_apis, var.data_domain.ingestion_apis)
sa_roles = {
"${var.data_domain.name}-ingest" = [
"roles/cloudscheduler.admin",
"roles/compute.networkAdmin",
"roles/compute.securityAdmin",
"roles/dataflow.developer",
"roles/dns.admin",
"roles/resourcemanager.projectIamAdmin",
"roles/iam.serviceAccountAdmin",
"roles/iam.serviceAccountTokenCreator",
"roles/serviceusage.serviceUsageAdmin",
"roles/storage.admin",
"roles/pubsub.admin",
"roles/logging.admin",
]
}
vpc_service_control_attach_enabled = "true"
vpc_service_control_perimeter_name = "accessPolicies/${local.access_context_manager_policy_id}/servicePerimeters/${local.perimeter_name}"
vpc_service_control_sleep_duration = "60s"
}
module "nonconfidential_project" {
source = "../single_project"
org_id = local.org_id
billing_account = local.billing_account
folder_id = var.folder_name
environment = var.env
vpc = "restricted"
shared_vpc_host_project_id = local.restricted_host_project_id
shared_vpc_subnets = local.restricted_subnets_self_links
project_budget = var.project_budget
project_prefix = local.project_prefix
enable_cloudbuild_deploy = true
app_infra_pipeline_service_accounts = local.app_infra_pipeline_service_accounts
# Metadata
project_suffix = "${var.data_domain.name}-ncnf"
application_name = "${var.business_code}-${var.data_domain.name}-non-conf"
billing_code = "1234"
primary_contact = "example@example.com"
secondary_contact = "example2@example.com"
business_code = var.business_code
activate_apis = concat(local.default_non_confidential_apis, var.data_domain.nonconfidential_apis)
sa_roles = {
"${var.data_domain.name}-non-conf" = [
"roles/bigquery.admin",
"roles/resourcemanager.projectIamAdmin",
"roles/iam.serviceAccountAdmin",
"roles/iam.serviceAccountTokenCreator",
"roles/serviceusage.serviceUsageAdmin",
"roles/storage.admin",
]
}
vpc_service_control_attach_enabled = "true"
vpc_service_control_perimeter_name = "accessPolicies/${local.access_context_manager_policy_id}/servicePerimeters/${local.perimeter_name}"
vpc_service_control_sleep_duration = "60s"
}
module "confidential_project" {
source = "../single_project"
org_id = local.org_id
billing_account = local.billing_account
folder_id = var.folder_name
environment = var.env
vpc = "restricted"
shared_vpc_host_project_id = local.restricted_host_project_id
shared_vpc_subnets = local.restricted_subnets_self_links
project_budget = var.project_budget
project_prefix = local.project_prefix
enable_cloudbuild_deploy = true
app_infra_pipeline_service_accounts = local.app_infra_pipeline_service_accounts
# Metadata
project_suffix = "${var.data_domain.name}-cnf"
application_name = "${var.business_code}-${var.data_domain.name}-conf"
billing_code = "1234"
primary_contact = "example@example.com"
secondary_contact = "example2@example.com"
business_code = var.business_code
activate_apis = concat(local.default_confidential_apis, var.data_domain.confidential_apis)
sa_roles = {
"${var.data_domain.name}-conf" = [
"roles/bigquery.admin",
"roles/compute.networkAdmin",
"roles/compute.securityAdmin",
"roles/dns.admin",
"roles/dataflow.developer",
"roles/resourcemanager.projectIamAdmin",
"roles/iam.serviceAccountAdmin",
"roles/iam.serviceAccountTokenCreator",
"roles/serviceusage.serviceUsageAdmin",
"roles/storage.admin",
]
}
vpc_service_control_attach_enabled = "true"
vpc_service_control_perimeter_name = "accessPolicies/${local.access_context_manager_policy_id}/servicePerimeters/${local.perimeter_name}"
vpc_service_control_sleep_duration = "60s"
}
#################################
# Service Agents
#################################
resource "google_project_service_identity" "ingestion" {
for_each = toset(local.ingestion_service_identities_apis)
provider = google-beta
project = module.ingestion_project.project_id
service = each.value
}
resource "google_project_service_identity" "nonconfidential" {
for_each = toset(local.nonconfidential_service_identities_apis)
provider = google-beta
project = module.nonconfidential_project.project_id
service = each.value
}
resource "google_project_service_identity" "confidential" {
for_each = toset(local.confidential_service_identities_apis)
provider = google-beta
project = module.confidential_project.project_id
service = each.value
}