diff --git a/CHANGELOG.md b/CHANGELOG.md index c8bbd4e7..667ba0f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - new `billing-budget` module - fix `scheduled-asset-inventory-export-bq` module - output custom role information from the `organization` module +- enable multiple `vpc-sc` perimeters over multiple modules ## [5.1.0] - 2021-08-30 diff --git a/modules/vpc-sc/README.md b/modules/vpc-sc/README.md index 2c64bb1c..01bcf59d 100644 --- a/modules/vpc-sc/README.md +++ b/modules/vpc-sc/README.md @@ -136,15 +136,65 @@ module "vpc-sc" { # tftest:modules=1:resources=3 ``` +## Example VCP-SC standard perimeter with one service and one project in dry run mode in a Organization with an already existent access policy +```hcl +module "vpc-sc-first" { + source = "./modules/vpc-sc" + organization_id = "organizations/112233" + access_policy_create = false + access_policy_name = "My Access Policy" + access_levels = { + my_trusted_proxy = { + combining_function = "AND" + conditions = [{ + ip_subnetworks = ["85.85.85.52/32"] + required_access_levels = null + members = [] + negate = false + regions = null + }] + } + } + access_level_perimeters = { + enforced = { + my_trusted_proxy = ["perimeter"] + } + } + perimeters = { + perimeter = { + type = "PERIMETER_TYPE_REGULAR" + dry_run_config = { + restricted_services = ["storage.googleapis.com", "bigquery.googleapis.com"] + vpc_accessible_services = ["storage.googleapis.com", "bigquery.googleapis.com"] + } + enforced_config = { + restricted_services = ["storage.googleapis.com"] + vpc_accessible_services = ["storage.googleapis.com"] + } + } + } + perimeter_projects = { + perimeter = { + enforced = [111111111, 222222222] + dry_run = [333333333] + } + } +} + +# tftest:modules=1:resources=2 +``` + ## Variables | name | description | type | required | default | |---|---|:---: |:---:|:---:| -| access_policy_title | Access Policy title to be created. | string | ✓ | | | organization_id | Organization id in organizations/nnnnnn format. | string | ✓ | | | *access_level_perimeters* | Enforced mode -> Access Level -> Perimeters mapping. Enforced mode can be 'enforced' or 'dry_run' | map(map(list(string))) | | {} | | *access_levels* | Map of Access Levels to be created. For each Access Level you can specify 'ip_subnetworks, required_access_levels, members, negate or regions'. | map(object({...})) | | {} | +| *access_policy_create* | Enable autocreation of the Access Policy | bool | | true | +| *access_policy_name* | Referenced Access Policy name | string | | null | +| *access_policy_title* | Access Policy title to be created. | string | | null | | *egress_policies* | List of EgressPolicies in the form described in the [documentation](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/access_context_manager_service_perimeter#egress_policies) | | | null | | *egress_policies_perimeters* | Enforced mode -> Egress Policy -> Perimeters mapping. Enforced mode can be 'enforced' or 'dry_run' | map(map(list(string))) | | {} | | *ingress_policies* | List of IngressPolicies in the form described in the [documentation](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/access_context_manager_service_perimeter#ingress_policies) | | | null | diff --git a/modules/vpc-sc/main.tf b/modules/vpc-sc/main.tf index 6b111d98..abae2e35 100644 --- a/modules/vpc-sc/main.tf +++ b/modules/vpc-sc/main.tf @@ -15,7 +15,11 @@ */ locals { - access_policy_name = google_access_context_manager_access_policy.default.name + access_policy_name = ( + var.access_policy_create + ? try(google_access_context_manager_access_policy.default[0].name, null) + : var.access_policy_name + ) standard_perimeters = { for key, value in var.perimeters : @@ -36,8 +40,9 @@ locals { } resource "google_access_context_manager_access_policy" "default" { + count = var.access_policy_create ? 1 : 0 parent = var.organization_id - title = var.access_policy_title + title = var.access_policy_title == null ? "${var.organization_id}-title" : var.access_policy_title } resource "google_access_context_manager_access_level" "default" { diff --git a/modules/vpc-sc/variables.tf b/modules/vpc-sc/variables.tf index 490f4951..0905c71a 100644 --- a/modules/vpc-sc/variables.tf +++ b/modules/vpc-sc/variables.tf @@ -29,6 +29,18 @@ variable "access_levels" { default = {} } +variable "access_policy_create" { + description = "Enable autocreation of the Access Policy" + type = bool + default = true +} + +variable "access_policy_name" { + description = "Referenced Access Policy name" + type = string + default = null +} + variable "access_level_perimeters" { description = "Enforced mode -> Access Level -> Perimeters mapping. Enforced mode can be 'enforced' or 'dry_run'" type = map(map(list(string))) @@ -38,6 +50,7 @@ variable "access_level_perimeters" { variable "access_policy_title" { description = "Access Policy title to be created." type = string + default = null } variable "egress_policies" {