shared-vpc/main.tf (107 lines of code) (raw):
provider "google" {}
provider "google-beta" {}
data "google_project" "host_project" {
project_id = var.host_project_id
}
data "google_project" "service_project" {
project_id = var.service_project_id
}
locals {
activate_apis = [
"container.googleapis.com",
"dataproc.googleapis.com",
"dataflow.googleapis.com",
"composer.googleapis.com",
"vpcaccess.googleapis.com",
]
s_account_fmt = format(
"serviceAccount:%s",
google_service_account.default_service_account.email,
)
api_s_account = format(
"%s@cloudservices.gserviceaccount.com",
data.google_project.host_project.project_id,
)
api_s_account_fmt = format("serviceAccount:%s", local.api_s_account)
shared_vpc_users = compact(
[
local.s_account_fmt,
local.api_s_account_fmt,
],
)
shared_vpc_users_length = 2
}
# Host project lien
resource "google_resource_manager_lien" "lien" {
parent = "projects/${data.google_project.host_project.number}"
restrictions = ["resourcemanager.projects.delete"]
origin = "shared-vpc"
reason = "Shared VPC host project lien"
}
# APIs configuration
module "project_services" {
source = "terraform-google-modules/project-factory/google//modules/project_services"
version = "~> 13.0"
project_id = data.google_project.service_project.number
activate_apis = local.activate_apis
}
# Shared VPC configuration
#
# If Shared VPC Admin role is set at the folder level, use the google-beta provider.
# The google provider only supports this permission at project or organizational level currently.
resource "google_compute_shared_vpc_service_project" "shared_vpc_attachment" {
provider = google-beta
host_project = data.google_project.host_project.number
service_project = data.google_project.service_project.number
depends_on = [module.project_services]
}
resource "google_compute_shared_vpc_host_project" "shared_vpc_host" {
provider = google-beta
project = data.google_project.host_project.number
depends_on = [module.project_services]
}
resource "google_project_default_service_accounts" "default_service_accounts" {
action = "DISABLE"
project = data.google_project.host_project.project_id
restore_policy = "REVERT_AND_IGNORE_FAILURE"
depends_on = [module.project_services]
}
# Default Service Account configuration
resource "google_service_account" "default_service_account" {
account_id = "project-service-account"
display_name = "${data.google_project.host_project.project_id} Project Service Account"
project = data.google_project.host_project.project_id
}
# compute.networkUser role granted to APIs Service account, and Project Service Account
resource "google_project_iam_member" "controlling_group_vpc_membership" {
count = local.shared_vpc_users_length
project = data.google_project.host_project.project_id
role = "roles/compute.networkUser"
member = element(local.shared_vpc_users, count.index)
depends_on = [
module.project_services,
]
}
# compute.networkUser role granted to Project Service Account on vpc subnets
resource "google_compute_subnetwork_iam_member" "service_account_role_to_vpc_subnets" {
provider = google-beta
subnetwork = element(
split("/", var.shared_subnetwork),
index(split("/", var.shared_subnetwork), "subnetworks") + 1,
)
role = "roles/compute.networkUser"
region = element(
split("/", var.shared_subnetwork),
index(split("/", var.shared_subnetwork), "regions") + 1,
)
project = data.google_project.host_project.project_id
member = local.s_account_fmt
}
# compute.networkUser role granted to APIs Service Account on vpc subnets
resource "google_compute_subnetwork_iam_member" "apis_service_account_role_to_vpc_subnets" {
provider = google-beta
subnetwork = element(
split("/", var.shared_subnetwork),
index(split("/", var.shared_subnetwork), "subnetworks") + 1,
)
role = "roles/compute.networkUser"
region = element(
split("/", var.shared_subnetwork),
index(split("/", var.shared_subnetwork), "regions") + 1,
)
project = data.google_project.host_project.project_id
member = local.api_s_account_fmt
depends_on = [
module.project_services,
]
}
# module "shared_vpc_access" {
# source = "terraform-google-modules/project-factory/google//modules/shared_vpc_access"
# version = "~> 13.0"
# host_project_id = data.google_project.host_project.project_id
# service_project_id = data.google_project.service_project.project_id
# service_project_number = data.google_project.service_project.number
# lookup_project_numbers = false
# enable_shared_vpc_service_project = true
# active_apis = local.activate_apis
# shared_vpc_subnets = [
# var.shared_subnetwork
# ]
# }