terraform/data-cloud/main.tf (142 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 { dimensions = { "small" = { slots = 100 ram = 16 edition = "BASIC" } "large" = { slots = 200 ram = 32 edition = "ENTERPRISE" } } } resource "random_string" "random" { length = 4 special = false upper = false } resource "google_folder" "data_cloud" { display_name = "Pasture Data Cloud" parent = data.google_active_folder.sandbox.name depends_on = [ google_folder_iam_member.folder_admin, google_folder_iam_member.project_creator, google_folder_iam_member.owner, ] } module "projects" { source = "github.com/GoogleCloudPlatform/cloud-foundation-fabric//blueprints/factories/project-factory?ref=v29.0.0" data_defaults = { billing_account = var.billing_account.id parent = google_folder.data_cloud.id } data_merges = { labels = { source = "pastures" seed = "data-cloud" blueprint = "data-foundation" } services = [ "logging.googleapis.com", "monitoring.googleapis.com", "stackdriver.googleapis.com", "iam.googleapis.com", "serviceusage.googleapis.com", "servicemanagement.googleapis.com", "cloudapis.googleapis.com", "cloudresourcemanager.googleapis.com", "cloudidentity.googleapis.com" ] } data_overrides = { prefix = "pasture-${var.prefix}-${random_string.random.result}" } factory_data_path = "data/projects" } resource "google_bigquery_reservation" "reservation" { count = var.internal_env == "true" ? 0 : 1 project = module.projects.projects["cmn"].id name = "pastures-data-cloud" location = var.locations.bq slot_capacity = local.dimensions[var.pasture_size].slots edition = "ENTERPRISE_PLUS" ignore_idle_slots = false concurrency = 0 autoscale { max_slots = 400 } } resource "google_bigquery_reservation_assignment" "assignment" { count = var.internal_env == "true" ? 0 : 1 project = module.projects.projects["cmn"].id assignee = google_folder.data_cloud.id job_type = "QUERY" reservation = google_bigquery_reservation.reservation[0].id } resource "google_bigquery_bi_reservation" "bi_reservation" { count = var.internal_env == "true" ? 0 : 1 project = module.projects.projects["exp"].id location = var.locations.bq size = local.dimensions[var.pasture_size].ram * pow(1024, 3) } module "datafusion" { source = "github.com/GoogleCloudPlatform/cloud-foundation-fabric//modules/datafusion?ref=v29.0.0" project_id = module.projects.projects["lod"].id name = "pasture-datafusion" region = var.region type = local.dimensions[var.pasture_size].edition network = data.google_compute_networks.load.networks[0] firewall_create = true ip_allocation_create = true private_instance = true network_peering = true enable_stackdriver_logging = true enable_stackdriver_monitoring = true } module "data-platform" { source = "github.com/GoogleCloudPlatform/cloud-foundation-fabric//blueprints/data-solutions/data-platform-foundations?ref=v29.0.0" organization_domain = var.organization.domain project_config = { parent = google_folder.data_cloud.id project_create = false project_ids = { drop = module.projects.projects["drp"].id load = module.projects.projects["lod"].id orc = module.projects.projects["orc"].id trf = module.projects.projects["trf"].id dwh-lnd = module.projects.projects["lnd"].id dwh-cur = module.projects.projects["cur"].id dwh-conf = module.projects.projects["cnf"].id common = module.projects.projects["cmn"].id exp = module.projects.projects["exp"].id } } prefix = var.prefix groups = { data-analysts = google_cloud_identity_group.data_analysts.display_name data-engineers = google_cloud_identity_group.data_engineers.display_name data-security = google_cloud_identity_group.data_security.display_name } location = lower(var.locations.bq) region = var.region composer_config = { disable_deployment = true } }