modules/vpc-sc-config/main.tf (131 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 { suffix = var.common_suffix != "" ? var.common_suffix : random_id.suffix.hex perimeter_name = "rp_sdwoi_${var.common_name}_${local.suffix}" regular_service_perimeter_name = "accessPolicies/${var.access_context_manager_policy_id}/servicePerimeters/${local.perimeter_name}" access_policy_name = "ac_sdwoi_${var.common_name}_${local.suffix}" } resource "random_id" "suffix" { byte_length = 2 } module "access_level_policy" { source = "terraform-google-modules/vpc-service-controls/google//modules/access_level" version = "5.0" policy = var.access_context_manager_policy_id name = local.access_policy_name description = "policy with all available options to configure" members = var.perimeter_members ip_subnetworks = var.access_level_ip_subnetworks regions = var.access_level_regions } # Cannot use the module "terraform-google-modules/vpc-service-controls/google/modules/regular_service_perimeter" # because we need to set the lifecycle of the resource. resource "google_access_context_manager_service_perimeter" "regular_service_perimeter" { provider = google parent = "accessPolicies/${var.access_context_manager_policy_id}" perimeter_type = "PERIMETER_TYPE_REGULAR" name = "accessPolicies/${var.access_context_manager_policy_id}/servicePerimeters/${local.perimeter_name}" title = local.perimeter_name description = "perimeter for data warehouse projects" lifecycle { ignore_changes = [status[0].resources] } status { restricted_services = var.restricted_services access_levels = formatlist( "accessPolicies/${var.access_context_manager_policy_id}/accessLevels/%s", [module.access_level_policy.name] ) vpc_accessible_services { enable_restriction = true allowed_services = ["RESTRICTED-SERVICES"] } dynamic "ingress_policies" { for_each = var.ingress_policies content { ingress_from { dynamic "sources" { for_each = merge( { for k, v in lookup(ingress_policies.value["from"]["sources"], "resources", []) : v => "resource" }, { for k, v in lookup(ingress_policies.value["from"]["sources"], "access_levels", []) : v => "access_level" }) content { resource = sources.value == "resource" ? sources.key : null access_level = sources.value == "access_level" ? sources.key != "*" ? "accessPolicies/${var.access_context_manager_policy_id}/accessLevels/${sources.key}" : "*" : null } } identity_type = lookup(ingress_policies.value["from"], "identity_type", null) identities = lookup(ingress_policies.value["from"], "identities", null) } ingress_to { resources = lookup(ingress_policies.value["to"], "resources", ["*"]) dynamic "operations" { for_each = ingress_policies.value["to"]["operations"] content { service_name = operations.key dynamic "method_selectors" { for_each = operations.key != "*" ? merge( { for v in lookup(operations.value, "methods", []) : v => "method" }, { for v in lookup(operations.value, "permissions", []) : v => "permission" }) : {} content { method = method_selectors.value == "method" ? method_selectors.key : null permission = method_selectors.value == "permission" ? method_selectors.key : null } } } } } } } dynamic "egress_policies" { for_each = var.egress_policies content { egress_from { identity_type = lookup(egress_policies.value["from"], "identity_type", null) identities = lookup(egress_policies.value["from"], "identities", null) } egress_to { resources = lookup(egress_policies.value["to"], "resources", ["*"]) dynamic "operations" { for_each = lookup(egress_policies.value["to"], "operations", []) content { service_name = operations.key dynamic "method_selectors" { for_each = merge( { for k, v in lookup(operations.value, "methods", {}) : v => "method" }, { for k, v in lookup(operations.value, "permissions", {}) : v => "permission" }) content { method = method_selectors.value == "method" ? method_selectors.key : "" permission = method_selectors.value == "permission" ? method_selectors.key : "" } } } } } } } } } resource "google_access_context_manager_service_perimeter_resource" "service-perimeter-resource" { for_each = var.resources perimeter_name = google_access_context_manager_service_perimeter.regular_service_perimeter.name resource = "projects/${each.value}" } resource "time_sleep" "wait_for_vpc_sc_propagation" { create_duration = "240s" depends_on = [ module.access_level_policy, google_access_context_manager_service_perimeter.regular_service_perimeter ] }