infra/iam.tf (87 lines of code) (raw):
/**
* Copyright 2023 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 {
# Lists of required roles
server_iam_members = [
"roles/cloudsql.client",
"roles/run.viewer",
"roles/cloudtrace.agent"
]
client_iam_members = [
"roles/run.viewer",
"roles/firebasehosting.admin",
]
automation_iam_members = [
"roles/cloudsql.client"
]
init_iam_members = [
"roles/logging.logWriter",
"roles/cloudbuild.builds.builder",
"roles/iam.serviceAccountUser",
"roles/run.developer",
"roles/firebasehosting.admin"
]
}
# Accounts
resource "google_service_account" "server" {
account_id = var.random_suffix ? "api-backend-${random_id.suffix.hex}" : "api-backend"
display_name = "API Backend service account"
depends_on = [module.project_services]
}
resource "google_service_account" "client" {
account_id = var.random_suffix ? "client-frontend-${random_id.suffix.hex}" : "client-frontend"
display_name = "Client Frontend service account"
depends_on = [module.project_services]
}
resource "google_service_account" "automation" {
account_id = var.random_suffix ? "automation-${random_id.suffix.hex}" : "automation"
display_name = "Automation service account"
depends_on = [module.project_services]
}
resource "google_service_account" "init" {
account_id = var.random_suffix ? "init-startup-${random_id.suffix.hex}" : "init-startup"
display_name = "Jump Start App Init SA"
depends_on = [module.project_services]
count = var.init ? 1 : 0
}
# Permissions
resource "google_project_iam_member" "server_permissions" {
count = length(local.server_iam_members)
project = var.project_id
role = local.server_iam_members[count.index]
member = "serviceAccount:${google_service_account.server.email}"
}
resource "google_project_iam_member" "client_permissions" {
count = length(local.client_iam_members)
project = var.project_id
role = local.client_iam_members[count.index]
member = "serviceAccount:${google_service_account.client.email}"
}
resource "google_project_iam_member" "automation_permissions" {
count = length(local.automation_iam_members)
project = var.project_id
role = local.automation_iam_members[count.index]
member = "serviceAccount:${google_service_account.automation.email}"
}
resource "google_project_iam_member" "init_permissions" {
count = length(local.init_iam_members)
project = var.project_id
role = local.init_iam_members[count.index]
member = "serviceAccount:${google_service_account.init[0].email}"
}
# Ensure google_service_account.init is not used before permissions are available.
# Introduced to allow for IAM policy propagation delay. Time selected to allow:
# propagation delay + ~2 minute firebase hosting deploy <= 5 minutes.
# Shortest delay preferred.
# Warning: Trying to meet IAM propagation delay on roles/logging.logWriter.
# Exceeded safe limit to avoid race conditions between placeholder and init process.
resource "time_sleep" "init_permissions_propagation" {
depends_on = [
google_project_iam_member.init_permissions
]
create_duration = "60s"
}