diff --git a/fast/README.md b/fast/README.md
index be35c36aa..7108c04a8 100644
--- a/fast/README.md
+++ b/fast/README.md
@@ -47,8 +47,8 @@ As mentioned before, fast relies on multiple stages to progressively bring up yo
- [Security](stages/02-security/README.md)
Manages centralized security configurations in a separate stage, typically owned by the security team. This stage implements VPC Security Controls via separate perimeters for environments and central services, and creates projects to host centralized KMS keys used by the whole organization. It's intentionally easy to extend to include other security-related resources, like Secret Manager.
-- [Networking](stages/02-networking/README.md)
- Manages centralized network resources in a separate stage, and is typically owned by the networking team. This stage implements a hub-and-spoke design, includes connectivity via VPN to on-premises, and YAML-based factories for firewall rules (hierarchical and VPC-level) and subnets.
+- Networking ([VPN](02-networking/README.md)/[NVA](02-networking-nva/README.md))
+ Manages centralized network resources in a separate stage, and is typically owned by the networking team. This stage implements a hub-and-spoke design, and includes connectivity via VPN to on-premises, and YAML-based factories for firewall rules (hierarchical and VPC-level) and subnets. It's currently available in two versions: [spokes connected via VPN](02-networking/README.md), [and spokes connected via appliances](02-networking-nva/README.md).
### Environment-level resources (03)
diff --git a/fast/stages/00-bootstrap/README.md b/fast/stages/00-bootstrap/README.md
index 994d67a9a..7157bb18c 100644
--- a/fast/stages/00-bootstrap/README.md
+++ b/fast/stages/00-bootstrap/README.md
@@ -177,11 +177,15 @@ Below is the outline of the output files generated by this stage:
│ ├── providers.tf
│ ├── terraform-bootstrap.auto.tfvars.json
├── 02-networking
-│ ├── providers.tf
+│ ├── terraform-bootstrap.auto.tfvars.json
+├── 02-networking-nva
│ ├── terraform-bootstrap.auto.tfvars.json
├── 02-security
-│ ├── providers.tf
│ ├── terraform-bootstrap.auto.tfvars.json
+├── 03-gke-multitenant-dev
+│ └── terraform-bootstrap.auto.tfvars.json
+├── 03-gke-multitenant-prod
+│ └── terraform-bootstrap.auto.tfvars.json
├── 03-project-factory-dev
│ └── terraform-bootstrap.auto.tfvars.json
├── 03-project-factory-prod
@@ -301,9 +305,9 @@ Names used in internal references (e.g. `module.foo-prod.id`) are only used by T
| name | description | sensitive | consumers |
|---|---|:---:|---|
-| [billing_dataset](outputs.tf#L85) | BigQuery dataset prepared for billing export. | | |
-| [project_ids](outputs.tf#L90) | Projects created by this stage. | | |
-| [providers](outputs.tf#L101) | Terraform provider files for this stage and dependent stages. | ✓ | stage-01 |
-| [tfvars](outputs.tf#L110) | Terraform variable files for the following stages. | ✓ | |
+| [billing_dataset](outputs.tf#L91) | BigQuery dataset prepared for billing export. | | |
+| [project_ids](outputs.tf#L96) | Projects created by this stage. | | |
+| [providers](outputs.tf#L107) | Terraform provider files for this stage and dependent stages. | ✓ | stage-01 |
+| [tfvars](outputs.tf#L116) | Terraform variable files for the following stages. | ✓ | |
diff --git a/fast/stages/00-bootstrap/organization.tf b/fast/stages/00-bootstrap/organization.tf
index f4f2cc3d5..51ae428a3 100644
--- a/fast/stages/00-bootstrap/organization.tf
+++ b/fast/stages/00-bootstrap/organization.tf
@@ -191,7 +191,6 @@ resource "google_organization_iam_binding" "org_admin_delegated" {
"roles/compute.orgFirewallPolicyAdmin",
"roles/compute.xpnAdmin",
"roles/orgpolicy.policyAdmin",
- module.organization.custom_role_id.xpnServiceAdmin
],
local.billing_org ? [
"roles/billing.admin",
diff --git a/fast/stages/00-bootstrap/outputs.tf b/fast/stages/00-bootstrap/outputs.tf
index 8912fb873..d07fdf19d 100644
--- a/fast/stages/00-bootstrap/outputs.tf
+++ b/fast/stages/00-bootstrap/outputs.tf
@@ -42,6 +42,12 @@ locals {
organization = var.organization
prefix = var.prefix
})
+ "02-networking-nva" = jsonencode({
+ billing_account_id = var.billing_account.id
+ custom_roles = module.organization.custom_role_id
+ organization = var.organization
+ prefix = var.prefix
+ })
"02-security" = jsonencode({
billing_account_id = var.billing_account.id
organization = var.organization
diff --git a/fast/stages/01-resman/README.md b/fast/stages/01-resman/README.md
index 50f8edaf5..b83c17a08 100644
--- a/fast/stages/01-resman/README.md
+++ b/fast/stages/01-resman/README.md
@@ -175,12 +175,12 @@ Due to its simplicity, this stage lends itself easily to customizations: adding
| name | description | sensitive | consumers |
|---|---|:---:|---|
-| [networking](outputs.tf#L79) | Data for the networking stage. | | 02-networking |
-| [project_factories](outputs.tf#L89) | Data for the project factories stage. | | xx-teams |
-| [providers](outputs.tf#L106) | Terraform provider files for this stage and dependent stages. | ✓ | 02-networking · 02-security · xx-sandbox · xx-teams |
-| [sandbox](outputs.tf#L113) | Data for the sandbox stage. | | xx-sandbox |
-| [security](outputs.tf#L123) | Data for the networking stage. | | 02-security |
-| [teams](outputs.tf#L133) | Data for the teams stage. | | |
-| [tfvars](outputs.tf#L146) | Terraform variable files for the following stages. | ✓ | |
+| [networking](outputs.tf#L88) | Data for the networking stage. | | 02-networking |
+| [project_factories](outputs.tf#L98) | Data for the project factories stage. | | xx-teams |
+| [providers](outputs.tf#L115) | Terraform provider files for this stage and dependent stages. | ✓ | 02-networking · 02-security · xx-sandbox · xx-teams |
+| [sandbox](outputs.tf#L122) | Data for the sandbox stage. | | xx-sandbox |
+| [security](outputs.tf#L132) | Data for the networking stage. | | 02-security |
+| [teams](outputs.tf#L142) | Data for the teams stage. | | |
+| [tfvars](outputs.tf#L155) | Terraform variable files for the following stages. | ✓ | |
diff --git a/fast/stages/01-resman/outputs.tf b/fast/stages/01-resman/outputs.tf
index 67fce0bc1..9edaf64ff 100644
--- a/fast/stages/01-resman/outputs.tf
+++ b/fast/stages/01-resman/outputs.tf
@@ -25,16 +25,16 @@ locals {
name = "networking"
sa = module.branch-network-sa.email
})
+ "02-networking-nva" = templatefile("${path.module}/../../assets/templates/providers.tpl", {
+ bucket = module.branch-network-gcs.name
+ name = "networking-nva"
+ sa = module.branch-network-sa.email
+ })
"02-security" = templatefile("${path.module}/../../assets/templates/providers.tpl", {
bucket = module.branch-security-gcs.name
name = "security"
sa = module.branch-security-sa.email
})
- "99-sandbox" = templatefile("${path.module}/../../assets/templates/providers.tpl", {
- bucket = module.branch-sandbox-gcs.name
- name = "sandbox"
- sa = module.branch-sandbox-sa.email
- })
"03-project-factory-dev" = templatefile("${path.module}/../../assets/templates/providers.tpl", {
bucket = module.branch-teams-dev-projectfactory-gcs.name
name = "team-dev"
@@ -45,12 +45,21 @@ locals {
name = "team-prod"
sa = module.branch-teams-prod-projectfactory-sa.email
})
+ "99-sandbox" = templatefile("${path.module}/../../assets/templates/providers.tpl", {
+ bucket = module.branch-sandbox-gcs.name
+ name = "sandbox"
+ sa = module.branch-sandbox-sa.email
+ })
}
tfvars = {
"02-networking" = jsonencode({
folder_id = module.branch-network-folder.id
project_factory_sa = local._project_factory_sas
})
+ "02-networkin-nva" = jsonencode({
+ folder_id = module.branch-network-folder.id
+ project_factory_sa = local._project_factory_sas
+ })
"02-security" = jsonencode({
folder_id = module.branch-security-folder.id
kms_restricted_admins = {
diff --git a/fast/stages/README.md b/fast/stages/README.md
index df9d5bef9..1c5a8144e 100644
--- a/fast/stages/README.md
+++ b/fast/stages/README.md
@@ -17,8 +17,8 @@ Refer to each stage's documentation for a detailed description of its purpose, t
- [Security](02-security/README.md)
Manages centralized security configurations in a separate stage, and is typically owned by the security team. This stage implements VPC Security Controls via separate perimeters for environments and central services, and creates projects to host centralized KMS keys used by the whole organization. It's meant to be easily extended to include other security-related resources which are required, like Secret Manager.
-- [Networking](02-networking/README.md)
- Manages centralized network resources in a separate stage, and is typically owned by the networking team. This stage implements a hub-and-spoke design, and includes connectivity via VPN to on-premises, and YAML-based factories for firewall rules (hierarchical and VPC-level) and subnets.
+- Networking ([VPN](02-networking/README.md)/[NVA](02-networking-nva/README.md))
+ Manages centralized network resources in a separate stage, and is typically owned by the networking team. This stage implements a hub-and-spoke design, and includes connectivity via VPN to on-premises, and YAML-based factories for firewall rules (hierarchical and VPC-level) and subnets. It's currently available in two versions: [spokes connected via VPN](02-networking/README.md), [and spokes connected via appliances](02-networking-nva/README.md).
## Environment-level resources (03)
diff --git a/modules/folder/README.md b/modules/folder/README.md
index 569394ca3..e41dcb5bf 100644
--- a/modules/folder/README.md
+++ b/modules/folder/README.md
@@ -223,11 +223,11 @@ module "folder2" {
| name | description | resources |
|---|---|---|
-| [firewal_policies.tf](./firewal_policies.tf) | None | google_compute_firewall_policy · google_compute_firewall_policy_association · google_compute_firewall_policy_rule |
+| [firewall-policies.tf](./firewall-policies.tf) | None | google_compute_firewall_policy · google_compute_firewall_policy_association · google_compute_firewall_policy_rule |
| [iam.tf](./iam.tf) | IAM bindings, roles and audit logging resources. | google_folder_iam_binding |
| [logging.tf](./logging.tf) | Log sinks and supporting resources. | google_bigquery_dataset_iam_member · google_logging_folder_exclusion · google_logging_folder_sink · google_project_iam_member · google_pubsub_topic_iam_member · google_storage_bucket_iam_member |
| [main.tf](./main.tf) | Module-level locals and resources. | google_essential_contacts_contact · google_folder |
-| [organization_policies.tf](./organization_policies.tf) | Folder-level organization policies. | google_folder_organization_policy |
+| [organization-policies.tf](./organization-policies.tf) | Folder-level organization policies. | google_folder_organization_policy |
| [outputs.tf](./outputs.tf) | Module outputs. | |
| [variables.tf](./variables.tf) | Module variables. | |
| [versions.tf](./versions.tf) | Version pins. | |
diff --git a/modules/folder/firewal_policies.tf b/modules/folder/firewall-policies.tf
similarity index 100%
rename from modules/folder/firewal_policies.tf
rename to modules/folder/firewall-policies.tf
diff --git a/modules/folder/organization_policies.tf b/modules/folder/organization-policies.tf
similarity index 100%
rename from modules/folder/organization_policies.tf
rename to modules/folder/organization-policies.tf
diff --git a/modules/net-glb/README.md b/modules/net-glb/README.md
index 5fd19d5a8..e59fee2a9 100644
--- a/modules/net-glb/README.md
+++ b/modules/net-glb/README.md
@@ -499,13 +499,13 @@ An External Global Load Balancer is made of multiple components, that change dep
| name | description | resources |
|---|---|---|
-| [backend_services.tf](./backend_services.tf) | Bucket and group backend services. | google_compute_backend_bucket · google_compute_backend_service |
-| [global_forwarding_rule.tf](./global_forwarding_rule.tf) | Global address and forwarding rule. | google_compute_global_address · google_compute_global_forwarding_rule |
-| [health_checks.tf](./health_checks.tf) | Health checks. | google_compute_health_check |
+| [backend-services.tf](./backend-services.tf) | Bucket and group backend services. | google_compute_backend_bucket · google_compute_backend_service |
+| [global-forwarding-rule.tf](./global-forwarding-rule.tf) | Global address and forwarding rule. | google_compute_global_address · google_compute_global_forwarding_rule |
+| [health-checks.tf](./health-checks.tf) | Health checks. | google_compute_health_check |
| [outputs.tf](./outputs.tf) | Module outputs. | |
-| [ssl_certificates.tf](./ssl_certificates.tf) | SSL certificates. | google_compute_managed_ssl_certificate · google_compute_ssl_certificate |
-| [target_proxy.tf](./target_proxy.tf) | HTTP and HTTPS target proxies. | google_compute_target_http_proxy · google_compute_target_https_proxy |
-| [url_map.tf](./url_map.tf) | URL maps. | google_compute_url_map |
+| [ssl-certificates.tf](./ssl-certificates.tf) | SSL certificates. | google_compute_managed_ssl_certificate · google_compute_ssl_certificate |
+| [target-proxy.tf](./target-proxy.tf) | HTTP and HTTPS target proxies. | google_compute_target_http_proxy · google_compute_target_https_proxy |
+| [url-map.tf](./url-map.tf) | URL maps. | google_compute_url_map |
| [variables.tf](./variables.tf) | Module variables. | |
| [versions.tf](./versions.tf) | Version pins. | |
diff --git a/modules/net-glb/backend_services.tf b/modules/net-glb/backend-services.tf
similarity index 100%
rename from modules/net-glb/backend_services.tf
rename to modules/net-glb/backend-services.tf
diff --git a/modules/net-glb/global_forwarding_rule.tf b/modules/net-glb/global-forwarding-rule.tf
similarity index 100%
rename from modules/net-glb/global_forwarding_rule.tf
rename to modules/net-glb/global-forwarding-rule.tf
diff --git a/modules/net-glb/health_checks.tf b/modules/net-glb/health-checks.tf
similarity index 100%
rename from modules/net-glb/health_checks.tf
rename to modules/net-glb/health-checks.tf
diff --git a/modules/net-glb/ssl_certificates.tf b/modules/net-glb/ssl-certificates.tf
similarity index 100%
rename from modules/net-glb/ssl_certificates.tf
rename to modules/net-glb/ssl-certificates.tf
diff --git a/modules/net-glb/target_proxy.tf b/modules/net-glb/target-proxy.tf
similarity index 100%
rename from modules/net-glb/target_proxy.tf
rename to modules/net-glb/target-proxy.tf
diff --git a/modules/net-glb/url_map.tf b/modules/net-glb/url-map.tf
similarity index 100%
rename from modules/net-glb/url_map.tf
rename to modules/net-glb/url-map.tf
diff --git a/modules/organization/README.md b/modules/organization/README.md
index 3fd0d1bf0..a7f79d7b9 100644
--- a/modules/organization/README.md
+++ b/modules/organization/README.md
@@ -243,11 +243,11 @@ module "org" {
| name | description | resources |
|---|---|---|
-| [firewall_policies.tf](./firewall_policies.tf) | Hierarchical firewall policies. | google_compute_firewall_policy · google_compute_firewall_policy_association · google_compute_firewall_policy_rule |
+| [firewall-policies.tf](./firewall-policies.tf) | Hierarchical firewall policies. | google_compute_firewall_policy · google_compute_firewall_policy_association · google_compute_firewall_policy_rule |
| [iam.tf](./iam.tf) | IAM bindings, roles and audit logging resources. | google_organization_iam_audit_config · google_organization_iam_binding · google_organization_iam_custom_role · google_organization_iam_member · google_organization_iam_policy |
| [logging.tf](./logging.tf) | Log sinks and supporting resources. | google_bigquery_dataset_iam_member · google_logging_organization_exclusion · google_logging_organization_sink · google_project_iam_member · google_pubsub_topic_iam_member · google_storage_bucket_iam_member |
| [main.tf](./main.tf) | Module-level locals and resources. | google_essential_contacts_contact |
-| [organization_policies.tf](./organization_policies.tf) | Organization-level organization policies. | google_organization_policy |
+| [organization-policies.tf](./organization-policies.tf) | Organization-level organization policies. | google_organization_policy |
| [outputs.tf](./outputs.tf) | Module outputs. | |
| [variables.tf](./variables.tf) | Module variables. | |
| [versions.tf](./versions.tf) | Version pins. | |
diff --git a/modules/organization/firewall_policies.tf b/modules/organization/firewall-policies.tf
similarity index 100%
rename from modules/organization/firewall_policies.tf
rename to modules/organization/firewall-policies.tf
diff --git a/modules/organization/organization_policies.tf b/modules/organization/organization-policies.tf
similarity index 100%
rename from modules/organization/organization_policies.tf
rename to modules/organization/organization-policies.tf
diff --git a/modules/project/README.md b/modules/project/README.md
index d10953efd..ae91cf2bd 100644
--- a/modules/project/README.md
+++ b/modules/project/README.md
@@ -184,13 +184,13 @@ module "project" {
| [iam.tf](./iam.tf) | Generic and OSLogin-specific IAM bindings and roles. | google_project_iam_binding · google_project_iam_custom_role · google_project_iam_member |
| [logging.tf](./logging.tf) | Log sinks and supporting resources. | google_bigquery_dataset_iam_member · google_logging_project_exclusion · google_logging_project_sink · google_project_iam_member · google_pubsub_topic_iam_member · google_storage_bucket_iam_member |
| [main.tf](./main.tf) | Module-level locals and resources. | google_compute_project_metadata_item · google_essential_contacts_contact · google_monitoring_monitored_project · google_project · google_project_service · google_resource_manager_lien |
-| [organization_policies.tf](./organization_policies.tf) | Project-level organization policies. | google_project_organization_policy |
+| [organization-policies.tf](./organization-policies.tf) | Project-level organization policies. | google_project_organization_policy |
| [outputs.tf](./outputs.tf) | Module outputs. | |
-| [service_accounts.tf](./service_accounts.tf) | Service identities and supporting resources. | google_kms_crypto_key_iam_member · google_project_service_identity |
-| [shared_vpc.tf](./shared_vpc.tf) | Shared VPC project-level configuration. | google_compute_shared_vpc_host_project · google_compute_shared_vpc_service_project |
+| [service-accounts.tf](./service-accounts.tf) | Service identities and supporting resources. | google_kms_crypto_key_iam_member · google_project_service_identity |
+| [shared-vpc.tf](./shared-vpc.tf) | Shared VPC project-level configuration. | google_compute_shared_vpc_host_project · google_compute_shared_vpc_service_project |
| [variables.tf](./variables.tf) | Module variables. | |
| [versions.tf](./versions.tf) | Version pins. | |
-| [vpc_sc.tf](./vpc_sc.tf) | VPC-SC project-level perimeter configuration. | google_access_context_manager_service_perimeter_resource |
+| [vpc-sc.tf](./vpc-sc.tf) | VPC-SC project-level perimeter configuration. | google_access_context_manager_service_perimeter_resource |
## Variables
diff --git a/modules/project/organization_policies.tf b/modules/project/organization-policies.tf
similarity index 100%
rename from modules/project/organization_policies.tf
rename to modules/project/organization-policies.tf
diff --git a/modules/project/service_accounts.tf b/modules/project/service-accounts.tf
similarity index 100%
rename from modules/project/service_accounts.tf
rename to modules/project/service-accounts.tf
diff --git a/modules/project/shared_vpc.tf b/modules/project/shared-vpc.tf
similarity index 100%
rename from modules/project/shared_vpc.tf
rename to modules/project/shared-vpc.tf
diff --git a/modules/project/vpc_sc.tf b/modules/project/vpc-sc.tf
similarity index 100%
rename from modules/project/vpc_sc.tf
rename to modules/project/vpc-sc.tf
diff --git a/modules/vpc-sc/access_levels.tf b/modules/vpc-sc/access-levels.tf
similarity index 100%
rename from modules/vpc-sc/access_levels.tf
rename to modules/vpc-sc/access-levels.tf
diff --git a/modules/vpc-sc/service_perimeters_bridge.tf b/modules/vpc-sc/service-perimeters-bridge.tf
similarity index 100%
rename from modules/vpc-sc/service_perimeters_bridge.tf
rename to modules/vpc-sc/service-perimeters-bridge.tf
diff --git a/modules/vpc-sc/service_perimeters_regular.tf b/modules/vpc-sc/service-perimeters-regular.tf
similarity index 100%
rename from modules/vpc-sc/service_perimeters_regular.tf
rename to modules/vpc-sc/service-perimeters-regular.tf