diff --git a/modules/organization/README.md b/modules/organization/README.md index 53ac2cbb..e38e62f9 100644 --- a/modules/organization/README.md +++ b/modules/organization/README.md @@ -36,6 +36,8 @@ module "org" { | name | description | type | required | default | |---|---|:---: |:---:|:---:| | org_id | Organization id in nnnnnn format. | number | ✓ | | +| *access_policy_name* | Access Policy name. No Access Policy will be created. | string | | null | +| *access_policy_title* | Access Policy title to be created. | string | | | | *custom_roles* | Map of role name => list of permissions to create in this project. | map(list(string)) | | {} | | *iam_additive_members* | Map of member lists used to set non authoritative bindings, keyed by role. | map(list(string)) | | {} | | *iam_additive_roles* | List of roles used to set non authoritative bindings. | list(string) | | [] | @@ -44,10 +46,13 @@ module "org" { | *iam_roles* | List of roles used to set authoritative bindings. | list(string) | | [] | | *policy_boolean* | Map of boolean org policies and enforcement value, set value to null for policy restore. | map(bool) | | {} | | *policy_list* | Map of list org policies, status is true for allow, false for deny, null for restore. Values can only be used for allow or deny. | map(object({...})) | | {} | +| *vpc_sc_perimeters* | Set of Perimeters. | map(object({...})) | | {} | +| *vpc_sc_perimeters_projects* | Perimeter - Project Number mapping in `projects/project_number` format.. | map(list(string)) | | {} | ## Outputs | name | description | sensitive | |---|---|:---:| +| access_policy | Access Policy name. | | | org_id | Organization id dependent on module resources. | | diff --git a/modules/organization/main.tf b/modules/organization/main.tf index b243d9d9..37f43c78 100644 --- a/modules/organization/main.tf +++ b/modules/organization/main.tf @@ -63,6 +63,10 @@ resource "google_access_context_manager_service_perimeter" "standard" { resources = formatlist("projects/%s", lookup(var.vpc_sc_perimeters_projects, each.key, [])) restricted_services = each.value.restricted_services } + + lifecycle { + ignore_changes = [status[0].resources] + } } resource "google_access_context_manager_service_perimeter" "bridge" { @@ -75,6 +79,11 @@ resource "google_access_context_manager_service_perimeter" "bridge" { resources = formatlist("projects/%s", lookup(var.vpc_sc_perimeters_projects, each.key, [])) restricted_services = each.value.restricted_services } + + lifecycle { + ignore_changes = [status[0].resources] + } + depends_on = [ google_access_context_manager_service_perimeter.standard, ] diff --git a/modules/organization/outputs.tf b/modules/organization/outputs.tf index 2a829c4d..c0cc469c 100644 --- a/modules/organization/outputs.tf +++ b/modules/organization/outputs.tf @@ -26,3 +26,8 @@ output "org_id" { google_organization_policy.list ] } + +output "access_policy" { + description = "Access Policy name." + value = local.access_policy_name +} \ No newline at end of file diff --git a/modules/project/README.md b/modules/project/README.md index 582b7b29..bdb8cfda 100644 --- a/modules/project/README.md +++ b/modules/project/README.md @@ -75,6 +75,8 @@ module "project" { | *policy_list* | Map of list org policies, status is true for allow, false for deny, null for restore. Values can only be used for allow or deny. | map(object({...})) | | {} | | *prefix* | Prefix used to generate project id and name. | string | | null | | *services* | Service APIs to enable. | list(string) | | [] | +| *vpc_sc_perimeter* | Name of the VPC-SC perimeter the project belong to. | string | | null | +| *vpc_sc_perimeter_bridges* | List of VPC-SC perimeter bridges the project belong to. Must be of the form accessPolicies/{policy_id}/servicePerimeters/{short_name} | list(string) | | [] | ## Outputs diff --git a/modules/project/main.tf b/modules/project/main.tf index 7e4aaeb0..f1c74413 100644 --- a/modules/project/main.tf +++ b/modules/project/main.tf @@ -201,3 +201,18 @@ resource "google_project_organization_policy" "list" { } } } + +resource "google_access_context_manager_service_perimeter_resource" "standard" { + count = var.vpc_sc_perimeter != "" ? 1 : 0 + perimeter_name = var.vpc_sc_perimeter + resource = format("projects/%s", google_project.project.number) +} + +resource "google_access_context_manager_service_perimeter_resource" "bridges" { + count = length(var.vpc_sc_perimeter_bridges) + perimeter_name = var.vpc_sc_perimeter_bridges[count.index] + resource = format("projects/%s", google_project.project.number) + depends_on = [ + google_access_context_manager_service_perimeter_resource.standard, + ] +} diff --git a/modules/project/variables.tf b/modules/project/variables.tf index fc6e12ab..f6cb8b59 100644 --- a/modules/project/variables.tf +++ b/modules/project/variables.tf @@ -124,3 +124,15 @@ variable "services" { type = list(string) default = [] } + +variable "vpc_sc_perimeter" { + description = "Name of the VPC-SC perimeter the project belong to. Must be of the form accessPolicies/{policy_id}/servicePerimeters/{short_name}" + type = string + default = null +} + +variable "vpc_sc_perimeter_bridges" { + description = "List of VPC-SC perimeter bridges the project belong to. Must be of the form accessPolicies/{policy_id}/servicePerimeters/{short_name}" + type = list(string) + default = [] +}