data-mesh-banking-labs/setup/terraform/modules/iam/iam.tf (150 lines of code) (raw):
/**
* Copyright 2022 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.
*/
####################################################################################
# Variables
####################################################################################
variable "project_id" {}
variable "project_number" {}
####################################################################################
# Create one service account for each data domain
####################################################################################
resource "google_service_account" "data_service_account" {
project = var.project_id
for_each = {
"customer-sa" : "customer-sa",
"merchant-sa" : "merchant-sa",
"cc-trans-consumer-sa" : "cc-trans-consumer-sa",
"cc-trans-sa" : "cc-trans-sa"
}
account_id = format("%s", each.key)
display_name = format("Demo Service Account %s", each.value)
}
####################################################################################
# Assign IAM Roles to the above service account.
# We will use Dataplex for managing Data Security. This module is for compute only.
####################################################################################
resource "google_project_iam_member" "iam_customer_sa" {
for_each = toset([
"roles/iam.serviceAccountUser",
"roles/iam.serviceAccountTokenCreator",
"roles/serviceusage.serviceUsageConsumer",
"roles/bigquery.jobUser",
"roles/dataflow.worker",
"roles/dataplex.developer",
"roles/dataplex.metadataReader",
"roles/dataplex.metadataWriter",
"roles/metastore.metadataEditor",
"roles/metastore.serviceAgent",
"roles/dataproc.worker",
"roles/cloudscheduler.jobRunner",
"roles/dataplex.viewer",
"roles/datacatalog.tagEditor",
"roles/bigquery.user"
])
project = var.project_id
role = each.key
member = format("serviceAccount:customer-sa@%s.iam.gserviceaccount.com", var.project_id)
depends_on = [
google_service_account.data_service_account
]
}
resource "google_project_iam_member" "iam_merchant_sa" {
for_each = toset([
"roles/iam.serviceAccountUser",
"roles/iam.serviceAccountTokenCreator",
"roles/serviceusage.serviceUsageConsumer",
"roles/artifactregistry.reader",
"roles/bigquery.jobUser",
"roles/dataflow.worker",
"roles/dataplex.editor",
"roles/dataplex.developer",
"roles/dataplex.metadataReader",
"roles/dataplex.metadataWriter",
"roles/metastore.metadataEditor",
"roles/metastore.serviceAgent",
"roles/dataproc.worker",
"roles/dataflow.admin",
"roles/dataflow.worker",
"roles/cloudscheduler.jobRunner",
"roles/dataplex.viewer",
"roles/datacatalog.tagEditor",
"roles/bigquery.user"
])
project = var.project_id
role = each.key
member = format("serviceAccount:merchant-sa@%s.iam.gserviceaccount.com", var.project_id)
depends_on = [
google_service_account.data_service_account
]
}
resource "google_project_iam_member" "iam_cc_trans_sa" {
for_each = toset([
"roles/iam.serviceAccountUser",
"roles/iam.serviceAccountTokenCreator",
"roles/serviceusage.serviceUsageConsumer",
"roles/artifactregistry.reader",
"roles/bigquery.jobUser",
"roles/dataflow.worker",
"roles/dataplex.editor",
"roles/dataplex.developer",
"roles/dataplex.metadataReader",
"roles/dataplex.metadataWriter",
"roles/metastore.metadataEditor",
"roles/metastore.serviceAgent",
"roles/dataproc.worker",
"roles/dataflow.admin",
"roles/dataflow.worker",
"roles/cloudscheduler.jobRunner",
"roles/dataplex.viewer",
"roles/datacatalog.tagEditor",
"roles/bigquery.user"
])
project = var.project_id
role = each.key
member = format("serviceAccount:cc-trans-sa@%s.iam.gserviceaccount.com", var.project_id)
depends_on = [
google_service_account.data_service_account
]
}
resource "google_project_iam_member" "iam_cc_trans_consumer_sa" {
for_each = toset([
"roles/iam.serviceAccountUser",
"roles/iam.serviceAccountTokenCreator",
"roles/serviceusage.serviceUsageConsumer",
"roles/artifactregistry.reader",
"roles/bigquery.jobUser",
"roles/dataflow.worker",
"roles/dataplex.editor",
"roles/dataplex.developer",
"roles/dataplex.metadataReader",
"roles/dataplex.metadataWriter",
"roles/metastore.metadataEditor",
"roles/metastore.serviceAgent",
"roles/dataproc.worker",
"roles/dataflow.admin",
"roles/dataflow.worker",
"roles/cloudscheduler.jobRunner",
"roles/dataplex.viewer",
"roles/datacatalog.tagEditor",
"roles/bigquery.user"
])
project = var.project_id
role = each.key
member = format("serviceAccount:cc-trans-consumer-sa@%s.iam.gserviceaccount.com", var.project_id)
depends_on = [
google_service_account.data_service_account
]
}
/*******************************************
Introducing sleep to minimize errors from
dependencies having not completed
********************************************/
resource "time_sleep" "sleep_after_network_and_iam_steps" {
create_duration = "120s"
depends_on = [
google_project_iam_member.iam_cc_trans_consumer_sa
]
}