main.tf (176 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. */ locals { enable_instance_nn = ( try(var.instance_size.num_nodes, 0) != null ? true : false ) database_creation_list = { for k, v in var.database_config : k => v if(try(v.create_db, null) == null ? false : v.create_db) } database_iam = flatten([ for k, v in var.database_config : [ for x in v.database_iam : "${k}|${element(split("=>", x), 0)}|${element(split("=>", x), 1)}" ] ]) backup_args = [ for k, v in var.database_config : { "backupId" : k, "database" : k, "expireTime" : v.backup_retention, "parent" : var.instance_name } if try(v.enable_backup, false) ] } resource "google_spanner_instance" "instance_num_node" { count = local.enable_instance_nn && var.create_instance ? 1 : 0 project = var.project_id config = var.instance_config display_name = var.instance_display_name name = var.instance_name num_nodes = var.instance_size.num_nodes labels = var.instance_labels dynamic "autoscaling_config" { for_each = var.enable_autoscaling ? [1] : [] content { autoscaling_limits { min_processing_units = var.min_processing_units max_processing_units = var.max_processing_units min_nodes = var.min_nodes max_nodes = var.max_nodes } autoscaling_targets { high_priority_cpu_utilization_percent = var.high_priority_cpu_utilization_percent storage_utilization_percent = var.storage_utilization_percent } asymmetric_autoscaling_options { replica_selection { location = var.replica_location } overrides { autoscaling_limits { min_nodes = var.override_min_nodes max_nodes = var.override_max_nodes } } } } } edition = var.edition default_backup_schedule_type = var.default_backup_schedule_type force_destroy = var.force_destroy } resource "google_spanner_instance" "instance_processing_units" { count = !local.enable_instance_nn && var.create_instance ? 1 : 0 project = var.project_id config = var.instance_config display_name = var.instance_display_name name = var.instance_name processing_units = var.instance_size.processing_units labels = var.instance_labels } data "google_spanner_instance" "instance" { count = !var.create_instance ? 1 : 0 name = var.instance_name project = var.project_id } resource "google_spanner_instance_iam_member" "instance" { for_each = toset(var.instance_iam) instance = ( !var.create_instance ? data.google_spanner_instance.instance[0].name : ( local.enable_instance_nn ? google_spanner_instance.instance_num_node[0].name : google_spanner_instance.instance_processing_units[0].name ) ) project = var.project_id role = length(split("=>", each.key)) > 1 ? element(split("=>", each.key), 1) : "roles/spanner.databaseAdmin" member = length(split("=>", each.key)) > 1 ? element(split("=>", each.key), 0) : each.key } resource "google_spanner_database" "database" { for_each = local.database_creation_list instance = ( !var.create_instance ? data.google_spanner_instance.instance[0].name : ( local.enable_instance_nn ? google_spanner_instance.instance_num_node[0].name : google_spanner_instance.instance_processing_units[0].name ) ) project = var.project_id name = each.key version_retention_period = each.value.version_retention_period ddl = each.value.ddl deletion_protection = each.value.deletion_protection dynamic "encryption_config" { for_each = ( try(each.value.kms_key_name, null) != null ? tolist([each.value.kms_key_name]) : [] ) content { kms_key_name = encryption_config.value } } lifecycle { ignore_changes = [ ddl # added ignore as changes to ddl forces database replacement ] } } resource "google_spanner_database_iam_member" "database" { for_each = toset(local.database_iam) instance = ( !var.create_instance ? data.google_spanner_instance.instance[0].name : ( local.enable_instance_nn ? google_spanner_instance.instance_num_node[0].name : google_spanner_instance.instance_processing_units[0].name ) ) project = var.project_id database = element(split("|", each.key), 0) role = element(split("|", each.key), 2) member = element(split("|", each.key), 1) depends_on = [ google_spanner_database.database ] } module "schedule_spanner_backup" { for_each = { for idx, backup_arg in local.backup_args : idx => backup_arg } source = "./modules/schedule_spanner_backup" project_id = var.project_id instance_name = each.value.parent database_name = each.value.database retention_duration = each.value.expireTime cron_spec_text = var.cron_spec_text backup_schedule_name = "backup-schedule-${each.key}" use_full_backup_spec = var.use_full_backup_spec use_incremental_backup_spec = var.use_incremental_backup_spec depends_on = [ google_spanner_instance.instance_num_node, google_spanner_instance.instance_processing_units, google_spanner_database.database ] }