Skip to content
88 changes: 88 additions & 0 deletions bigquery/bigquery_authorized_view_tutorial/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* Copyright 2025 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.
*/


# [START bigquery_authorized_view_tutorial]
/*
Creates an authorized view.
*/


/*
Create a dataset to contain the authorized view.
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These comments can be useful, and if you want to keep the, I would suggest using single-line comments to reduce the lines of the demo, to make it more accessible/visible on the tutorial page.

If you want to present each resource in a different block in the codes, you can use region tags around each block.

Suggested change
/*
Create a dataset to contain the authorized view.
*/
# Create a dataset to contain the authorized view.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed in latest commit.

resource "google_bigquery_dataset" "default" {
dataset_id = "authdataset"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Query: is the dataset "authdataset", or "movie_dataset"? You're assigning dataset access to a different dataset later int his sample.

You can reference google_bigquery_dataset.default.dataset_id in other resources to ensure a consistent name.

It's helpful to clearly show which is the original dataset and which is the authorised view of the data with clear names (unsure what "movies" is in this context. )

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I re-named the resources for clarity and tested again to make sure it works.

description = "Dataset for authorized view"
location = "us-west1"
}

/*
Create the view to authorize.
*/
resource "google_bigquery_table" "default" {
project = google_bigquery_dataset.default.project
dataset_id = google_bigquery_dataset.default.dataset_id
table_id = "authview"
description = "View to authorize"
deletion_protection = false # set to "true" in production
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this sample is not being tested, remove this line and ensure the configuration is production ready. Deletion protection is true by default

Suggested change
deletion_protection = false # set to "true" in production

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed in latest commit.


view {
query = "SELECT item_id, avg(rating) FROM `myproject.movie_dataset.movie_ratings` GROUP BY item_id ORDER BY item_id;"
use_legacy_sql = false
}
}

/*
Authorize the view to access the dataset that
the query data originates from.
*/
resource "google_bigquery_dataset_access" "default" {
project = "myproject"
dataset_id = "movie_dataset"

view {
project_id = google_bigquery_table.default.project
dataset_id = google_bigquery_table.default.dataset_id
table_id = google_bigquery_table.default.table_id
}
}

/*
Set the IAM policy for principals that can access
the authorized view. These users should already have the
roles/bigqueryUser role at the project level.
*/

data "google_iam_policy" "default" {
binding {
role = "roles/bigquery.dataViewer"
members = [
"group:[email protected]",
]
}
}

/*
Set the IAM policy on the authorized view.
*/
resource "google_bigquery_table_iam_policy" "default" {
project = google_bigquery_table.default.project
dataset_id = google_bigquery_table.default.dataset_id
table_id = google_bigquery_table.default.table_id
policy_data = data.google_iam_policy.default.policy_data
}
# [END bigquery_authorized_view_tutorial]
20 changes: 20 additions & 0 deletions bigquery/bigquery_authorized_view_tutorial/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2025 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.

apiVersion: blueprints.cloud.google.com/v1alpha1
kind: BlueprintTest
metadata:
name: bigquery_authorized_view_tutorial
spec:
skip: true