infra/modules/seed_project/main.tf (89 lines of code) (raw):
locals {
seed_service_account_required_org_roles = [
"roles/resourcemanager.organizationViewer",
"roles/resourcemanager.projectCreator",
"roles/billing.user",
"roles/compute.xpnAdmin",
"roles/compute.networkAdmin",
]
seed_service_account_required_folder_roles = [
"roles/resourcemanager.folderViewer",
]
seed_service_account_required_shared_vpc_roles = [
"roles/browser",
"roles/resourcemanager.projectIamAdmin",
]
seed_service_account_required_bucket_project_roles = [
"roles/storage.admin",
]
seed_service_account_required_billing_account_roles = [
"roles/billing.user",
]
}
module "project_factory" {
source = "terraform-google-modules/project-factory/google"
version = "~> 14.0"
random_project_id = "true"
name = "${var.username}-seed"
org_id = "${var.org_id}"
billing_account = "${var.billing_account}"
activate_apis = "${var.seed_project_services}"
folder_id = "${var.seed_folder_id}"
disable_services_on_destroy = "false"
}
resource "google_compute_shared_vpc_host_project" "main" {
project = "${module.project_factory.project_id}"
}
resource "google_folder" "users_seed_root" {
display_name = "${var.username}"
parent = "${var.seed_folder_id}"
}
// This account should be used for provisioning test projects. Provisioning
// resources within those test projects should be done using service accounts
// associated with those projects to ensure that required roles are properly
// isolated.
resource "google_service_account" "seed_service_account" {
project = "${module.project_factory.project_id}"
account_id = "${var.username}-seed"
display_name = "Project Factory seed service account"
}
resource "google_folder_iam_member" "seed_service_account_folder_roles" {
count = "${length(local.seed_service_account_required_folder_roles)}"
folder = "${google_folder.users_seed_root.name}"
role = "${element(local.seed_service_account_required_folder_roles, count.index)}"
member = "serviceAccount:${google_service_account.seed_service_account.email}"
}
resource "google_organization_iam_member" "seed_service_account_organization_roles" {
count = "${length(local.seed_service_account_required_org_roles)}"
org_id = "${var.org_id}"
role = "${element(local.seed_service_account_required_org_roles, count.index)}"
member = "serviceAccount:${google_service_account.seed_service_account.email}"
}
resource "google_project_iam_member" "seed_service_account_shared_vpc_roles" {
count = "${length(local.seed_service_account_required_shared_vpc_roles)}"
project = "${module.project_factory.project_id}"
role = "${element(local.seed_service_account_required_shared_vpc_roles, count.index)}"
member = "serviceAccount:${google_service_account.seed_service_account.email}"
}
resource "google_project_iam_member" "seed_service_account_bucket_project_roles" {
count = "${length(local.seed_service_account_required_bucket_project_roles)}"
project = "${module.project_factory.project_id}"
role = "${element(local.seed_service_account_required_bucket_project_roles, count.index)}"
member = "serviceAccount:${google_service_account.seed_service_account.email}"
}
resource "google_billing_account_iam_member" "seed_service_account_billing_account_roles" {
count = "${length(local.seed_service_account_required_billing_account_roles)}"
billing_account_id = "${var.billing_account}"
role = "${element(local.seed_service_account_required_billing_account_roles, count.index)}"
member = "serviceAccount:${google_service_account.seed_service_account.email}"
}
resource "google_folder" "users_pf_test_projects" {
display_name = "pf-test-projects"
parent = "${google_folder.users_seed_root.id}"
}
resource "google_project_iam_member" "project_owners_roles" {
count = "${length(var.owner_emails)}"
project = "${module.project_factory.project_id}"
role = "roles/owner"
member = "${var.owner_emails[count.index]}"
}