iam_policies.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. */ resource "google_service_account" "frontend_sa" { account_id = var.random_suffix ? "crmint-frontend-sa-${random_id.suffix.hex}" : "crmint-frontend-sa" display_name = "CRMint Frontend Service Account" description = "Managed by ${local.managed_by_desc}" project = var.project_id depends_on = [google_project_service.apis] } resource "google_service_account" "jobs_sa" { account_id = var.random_suffix ? "crmint-jobs-sa-${random_id.suffix.hex}" : "crmint-jobs-sa" display_name = "CRMint Jobs Service Account" description = "Managed by ${local.managed_by_desc}" project = var.project_id depends_on = [google_project_service.apis] } resource "google_service_account" "controller_sa" { account_id = var.random_suffix ? "crmint-controller-sa-${random_id.suffix.hex}" : "crmint-controller-sa" display_name = "CRMint Controller Service Account" description = "Managed by ${local.managed_by_desc}" project = var.project_id depends_on = [google_project_service.apis] } resource "google_service_account" "pubsub_sa" { account_id = var.random_suffix ? "crmint-pubsub-sa-${random_id.suffix.hex}" : "crmint-pubsub-sa" display_name = "CRMint PubSub Service Account" description = "Managed by ${local.managed_by_desc}" project = var.project_id depends_on = [google_project_service.apis] } resource "google_project_service_identity" "iap_managed_sa" { provider = google-beta project = var.project_id service = "iap.googleapis.com" } resource "google_project_service_identity" "cloudbuild_managed_sa" { provider = google-beta project = var.project_id service = "cloudbuild.googleapis.com" depends_on = [google_project_service.apis] } resource "google_project_service_identity" "pubsub_managed_sa" { provider = google-beta project = var.project_id service = "pubsub.googleapis.com" depends_on = [google_project_service.apis] } resource "google_project_iam_member" "controller_sa--cloudsql-client" { member = "serviceAccount:${google_service_account.controller_sa.email}" project = var.project_id role = "roles/cloudsql.client" } resource "google_project_iam_member" "controller_sa--pubsub-publisher" { member = "serviceAccount:${google_service_account.controller_sa.email}" project = var.project_id role = "roles/pubsub.publisher" } resource "google_project_iam_member" "controller_sa--logging-writer" { member = "serviceAccount:${google_service_account.controller_sa.email}" project = var.project_id role = "roles/logging.logWriter" } resource "google_project_iam_member" "controller_sa--logging-viewer" { member = "serviceAccount:${google_service_account.controller_sa.email}" project = var.project_id role = "roles/logging.viewer" } resource "google_project_iam_member" "jobs_sa--pubsub-publisher" { member = "serviceAccount:${google_service_account.jobs_sa.email}" project = var.project_id role = "roles/pubsub.publisher" } resource "google_project_iam_member" "jobs_sa--logging-writer" { member = "serviceAccount:${google_service_account.jobs_sa.email}" project = var.project_id role = "roles/logging.logWriter" } resource "google_project_iam_member" "jobs_sa--bigquery-data-editor" { member = "serviceAccount:${google_service_account.jobs_sa.email}" project = var.project_id role = "roles/bigquery.dataEditor" } resource "google_project_iam_member" "jobs_sa--bigquery-job-user" { member = "serviceAccount:${google_service_account.jobs_sa.email}" project = var.project_id role = "roles/bigquery.jobUser" } resource "google_project_iam_member" "jobs_sa--bigquery-resource-viewer" { member = "serviceAccount:${google_service_account.jobs_sa.email}" project = var.project_id role = "roles/bigquery.resourceViewer" } resource "google_project_iam_member" "jobs_sa--storage-object-admin" { member = "serviceAccount:${google_service_account.jobs_sa.email}" project = var.project_id role = "roles/storage.objectAdmin" } resource "google_project_iam_member" "jobs_sa--aiplatform-user" { member = "serviceAccount:${google_service_account.jobs_sa.email}" project = var.project_id role = "roles/aiplatform.user" } # Needed to access the controller image during migrations from Cloud Build. resource "google_project_iam_member" "cloudbuild_managed_sa--object-viewer" { member = "serviceAccount:${google_project_service_identity.cloudbuild_managed_sa.email}" project = var.project_id role = "roles/storage.objectViewer" } # Needed to access the database during migrations from Cloud Build. resource "google_project_iam_member" "cloudbuild_managed_sa--cloudsql-client" { member = "serviceAccount:${google_project_service_identity.cloudbuild_managed_sa.email}" project = var.project_id role = "roles/cloudsql.client" } # Needed for projects created on or before April 8, 2021. # Grant the Google-managed service account the `iam.serviceAccountTokenCreator` role. resource "google_project_iam_member" "pubsub_token-creator" { member = "serviceAccount:${google_project_service_identity.pubsub_managed_sa.email}" project = var.project_id role = "roles/iam.serviceAccountTokenCreator" } ## # Cloud Run permissions # # NOTE: We delegate the authentication flow to IAP, so we need to give `allUsers` access # to Cloud Run since it's not responsible anymore for authenticating the users. # data "google_iam_policy" "iap_users" { binding { role = "roles/iap.httpsResourceAccessor" members = concat( ["serviceAccount:${google_service_account.pubsub_sa.email}"], var.iap_allowed_users ) } } resource "google_iap_web_backend_service_iam_policy" "frontend" { project = google_compute_backend_service.frontend_backend.project web_backend_service = google_compute_backend_service.frontend_backend.name policy_data = data.google_iam_policy.iap_users.policy_data } resource "google_iap_web_backend_service_iam_policy" "controller" { project = google_compute_backend_service.controller_backend.project web_backend_service = google_compute_backend_service.controller_backend.name policy_data = data.google_iam_policy.iap_users.policy_data } resource "google_iap_web_backend_service_iam_policy" "jobs" { project = google_compute_backend_service.jobs_backend.project web_backend_service = google_compute_backend_service.jobs_backend.name policy_data = data.google_iam_policy.iap_users.policy_data } resource "google_cloud_run_service_iam_binding" "frontend_run-invoker" { location = google_cloud_run_service.frontend_run.location project = google_cloud_run_service.frontend_run.project service = google_cloud_run_service.frontend_run.name role = "roles/run.invoker" members = ["allUsers"] } resource "google_cloud_run_service_iam_binding" "controller_run-invoker" { location = google_cloud_run_service.controller_run.location project = google_cloud_run_service.controller_run.project service = google_cloud_run_service.controller_run.name role = "roles/run.invoker" members = ["allUsers"] } resource "google_cloud_run_service_iam_binding" "jobs_run-invoker" { location = google_cloud_run_service.jobs_run.location project = google_cloud_run_service.jobs_run.project service = google_cloud_run_service.jobs_run.name role = "roles/run.invoker" members = ["allUsers"] }