{"id":30876327,"url":"https://github.com/howdoicomputer/tf-polarstomps-gcp-environment","last_synced_at":"2026-02-22T20:40:54.301Z","repository":{"id":259822823,"uuid":"879513354","full_name":"howdoicomputer/tf-polarstomps-gcp-environment","owner":"howdoicomputer","description":"A Terraform module to deploy an environment for Polarstomps.","archived":false,"fork":false,"pushed_at":"2024-10-31T16:16:15.000Z","size":128,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-08T02:22:34.448Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/howdoicomputer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-28T03:38:31.000Z","updated_at":"2024-10-31T16:16:19.000Z","dependencies_parsed_at":"2024-10-28T07:12:11.948Z","dependency_job_id":"c40ece8f-aa67-4e23-a0f6-bffd6b9e05ae","html_url":"https://github.com/howdoicomputer/tf-polarstomps-gcp-environment","commit_stats":null,"previous_names":["howdoicomputer/tf-polarstomps-gcp-environment"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/howdoicomputer/tf-polarstomps-gcp-environment","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howdoicomputer%2Ftf-polarstomps-gcp-environment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howdoicomputer%2Ftf-polarstomps-gcp-environment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howdoicomputer%2Ftf-polarstomps-gcp-environment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howdoicomputer%2Ftf-polarstomps-gcp-environment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/howdoicomputer","download_url":"https://codeload.github.com/howdoicomputer/tf-polarstomps-gcp-environment/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howdoicomputer%2Ftf-polarstomps-gcp-environment/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281520722,"owners_count":26515681,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-09-08T02:08:54.916Z","updated_at":"2025-10-28T21:52:47.877Z","avatar_url":"https://github.com/howdoicomputer.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Polarstomps GCP Environment Terraform Module\n\n## About\n\nThis Terraform module is used to provision an opinionated GCP environment for the Polarstomps web application. It deploys all resources in **us-west1** by default.\n\nIt will deploy:\n\n* A VPC with a public and private subnet\n* A VPC route that allows egress to the Internet\n* Firewall rules to enable ingress from a \"home\" IP address\n* A [Cloud Router](https://cloud.google.com/network-connectivity/docs/router/concepts/overview) and a [Cloud Nat](https://cloud.google.com/nat/docs/overview) in order to enable routing to a private GKE cluster\n* A GKE/Kubernetes autopilot cluster that has private nodes and a public control plane endpoint (that is locked down to that same \"home\" IP address)\n\nThe philosphy of this module is that it enforces a set of hypothetical standards for an organization - i.e, the Polarstomps organization. It assumes that environments would be relatively homogenous and so works to enforce a set of defaults in order to minimize the need for creating wrapper modules to set inputs.\n\nHowever, it also gives you an escape hatch for customizing the underlying environment. For the average instantiation, the only real inputs are an environment string (dev/stage/prod) and subnet cidrs.\n\n### One Cluster One Environment\n\nThis module defines a logical environment as \"one GKE cluster in one VPC.\" This is fairly simplistic but so are the needs of the Polarstomps web application. If you need multiple clusters per environment (say you want a cluster solely dedicated to processing HIPAA or PII data) then this module isn't for you. It would need to be refactored so that the GKE cluster is its own module. For now, centralizing the GKE cluster and the VPC into a single module helps with code maintainability.\n\n### Autopilot vs Standard GKE\n\nAutopilot is pretty neat. It is the recommended way of deploying Kubernetes in GCP now and, honestly, simplifies administration quite a bit. This means there are no node pools managed by this module.\n\nAutopilot knows which worker nodes (and GPUs) are needed by your application by looking at the `nodeSelector` for a manifest and then provisioning the right type of node for your workload.\n\nIf you need a standard GKE cluster then this module is not for you.\n\nSome use cases for a standard GKE cluster:\n\n* Your one true passion in life is to manage node pools for a Kubernetes cluster\n\n### Network Layout\n\nBy default, this module creates the below diagram:\n\n![image](images/environment_basic.png)\n\n## Post Cluster Creation\n\nYou can populate your `~/.kube/config` with auth details for the provisioned cluster by running: `gcloud container clusters get-credentials $(terragrunt output -raw gke_cluster_name) --zone us-west1`. If you customize the region then you'll need to change the shell command.\n\nAfter you setup your kubeconfig, you can then bootstrap ArgoCD like so:\n\n``` sh\nkubectl create namespace argocd\nkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml\n```\n\nAnd then to login to it you:\n\n``` sh\nkubectl config set-context --current --namespace argocd\nargocd login --core\nargocd admin initial-password -n argocd\n```\n\nThen port forward into the ArgoCD UI with `kubectl port-forward svc/argocd-server -n argocd 8080:443` and then use the password generated from the above shell to get to the good stuff.\n\n### Customization and Usage\n\nAn example of using this module is in the [polarstomps-infra-gcp]() repository as its used to deploy the dev and prod environments.\n\nThe most basic usage looks like this:\n\n``` terraform\nmodule \"prod\" {\n  source              = \"github.com/howdoicomputer/tf-polarstomps-gcp-environment?ref=v1\"\n  env                 = \"prod\"\n  project_id          = \"REPLACE_ME\"\n  public_subnet_cidr  = \"10.10.40.0/26\"\n  private_subnet_cidr = \"10.10.50.0/26\"\n  control_plane_cidr  = \"10.10.60.0/28\"\n  \n  # The IP address that is allowed to contact the GKE control plane.\n  #\n  # It's also allowed to SSH into the public subnet by default.\n  #\n  my_ip_address       = \"1.1.1.1/32\"\n}\n```\n\nNote, this module makes copious use of the `coalesce` and `coalescelist` functions in order to make the tradeoff of DRY module instantiation with slightly obscured defaults.\n\nGenerally, this means that any list of objects has a default defined in the `locals` block of `main.tf` rather than the defaults of `variables.tf`.\n\n#### Customizing Firewall Rules Example\n\n``` terraform\nmodule \"environment\" {\n  env                 = \"prod\"\n  public_subnet_cidr  = \"10.10.40.0/26\"\n  private_subnet_cidr = \"10.10.50.0/26\"\n  control_plane_cidr  = \"10.10.60.0/28\"\n  \n  # Disable ingress on 22 for a home address\n  #\n  # If this is set to true and my_ip_address\n  # is defined then a 22 ingress rule would be\n  # created for the public_subnet_cidr.\n  #\n  vpc_enable_my_ip_ingress_rule = false\n  \n  # We still need to set an IP address for the public control plane even if\n  # we're not using that same address to SSH into the public subnet.\n  #\n  my_ip_address = \"1.1.1.1/32\"\n  \n  # Define your own rules. You rebel you.\n  #\n  vpc_firewall_rules = [\n    {\n      name               = \"foobar\"\n      description        = \"foobar\"\n      direction          = \"INGRESS\"\n      priority           = 0\n      destination_ranges = [\"0.0.0.0/26\"]\n      source_ranges      = [\"1.1.1.1/32\"]\n      \n      allow = [{\n        protocol = \"tcp\"\n        ports    = [\"22\"]\n      }]\n    }\n  ]\n}\n```\n\n#### Customizing VPC Subnets Example\n\n``` terraform\nmodule \"environment\" {\n  env = \"prod\"\n \n  # The node subnet name and the private subnet name need to match\n  #\n  # Or, really, the subnet name that you want the GKE worker nodes to be\n  # created in needs to match the private subnet name. The worker pools\n  # have to live somewhere and you get to choose where. You caregiver you.\n  #\n  gke_node_subnet_name = \"private\"\n  \n  vpc_subnets = [\n    {\n      subnet_name   = \"public\"\n      subnet_ip     = \"10.0.10.0/26\"\n      subnet_region = \"us-west1\"\n      description   = \"foobar\"\n    },\n    {\n      subnet_name   = \"private\"\n      subnet_ip     = \"10.0.20.0/26\"\n      subnet_region = \"us-west1\"\n      description   = \"foobar\"\n    }\n  ]\n}\n```\n\n#### Customizing VPC Routes Example\n\n``` terraform\nmodule \"environment\" {\n  env = \"prod\"\n  \n  vpc_routes = [{\n    name              = \"egress\"\n    description       = \"egress\"\n    destination_range = \"0.0.0.0/0\"\n    tags              = \"egress-inet\"\n    next_hop_internet = \"true\"\n  }]\n}\n```\n\n#### Contact\n\nNo Terraform module is perfect. Terraform, as a language, is frought with peril. If you need help setting this up then don't hesitate to ping me.\n\n#### Testing\n\nThis module uses [Terratest](https://terratest.gruntwork.io/). The example configurations it tests are in `/examples`.\n\n``` terraform\nexport TF_VAR_MY_IP_ADDRESS=foobar/32\nexport TF_VAR_PROJECT_ID=pid\n\ncd ./test\ngo test\n```\n\nIn order to automate the above environment variables, feel free to use an `.envrc` file. An example is provided in the root of this repo.\n\n# Terraform-docs\n\nThe below is generated by [terraform-docs](https://terraform-docs.io/). The defaults column of the inputs should be taken with a grain of salt after reading the above.\n\n## Requirements\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"requirement_terraform\"\u003e\u003c/a\u003e [terraform](#requirement\\_terraform) | \u003e=1.3 |\n| \u003ca name=\"requirement_google\"\u003e\u003c/a\u003e [google](#requirement\\_google) | \u003e= 5.40.0, != 5.44.0, != 6.2.0, != 6.3.0, \u003c 7 |\n\n## Providers\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"provider_google\"\u003e\u003c/a\u003e [google](#provider\\_google) | \u003e= 5.40.0, != 5.44.0, != 6.2.0, != 6.3.0, \u003c 7 |\n\n## Modules\n\n| Name | Source | Version |\n|------|--------|---------|\n| \u003ca name=\"module_firewall_rules\"\u003e\u003c/a\u003e [firewall\\_rules](#module\\_firewall\\_rules) | terraform-google-modules/network/google//modules/firewall-rules | ~\u003e 9.0.0 |\n| \u003ca name=\"module_gke_cluster\"\u003e\u003c/a\u003e [gke\\_cluster](#module\\_gke\\_cluster) | terraform-google-modules/kubernetes-engine/google//modules/beta-autopilot-private-cluster | ~\u003e 33.0 |\n| \u003ca name=\"module_routes\"\u003e\u003c/a\u003e [routes](#module\\_routes) | terraform-google-modules/network/google//modules/routes | ~\u003e 9.0.0 |\n| \u003ca name=\"module_subnets\"\u003e\u003c/a\u003e [subnets](#module\\_subnets) | terraform-google-modules/network/google//modules/subnets | ~\u003e 9.0.0 |\n| \u003ca name=\"module_vpc\"\u003e\u003c/a\u003e [vpc](#module\\_vpc) | terraform-google-modules/network/google//modules/vpc | ~\u003e 9.0.0 |\n\n## Resources\n\n| Name | Type |\n|------|------|\n| [google_compute_router.router](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_router) | resource |\n| [google_compute_router_nat.nat](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_router_nat) | resource |\n| [google_client_config.default](https://registry.terraform.io/providers/hashicorp/google/latest/docs/data-sources/client_config) | data source |\n\n## Inputs\n\n| Name | Description | Type | Default | Required |\n|------|-------------|------|---------|:--------:|\n| \u003ca name=\"input_env\"\u003e\u003c/a\u003e [env](#input\\_env) | What to name a logical environment | `string` | n/a | yes |\n| \u003ca name=\"input_gke_control_plane_cidr\"\u003e\u003c/a\u003e [gke\\_control\\_plane\\_cidr](#input\\_gke\\_control\\_plane\\_cidr) | The cidr block for the GKE control plane. | `string` | `\"10.10.30.0/28\"` | no |\n| \u003ca name=\"input_gke_deletion_protection\"\u003e\u003c/a\u003e [gke\\_deletion\\_protection](#input\\_gke\\_deletion\\_protection) | Deletino protection. I'm not made of money so this is false by default. | `string` | `false` | no |\n| \u003ca name=\"input_gke_enable_private_endpoint\"\u003e\u003c/a\u003e [gke\\_enable\\_private\\_endpoint](#input\\_gke\\_enable\\_private\\_endpoint) | Whether or not to make the control plane endpoint private to a subnet | `string` | `false` | no |\n| \u003ca name=\"input_gke_enable_private_nodes\"\u003e\u003c/a\u003e [gke\\_enable\\_private\\_nodes](#input\\_gke\\_enable\\_private\\_nodes) | Hide them nodes. | `string` | `true` | no |\n| \u003ca name=\"input_gke_enable_vertical_pod_autoscaling\"\u003e\u003c/a\u003e [gke\\_enable\\_vertical\\_pod\\_autoscaling](#input\\_gke\\_enable\\_vertical\\_pod\\_autoscaling) | Enabling GKE vertical pod autoscaling. | `bool` | `true` | no |\n| \u003ca name=\"input_gke_horizontal_pod_autoscaling\"\u003e\u003c/a\u003e [gke\\_horizontal\\_pod\\_autoscaling](#input\\_gke\\_horizontal\\_pod\\_autoscaling) | Enabling GKE horizontal pod autoscaling. | `bool` | `true` | no |\n| \u003ca name=\"input_gke_kubernetes_version\"\u003e\u003c/a\u003e [gke\\_kubernetes\\_version](#input\\_gke\\_kubernetes\\_version) | Which Kubernetes version to use for the cluster. | `string` | `\"latest\"` | no |\n| \u003ca name=\"input_gke_master_authorized_networks\"\u003e\u003c/a\u003e [gke\\_master\\_authorized\\_networks](#input\\_gke\\_master\\_authorized\\_networks) | Use to override the default ingress rule that is constructed from var.my\\_ip\\_address | \u003cpre\u003elist(object({\u003cbr/\u003e    cidr_block   = string\u003cbr/\u003e    display_name = string\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_gke_network_tags\"\u003e\u003c/a\u003e [gke\\_network\\_tags](#input\\_gke\\_network\\_tags) | GKE network tags. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_gke_node_subnet_name\"\u003e\u003c/a\u003e [gke\\_node\\_subnet\\_name](#input\\_gke\\_node\\_subnet\\_name) | The subnet name for nodes created by GKE autopilot | `string` | n/a | yes |\n| \u003ca name=\"input_gke_pods_range_cidr\"\u003e\u003c/a\u003e [gke\\_pods\\_range\\_cidr](#input\\_gke\\_pods\\_range\\_cidr) | The cidr block for the GKE pods | `string` | `\"192.168.0.0/18\"` | no |\n| \u003ca name=\"input_gke_release_channel\"\u003e\u003c/a\u003e [gke\\_release\\_channel](#input\\_gke\\_release\\_channel) | The release channel for GKE versions | `string` | `\"REGULAR\"` | no |\n| \u003ca name=\"input_gke_svc_range_cidr\"\u003e\u003c/a\u003e [gke\\_svc\\_range\\_cidr](#input\\_gke\\_svc\\_range\\_cidr) | The cidr block for GKE services | `string` | `\"192.168.64.0/18\"` | no |\n| \u003ca name=\"input_my_ip_address\"\u003e\u003c/a\u003e [my\\_ip\\_address](#input\\_my\\_ip\\_address) | A source IP used to connect to the k8s control plane | `string` | n/a | yes |\n| \u003ca name=\"input_nat_ip_allocate_option\"\u003e\u003c/a\u003e [nat\\_ip\\_allocate\\_option](#input\\_nat\\_ip\\_allocate\\_option) | https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_router_nat#nat_ip_allocate_option | `string` | `\"AUTO_ONLY\"` | no |\n| \u003ca name=\"input_nat_source_subnetwork_ip_ranges_to_nat\"\u003e\u003c/a\u003e [nat\\_source\\_subnetwork\\_ip\\_ranges\\_to\\_nat](#input\\_nat\\_source\\_subnetwork\\_ip\\_ranges\\_to\\_nat) | https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_router_nat#source_subnetwork_ip_ranges_to_nat | `string` | `\"ALL_SUBNETWORKS_ALL_IP_RANGES\"` | no |\n| \u003ca name=\"input_project_id\"\u003e\u003c/a\u003e [project\\_id](#input\\_project\\_id) | n/a | `string` | n/a | yes |\n| \u003ca name=\"input_region\"\u003e\u003c/a\u003e [region](#input\\_region) | n/a | `string` | `\"us-west1\"` | no |\n| \u003ca name=\"input_vpc_auto_create_subnets\"\u003e\u003c/a\u003e [vpc\\_auto\\_create\\_subnets](#input\\_vpc\\_auto\\_create\\_subnets) | Whether or not to automatically create VPC subnets. This should almost always be off. | `bool` | `false` | no |\n| \u003ca name=\"input_vpc_enable_my_ip_ingress_rule\"\u003e\u003c/a\u003e [vpc\\_enable\\_my\\_ip\\_ingress\\_rule](#input\\_vpc\\_enable\\_my\\_ip\\_ingress\\_rule) | Whether or not to create an ingress rule for a home IP address. Is added to var.vpc\\_firewall\\_rules. If set then you need to set var.vpc\\_public\\_subnet\\_cidr to your public subnet cidr block. | `bool` | `true` | no |\n| \u003ca name=\"input_vpc_firewall_rules\"\u003e\u003c/a\u003e [vpc\\_firewall\\_rules](#input\\_vpc\\_firewall\\_rules) | Use to define firewall rules | \u003cpre\u003elist(object({\u003cbr/\u003e    name = string\u003cbr/\u003e    description        = string\u003cbr/\u003e    direction          = string\u003cbr/\u003e    priority           = number\u003cbr/\u003e    destination_ranges = list(string)\u003cbr/\u003e    source_ranges      = list(string)\u003cbr/\u003e\u003cbr/\u003e    allow = list(object({\u003cbr/\u003e      protocol = string\u003cbr/\u003e      ports    = list(string)\u003cbr/\u003e    }))\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_vpc_private_subnet_cidr\"\u003e\u003c/a\u003e [vpc\\_private\\_subnet\\_cidr](#input\\_vpc\\_private\\_subnet\\_cidr) | The cidr block for the private subnet | `string` | `\"10.10.20.0/26\"` | no |\n| \u003ca name=\"input_vpc_private_subnet_name\"\u003e\u003c/a\u003e [vpc\\_private\\_subnet\\_name](#input\\_vpc\\_private\\_subnet\\_name) | The name of the VPC private subnet. Default: infra-$(env)-private-01 | `string` | `\"\"` | no |\n| \u003ca name=\"input_vpc_private_subnet_secondary_ranges\"\u003e\u003c/a\u003e [vpc\\_private\\_subnet\\_secondary\\_ranges](#input\\_vpc\\_private\\_subnet\\_secondary\\_ranges) | Use to override the creation of secondary subnet ranges for GKE worker node allocations. | \u003cpre\u003elist(object({\u003cbr/\u003e    range_name    = string\u003cbr/\u003e    ip_cidr_range = string\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_vpc_public_subnet_cidr\"\u003e\u003c/a\u003e [vpc\\_public\\_subnet\\_cidr](#input\\_vpc\\_public\\_subnet\\_cidr) | The cidr block for the public subnet | `string` | `\"10.10.10.0/26\"` | no |\n| \u003ca name=\"input_vpc_public_subnet_name\"\u003e\u003c/a\u003e [vpc\\_public\\_subnet\\_name](#input\\_vpc\\_public\\_subnet\\_name) | The name of the VPC public subnet. Default: infra-$(env)-public-01 | `string` | `\"\"` | no |\n| \u003ca name=\"input_vpc_routes\"\u003e\u003c/a\u003e [vpc\\_routes](#input\\_vpc\\_routes) | Use to override the default VPC routes. | \u003cpre\u003elist(object({\u003cbr/\u003e    name              = string\u003cbr/\u003e    description       = string\u003cbr/\u003e    destination_range = string\u003cbr/\u003e    tags              = string\u003cbr/\u003e    next_hop_internet = string\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_vpc_routing_mode\"\u003e\u003c/a\u003e [vpc\\_routing\\_mode](#input\\_vpc\\_routing\\_mode) | https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_network#routing_mode | `string` | `\"GLOBAL\"` | no |\n| \u003ca name=\"input_vpc_shared_vpc_host\"\u003e\u003c/a\u003e [vpc\\_shared\\_vpc\\_host](#input\\_vpc\\_shared\\_vpc\\_host) | Whether or not to setup a VPC as a 'shared VPC.' | `bool` | `false` | no |\n| \u003ca name=\"input_vpc_subnets\"\u003e\u003c/a\u003e [vpc\\_subnets](#input\\_vpc\\_subnets) | Use to override the creation of the default subnets. There be dragons here. | \u003cpre\u003elist(object({\u003cbr/\u003e    subnet_name   = string\u003cbr/\u003e    subnet_ip     = string\u003cbr/\u003e    subnet_region = string\u003cbr/\u003e    description   = string\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n\n## Outputs\n\n| Name | Description |\n|------|-------------|\n| \u003ca name=\"output_gke_cluster_endpoint\"\u003e\u003c/a\u003e [gke\\_cluster\\_endpoint](#output\\_gke\\_cluster\\_endpoint) | n/a |\n| \u003ca name=\"output_gke_cluster_name\"\u003e\u003c/a\u003e [gke\\_cluster\\_name](#output\\_gke\\_cluster\\_name) | n/a |\n| \u003ca name=\"output_vpc_network_id\"\u003e\u003c/a\u003e [vpc\\_network\\_id](#output\\_vpc\\_network\\_id) | n/a |\n| \u003ca name=\"output_vpc_network_name\"\u003e\u003c/a\u003e [vpc\\_network\\_name](#output\\_vpc\\_network\\_name) | n/a |\n| \u003ca name=\"output_vpc_network_subnets\"\u003e\u003c/a\u003e [vpc\\_network\\_subnets](#output\\_vpc\\_network\\_subnets) | n/a |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowdoicomputer%2Ftf-polarstomps-gcp-environment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhowdoicomputer%2Ftf-polarstomps-gcp-environment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowdoicomputer%2Ftf-polarstomps-gcp-environment/lists"}