foundation-extension/4-projects/business_unit_1/development/boa_secret.tf (175 lines of code) (raw):
/**
* Copyright 2021 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
locals {
tf_deploy_sa_roles = {
gke = [
"roles/compute.viewer",
"roles/compute.instanceAdmin.v1",
"roles/container.clusterAdmin",
"roles/container.developer",
"roles/viewer",
"roles/iam.serviceAccountAdmin",
"roles/iam.serviceAccountUser",
"roles/resourcemanager.projectIamAdmin",
"roles/logging.configWriter",
"roles/storage.objectViewer",
"roles/iap.admin",
"roles/iam.roleAdmin",
"roles/binaryauthorization.policyEditor",
"roles/compute.securityAdmin",
"roles/compute.publicIpAdmin"
],
ops = [
"roles/logging.configWriter",
"roles/serviceusage.serviceUsageAdmin",
"roles/resourcemanager.projectIamAdmin",
"roles/storage.admin"
],
sec = [
"roles/cloudkms.admin",
"roles/logging.configWriter",
"roles/iam.serviceAccountCreator",
"roles/secretmanager.admin"
],
sql = [
"roles/cloudsql.admin",
"roles/compute.networkAdmin",
"roles/logging.configWriter"
],
vpc = [
"roles/compute.networkAdmin",
"roles/compute.securityAdmin"
],
cicd = [
"roles/binaryauthorization.attestorsViewer",
"roles/resourcemanager.projectIamAdmin"
]
}
}
module "boa_secret_project" {
source = "github.com/terraform-google-modules/terraform-example-foundation/4-projects/modules/single_project"
impersonate_service_account = var.terraform_service_account
org_id = var.org_id
billing_account = var.billing_account
folder_id = data.google_active_folder.env.name
environment = "development"
vpc_type = "base"
enable_hub_and_spoke = var.enable_hub_and_spoke
alert_spent_percents = var.alert_spent_percents
alert_pubsub_topic = var.alert_pubsub_topic
budget_amount = var.budget_amount
project_prefix = var.project_prefix
activate_apis = [
"cloudresourcemanager.googleapis.com",
"monitoring.googleapis.com",
"logging.googleapis.com",
"cloudkms.googleapis.com",
"secretmanager.googleapis.com",
"compute.googleapis.com",
"container.googleapis.com",
"cloudbilling.googleapis.com",
"iam.googleapis.com",
"serviceusage.googleapis.com",
"logging.googleapis.com",
"storage-api.googleapis.com",
"sqladmin.googleapis.com",
"servicenetworking.googleapis.com"
]
# Metadata
project_suffix = "boa-sec"
application_name = "bu1-sample-application"
billing_code = "1234"
primary_contact = "example@example.com"
secondary_contact = "example2@example.com"
business_code = "bu1"
}
resource "google_service_account" "boa_terraform_deployment_sa" {
account_id = "boa-terraform-${var.environment_code}-sa"
description = "Service account to allow terraform to deploy 5-infra layer resources and services"
project = module.boa_secret_project.project_id
}
resource "google_service_account_iam_member" "cloudbuild_terraform_sa_impersonate_permissions" {
service_account_id = google_service_account.boa_terraform_deployment_sa.name
role = "roles/iam.serviceAccountTokenCreator"
member = "serviceAccount:${var.app_infra_pipeline_cloudbuild_sa}"
}
resource "google_project_iam_member" "boa_terraform_deployment_sa_roles_gke" {
for_each = toset(local.tf_deploy_sa_roles.gke)
project = module.boa_gke_project.project_id
role = each.value
member = "serviceAccount:${google_service_account.boa_terraform_deployment_sa.email}"
}
resource "google_project_iam_member" "boa_terraform_deployment_sa_roles_sql" {
for_each = toset(local.tf_deploy_sa_roles.sql)
project = module.boa_sql_project.project_id
role = each.value
member = "serviceAccount:${google_service_account.boa_terraform_deployment_sa.email}"
}
resource "google_project_iam_member" "boa_terraform_deployment_sa_roles_sec" {
for_each = toset(local.tf_deploy_sa_roles.sec)
project = module.boa_secret_project.project_id
role = each.value
member = "serviceAccount:${google_service_account.boa_terraform_deployment_sa.email}"
}
resource "google_project_iam_member" "boa_terraform_deployment_sa_roles_ops" {
for_each = toset(local.tf_deploy_sa_roles.ops)
project = module.boa_ops_project.project_id
role = each.value
member = "serviceAccount:${google_service_account.boa_terraform_deployment_sa.email}"
}
resource "google_project_iam_member" "boa_terraform_deployment_sa_roles_vpc" {
for_each = toset(local.tf_deploy_sa_roles.vpc)
project = var.shared_vpc_host_project_id
role = each.value
member = "serviceAccount:${google_service_account.boa_terraform_deployment_sa.email}"
}
resource "google_project_iam_member" "boa_terraform_deployment_sa_roles_cicd" {
for_each = toset(local.tf_deploy_sa_roles.cicd)
project = var.app_cicd_project_id
role = each.value
member = "serviceAccount:${google_service_account.boa_terraform_deployment_sa.email}"
}
data "google_compute_network" "vpc" {
project = var.shared_vpc_host_project_id
name = var.shared_vpc_network_name
}
data "google_compute_subnetwork" "subnet" {
for_each = toset(data.google_compute_network.vpc.subnetworks_self_links)
self_link = each.value
}
resource "google_compute_subnetwork_iam_member" "terraform_subnet_member" {
for_each = data.google_compute_subnetwork.subnet
project = each.value.project
region = each.value.region
subnetwork = each.value.name
role = "roles/compute.networkUser"
member = "serviceAccount:${google_service_account.boa_terraform_deployment_sa.email}"
}
resource "google_compute_subnetwork_iam_member" "gke_subnet_member" {
for_each = data.google_compute_subnetwork.subnet
project = each.value.project
region = each.value.region
subnetwork = each.value.name
role = "roles/compute.networkUser"
member = "serviceAccount:service-${module.boa_gke_project.project_number}@container-engine-robot.iam.gserviceaccount.com"
}
resource "google_compute_subnetwork_iam_member" "gke_nodes_subnet_member" {
for_each = data.google_compute_subnetwork.subnet
project = each.value.project
region = each.value.region
subnetwork = each.value.name
role = "roles/compute.networkUser"
member = "serviceAccount:${module.boa_gke_project.project_number}@cloudservices.gserviceaccount.com"
}