FAQ | Troubleshooting Guide | Glossary.
This module allows you to create opinionated Google Cloud Platform projects. It creates projects and configures aspects like Shared VPC connectivity, IAM access, Service Accounts, and API enablement to follow best practices.
To include G Suite integration for creating groups and adding Service Accounts into groups, use the gsuite_enabled module.
This module is meant for use with Terraform 1.3+ and tested using Terraform 1.10+. If you find incompatibilities using Terraform >= 1.3, please open an issue. If you haven't upgraded and need a Terraform 0.12.x-compatible version of this module, the last released version intended for Terraform 0.12.x is 9.2.0.
See the docs for detailed instructions on upgrading between major releases of the module.
There are multiple examples included in the examples folder but simple usage is as follows:
module "project-factory" { source = "terraform-google-modules/project-factory/google" version = "~> 18.0" name = "pf-test-1" random_project_id = true org_id = "1234567890" usage_bucket_name = "pf-test-1-usage-report-bucket" usage_bucket_prefix = "pf/test/1/integration" billing_account = "ABCDEF-ABCDEF-ABCDEF" svpc_host_project_id = "shared_vpc_host_name" shared_vpc_subnets = [ "projects/base-project-196723/regions/us-east1/subnetworks/default", "projects/base-project-196723/regions/us-central1/subnetworks/default", "projects/base-project-196723/regions/us-central1/subnetworks/subnet-1", ] }
The Project Factory module will take the following actions:
Create a new GCP project using the project_name
.
If a shared VPC is specified, attach the new project to the svpc_host_project_id
.
It will also give the following users network access on the specified subnets:
group_name
Delete the default compute service account.
Create a new default service account for the project.
Attach the billing account (billing_account
) to the project.
Give the controlling group access to the project, with the group_role
.
Enable the required and specified APIs (activate_apis
).
Delete the default network.
Enable usage report for GCE into central project bucket (target_usage_bucket
), if provided.
If specified, create the GCS bucket bucket_name
and give the following accounts Storage Admin on it:
group_name
).The roles granted are specifically:
compute.networkUser
on host project or specified subnetsstorage.admin
on bucket_name
GCS bucketgroup_name
is the controlling group
compute.networkUser
on host project or specific subnetsgroup_role
on projectiam.serviceAccountUser
on the default Service Accountstorage.admin
on bucket_name
GCS bucketcompute.networkUser
on host project or specified subnetsstorage.admin
on bucket_name
GCS bucketA service project's access to shared VPC networks is controlled via the roles/compute.networkUser
role and the location to where that role is assigned. If that role is assigned to the shared VPC host project, then the service project will have access to all shared VPC subnetworks. If that role is assigned to individual subnetworks, then the service project will have access to only the subnetworks on which that role was assigned. The logic for determining that location is as follows:
var.svpc_host_project_id
and var.shared_vpc_subnets
are not set then the compute.networkUser
role is not assignedvar.svpc_host_project_id
is set but no subnetworks are provided via var.shared_vpc_subnets
then the compute.networkUser
role is assigned at the host project and the service project will have access to all shared VPC subnetworksvar.svpc_host_project_id
is set and var.shared_vpc_subnets
contains an array of subnetworks then the compute.networkUser
role is assigned to each subnetwork in the arrayactivate_apis
.
list(object({
api = string
roles = list(string)
}))
[]
no activate_apis The list of apis to activate within the project list(string)
[no auto_create_network Create the default network
"compute.googleapis.com"
]
bool
false
no billing_account The ID of the billing account to associate this project with string
n/a yes bucket_force_destroy Force the deletion of all objects within the GCS bucket when deleting the bucket (optional) bool
false
no bucket_labels A map of key/value label pairs to assign to the bucket (optional) map(string)
{}
no bucket_location The location for a GCS bucket to create (optional) string
"US"
no bucket_name A name for a GCS bucket to create (in the bucket_project project), useful for Terraform state (optional) string
""
no bucket_pap Enable Public Access Prevention. Possible values are "enforced" or "inherited". string
"inherited"
no bucket_project A project to create a GCS bucket (bucket_name) in, useful for Terraform state (optional) string
""
no bucket_ula Enable Uniform Bucket Level Access bool
true
no bucket_versioning Enable versioning for a GCS bucket to create (optional) bool
false
no budget_alert_pubsub_topic The name of the Cloud Pub/Sub topic where budget related messages will be published, in the form of projects/{project_id}/topics/{topic_id}
string
null
no budget_alert_spend_basis The type of basis used to determine if spend has passed the threshold string
"CURRENT_SPEND"
no budget_alert_spent_percents A list of percentages of the budget to alert on when threshold is exceeded list(number)
[no budget_amount The amount to use for a budget alert
0.5,
0.7,
1
]
number
null
no budget_calendar_period Specifies the calendar period for the budget. Possible values are MONTH, QUARTER, YEAR, CALENDAR_PERIOD_UNSPECIFIED, CUSTOM. custom_period_start_date and custom_period_end_date must be set if CUSTOM string
null
no budget_custom_period_end_date Specifies the end date (DD-MM-YYYY) for the calendar_period CUSTOM string
null
no budget_custom_period_start_date Specifies the start date (DD-MM-YYYY) for the calendar_period CUSTOM string
null
no budget_display_name The display name of the budget. If not set defaults to `Budget For <projects[0] All Projects>` string
null
budget_labels A single label and value pair specifying that usage from only this set of labeled resources should be included in the budget. map(string)
{}
no budget_monitoring_notification_channels A list of monitoring notification channels in the form [projects/{project_id}/notificationChannels/{channel_id}]
. A maximum of 5 channels are allowed. list(string)
[]
no cloud_armor_tier Managed protection tier to be set. Possible values are: CA_STANDARD, CA_ENTERPRISE_PAYGO string
null
no consumer_quotas The quotas configuration you want to override for the project.
list(object({
service = string,
metric = string,
dimensions = map(string),
limit = string,
value = string,
}))
[]
no create_project_sa Whether the default service account for the project shall be created bool
true
no default_network_tier Default Network Service Tier for resources created in this project. If unset, the value will not be modified. See https://cloud.google.com/network-tiers/docs/using-network-service-tiers and https://cloud.google.com/network-tiers. string
""
no default_service_account Project default service account setting: can be one of delete
, deprivilege
, disable
, or keep
. string
"disable"
no deletion_policy The deletion policy for the project. Possible values are: DELETE, PREVENT string
"PREVENT"
no disable_dependent_services Whether services that are enabled and which depend on this service should also be disabled when this service is destroyed. bool
true
no disable_services_on_destroy Whether project services will be disabled when the resources are destroyed bool
true
no domain The domain name (optional). string
""
no enable_shared_vpc_host_project If this project is a shared VPC host project. If true, you must not set svpc_host_project_id variable. Default is false. bool
false
no essential_contacts A mapping of users or groups to be assigned as Essential Contacts to the project, specifying a notification category map(list(string))
{}
no folder_id The ID of a folder to host this project string
""
no grant_network_role Whether or not to grant networkUser role on the host project/subnets bool
true
no grant_services_security_admin_role Whether or not to grant Kubernetes Engine Service Agent the Security Admin role on the host project so it can manage firewall rules bool
false
no group_name A group to control the project by being assigned group_role (defaults to project editor) string
""
no group_role The role to give the controlling group (group_name) over the project (defaults to project editor) string
"roles/editor"
no labels Map of labels for project map(string)
{}
no language_tag Language code to be used for essential contacts notifications string
"en-US"
no lien Add a lien on the project to prevent accidental deletion bool
false
no name The name for the project string
n/a yes org_id The organization ID. string
null
no project_id The ID to give the project. If not provided, the name
will be used. string
""
no project_sa_description Description to set for the project default service account. string
null
no project_sa_name Default service account name for the project. string
"project-service-account"
no random_project_id Adds a suffix of 4 random characters to the project_id
. bool
false
no random_project_id_length Sets the length of random_project_id
to the provided length, and uses a random_string
for a larger collusion domain. Recommended for use with CI. number
null
no sa_role A role to give the default Service Account for the project (defaults to none) string
""
no shared_vpc_subnets List of subnets fully qualified subnet IDs (ie. projects/$project_id/regions/$region/subnetworks/$subnet_id) list(string)
[]
no svpc_host_project_id The ID of the host project which hosts the shared VPC string
""
no tag_binding_values Tag values to bind the project to. list(string)
[]
no usage_bucket_name Name of a GCS bucket to store GCE usage reports in (optional) string
""
no usage_bucket_prefix Prefix in the GCS bucket to store GCE usage reports in (optional) string
""
no vpc_service_control_attach_dry_run Whether the project will be attached to a VPC Service Control Perimeter in Dry Run Mode. vpc_service_control_attach_enabled should be false for this to be true bool
false
no vpc_service_control_attach_enabled Whether the project will be attached to a VPC Service Control Perimeter in ENFORCED MODE. vpc_service_control_attach_dry_run should be false for this to be true bool
false
no vpc_service_control_perimeter_name The name of a VPC Service Control Perimeter to add the created project to string
null
no vpc_service_control_sleep_duration The duration to sleep in seconds before adding the project to a shared VPC after the project is added to the VPC Service Control Perimeter. VPC-SC is eventually consistent. string
"5s"
no Name Description api_s_account API service account email api_s_account_fmt API service account email formatted for terraform use budget_name The name of the budget if created domain The organization's domain enabled_api_identities Enabled API identities in the project enabled_apis Enabled APIs in the project group_email The email of the G Suite group with group_name project_bucket_self_link Project's bucket selfLink project_bucket_url Project's bucket url project_id ID of the project project_name Name of the project project_number Numeric identifier for the project service_account_display_name The display name of the default service account service_account_email The email of the default service account service_account_id The id of the default service account service_account_name The fully-qualified name of the default service account service_account_unique_id The unique id of the default service account tag_bindings Tag bindings usage_report_export_bucket GCE usage reports bucket
In order to execute this module you must have a Service Account with the following roles:
roles/resourcemanager.folderViewer
on the folder that you want to create the project inroles/resourcemanager.organizationViewer
on the organizationroles/resourcemanager.projectCreator
on the organizationroles/billing.user
on the organizationroles/storage.admin
on bucket_projectroles/billing.user
on the organizationroles/compute.xpnAdmin
on the organizationroles/compute.networkAdmin
on the organizationroles/browser
on the Shared VPC host projectroles/resourcemanager.projectIamAdmin
on the Shared VPC host projectA helper script is included to create the Seed Service Account in the Seed Project, grant the necessary roles to the Seed Service Account, and enable the necessary API's in the Seed Project. Run it as follows:
./helpers/setup-sa.sh -o <organization id> -p <project id> [-b <billing account id>] [-f <folder id>] [-n <service account name>]
In order to execute this script, you must have an account with the following list of permissions:
resourcemanager.organizations.list
resourcemanager.projects.list
billing.accounts.list
iam.serviceAccounts.create
iam.serviceAccountKeys.create
resourcemanager.organizations.setIamPolicy
resourcemanager.projects.setIamPolicy
serviceusage.services.enable
on the projectservicemanagement.services.bind
on following services:
billing.accounts.getIamPolicy
on a billing account.billing.accounts.setIamPolicy
on a billing account.The Project Factory module uses the Google Terraform provider to authenticate all GCP API calls. To configure credentials, you should configure the google
and google-beta
providers.
provider "google" { credentials = "${file(var.credentials_path)}" } provider "google-beta" { credentials = "${file(var.credentials_path)}" }
In order to operate the Project Factory, you must activate the following APIs on the base project where the Service Account was created:
cloudresourcemanager.googleapis.com
troubleshootingcloudbilling.googleapis.com
troubleshootingiam.googleapis.com
troubleshootingadmin.googleapis.com
troubleshootingappengine.googleapis.com
troubleshooting
billingbudgets.googleapis.com
A preconditions checker script is included to verify that all preconditions are met before the Project Factory runs. The script will run automatically if the script dependencies (Python, "google-auth", and "google-api-python-client") are available at runtime. If the dependencies are not met, the precondition checking step will be skipped.
The precondition checker script can be directly invoked before running the project factory:
./helpers/preconditions/preconditions.py \ --credentials_path "./credentials.json" \ --billing_account 000000-000000-000000 \ --org_id 000000000000 \ --folder_id 000000000000 \ --shared_vpc 'shared-vpc-host-ed64'Moving projects from org into a folder
There is currently a bug with moving a project which was originally created at the root of the organization into a folder. The bug and workaround is described here, but as a general best practice it is easier to create all projects within folders to start. Moving projects between different folders is supported.
Deleting default service accountsDefault SAs can be removed by setting default_service_account
input variable to delete
, but there can be certain scenarios where the default SAs are required. Hence some considerations to be aware of:
With a combination of project-factory's default behavior, disable, and setting constraints/iam.automaticIamGrantsForDefaultServiceAccounts org constraint will address removing the default editor IAM role on the SAs and limits the SA usage. However, when the default_service_account
is set to delete
please be aware of the default SA dependency for AppEngine/CloudScheduler services. Accounts deleted within 30days can be restored.
The core Project Factory solely deals with GCP APIs and does not integrate G Suite functionality. If you would like certain group-management functionality which was previously included in the Project Factory, see the G Suite module.
Be sure you have the correct Terraform version (1.3+), you can choose the binary here:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4