5-appinfra/modules/cicd-pipeline/project-iam-bindings.tf (124 lines of code) (raw):
# Copyright 2024 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 {
membership_re = "projects/([^/]*)/locations/([^/]*)/memberships/([^/]*)$"
envs = keys(var.env_cluster_membership_ids)
memberships = flatten([for i in local.envs : var.env_cluster_membership_ids[i].cluster_membership_ids])
memberships_map = { for i, item in local.memberships : (i) => item }
gke_projects = { for i, item in local.memberships : (i) => regex(local.membership_re, item)[0] }
}
resource "google_project_iam_member" "cloud_trace_agent" {
project = var.project_id
role = "roles/cloudtrace.agent"
member = data.google_compute_default_service_account.compute_service_identity.member
}
resource "google_project_iam_member" "metric_writer" {
project = var.project_id
role = "roles/monitoring.metricWriter"
member = data.google_compute_default_service_account.compute_service_identity.member
}
resource "google_project_iam_member" "cloudbuild_serviceAgent" {
project = var.project_id
role = "roles/cloudbuild.serviceAgent"
member = google_project_service_identity.cloudbuild_service_identity.member
}
resource "google_project_iam_member" "log_writer" {
for_each = {
"compute" = data.google_compute_default_service_account.compute_service_identity.member,
"cloud_deploy" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
}
project = var.project_id
role = "roles/logging.logWriter"
member = each.value
}
resource "google_project_iam_member" "builder" {
for_each = {
"cloud_build_service" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
}
project = var.project_id
role = "roles/cloudbuild.builds.builder"
member = each.value
}
resource "google_project_iam_member" "gateway_editor" {
for_each = {
"cloud_deploy" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
}
project = var.project_id
role = "roles/gkehub.gatewayEditor"
member = each.value
}
resource "google_project_iam_member" "gke_viewer" {
for_each = {
"cloud_deploy" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
}
project = var.project_id
role = "roles/gkehub.viewer"
member = each.value
}
resource "google_project_iam_member" "cloud_deploy_releaser" {
project = var.project_id
role = "roles/clouddeploy.releaser"
member = google_service_account.cloud_build.member
}
resource "google_project_iam_member" "container_developer" {
for_each = {
"cloud_deploy" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
}
project = var.project_id
role = "roles/container.developer"
member = each.value
}
resource "google_project_iam_member" "container_admin" {
for_each = {
"cloud_deploy" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
}
project = var.project_id
role = "roles/container.admin"
member = each.value
}
resource "google_project_iam_member" "cloudbuild_service_account" {
for_each = {
"cloud_deploy" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
"cb_service_agent" = google_project_service_identity.cloudbuild_service_identity.member,
"cd_service_agent" = google_project_service_identity.cloud_deploy_sa.member,
}
project = local.worker_pool_project
role = "roles/cloudbuild.builds.builder"
member = each.value
}
resource "google_project_iam_member" "logging_writer" {
for_each = {
"cloud_deploy" = google_service_account.cloud_deploy.member,
"cloud_build" = google_service_account.cloud_build.member,
"service_agent" = google_project_service_identity.cloudbuild_service_identity.member,
"cd_service_agent" = google_project_service_identity.cloud_deploy_sa.member,
}
project = local.worker_pool_project
role = "roles/logging.logWriter"
member = each.value
}
// added to avoid overwriten of roles for each app service deploy service account, since GKE projects are shared between services
module "cb-gke-project-iam-bindings" {
source = "terraform-google-modules/iam/google//modules/member_iam"
version = "~> 8.0"
for_each = local.gke_projects
project_id = each.value
project_roles = ["roles/container.admin", "roles/container.developer", "roles/gkehub.viewer", "roles/gkehub.gatewayEditor", "roles/cloudbuild.workerPoolUser"]
prefix = "serviceAccount"
service_account_address = google_service_account.cloud_build.email
}
module "deploy-gke-project-iam-bindings" {
source = "terraform-google-modules/iam/google//modules/member_iam"
version = "~> 8.0"
for_each = local.gke_projects
project_id = each.value
// TODO: grant less permissive roles and grant scope/team namespace specific high privileged roles
project_roles = ["roles/container.admin", "roles/container.developer", "roles/gkehub.viewer", "roles/gkehub.gatewayEditor"]
prefix = "serviceAccount"
service_account_address = google_service_account.cloud_deploy.email
}