modules/authorization/main.tf (78 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 {
role_keys = [
for role in var.roles :
join("_", compact([
role["role"],
lookup(role, "domain", null),
lookup(role, "group_by_email", null),
lookup(role, "user_by_email", null),
lookup(role, "special_group", null)
]))
]
roles = zipmap(local.role_keys, var.roles)
views = { for view in var.authorized_views : "${view["project_id"]}_${view["dataset_id"]}_${view["table_id"]}" => view }
datasets = { for dataset in var.authorized_datasets : "${dataset["project_id"]}_${dataset["dataset_id"]}" => dataset }
routines = { for routine in var.authorized_routines : "${routine["project_id"]}_${routine["dataset_id"]}_${routine["routine_id"]}" => routine }
iam_to_primitive = {
"roles/bigquery.dataOwner" : "OWNER"
"roles/bigquery.dataEditor" : "WRITER"
"roles/bigquery.dataViewer" : "READER"
}
}
resource "google_bigquery_dataset_access" "authorized_view" {
for_each = local.views
dataset_id = var.dataset_id
project = var.project_id
view {
project_id = each.value.project_id
dataset_id = each.value.dataset_id
table_id = each.value.table_id
}
}
resource "google_bigquery_dataset_access" "access_role" {
for_each = local.roles
dataset_id = var.dataset_id
project = var.project_id
# BigQuery API converts IAM to primitive roles in its backend.
# This causes Terraform to show a diff on every plan that uses IAM equivalent roles.
# Thus, do the conversion between IAM to primitive role here to prevent the diff.
role = lookup(local.iam_to_primitive, each.value.role, each.value.role)
domain = lookup(each.value, "domain", null)
group_by_email = lookup(each.value, "group_by_email", null)
user_by_email = lookup(each.value, "user_by_email", null)
special_group = lookup(each.value, "special_group", null)
}
resource "google_bigquery_dataset_access" "authorized_dataset" {
for_each = local.datasets
dataset_id = var.dataset_id
project = var.project_id
dataset {
dataset {
project_id = each.value.project_id
dataset_id = each.value.dataset_id
}
target_types = ["VIEWS"]
}
}
resource "google_bigquery_dataset_access" "authorized_routine" {
for_each = local.routines
dataset_id = var.dataset_id
project = var.project_id
routine {
project_id = each.value.project_id
dataset_id = each.value.dataset_id
routine_id = each.value.routine_id
}
}