oss-terraform-automation/common/modules/bootstrap-kms-hsm/sa.tf (91 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 {
custom_sa = google_service_account.custom_sa.id
custom_sa_name = google_service_account.custom_sa.name
custom_sa_email = element(split("/", local.custom_sa), length(split("/", local.custom_sa)) - 1)
}
resource "google_service_account" "custom_sa" {
project = var.project_id
account_id = "tf-custom-sa-${local.default_suffix}"
display_name = "SA to be used on Cloud Build and Compute Engine. Suffix identifier: ${local.default_suffix}. Managed by Terraform."
}
resource "google_project_iam_member" "cb_sa_logging" {
project = var.project_id
role = "roles/logging.logWriter"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_project_iam_member" "sa_cloudbuild_builder" {
project = var.project_id
role = "roles/cloudbuild.builds.builder"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_project_iam_member" "cb_service_agent" {
project = var.project_id
role = "roles/cloudbuild.serviceAgent"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_kms_crypto_key_iam_member" "crypto_key_role" {
crypto_key_id = values(module.kms.keys)[0]
role = "roles/cloudkms.signerVerifier"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_kms_key_ring_iam_member" "key_ring_role" {
key_ring_id = module.kms.keyring
role = "roles/cloudkms.viewer"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_artifact_registry_repository_iam_member" "custom_sa" {
project = var.project_id
location = var.location
repository = google_artifact_registry_repository.pkcs11_hsm_examples.name
role = "roles/artifactregistry.repoAdmin"
member = "serviceAccount:${local.custom_sa_email}"
}
data "google_project" "cloudbuild_project" {
project_id = var.project_id
}
resource "google_service_account_iam_member" "self_impersonation" {
service_account_id = local.custom_sa_name
role = "roles/iam.serviceAccountTokenCreator"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_service_account_iam_member" "cb_service_agent_impersonate" {
service_account_id = local.custom_sa_name
role = "roles/iam.serviceAccountTokenCreator"
member = "serviceAccount:service-${data.google_project.cloudbuild_project.number}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
depends_on = [time_sleep.enable_projects_apis_sleep]
}
resource "google_project_iam_member" "sa_service_account_user" {
project = var.project_id
role = "roles/iam.serviceAccountUser"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_project_iam_member" "sa_compute_admin" {
project = var.project_id
role = "roles/compute.admin"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_project_iam_member" "sa_iap_accessor" {
project = var.project_id
role = "roles/iap.tunnelResourceAccessor"
member = "serviceAccount:${local.custom_sa_email}"
}
resource "google_project_iam_member" "cb_service_agent_iam" {
project = var.project_id
role = "roles/cloudbuild.serviceAgent"
member = "serviceAccount:service-${data.google_project.cloudbuild_project.number}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
}