BigQuery の承認済みビュー/承認済みデータセットを設定する
エヌデーデーの関口です。Google Cloud の BigQueryを運用していく場合によく課題になるのは参照権限に付いてです。これを解決するために承認済みビュー/承認済みデータセットという機能があるのはご存じでしょうか。Professional Data Engineerの資格試験でも必ずと言っていいほど出てくるこの機能ですし、いろいろな記事で書き古された感もありますが、改めて整理する意味も込めて解説していきたいと思います。
BigQuery 運用時の課題
例えば、会社のいろいろなデータ(テーブル)を集約したデータセットを持っていて、データが逐次更新されているとします。
このとき、データの更新はETLツールなどを利用して自動化しているため、それらのデータを利用した分析用途ではデータを直接変更されたくないという要件はよくあると思います。

データの参照権限は、データセットに適切に IAM を設定することでも実現可能なのです。しかし、この方法は管理が煩雑になりがちです。そこで、簡単に参照権限を与えたいという場合には承認済みビューが便利です。
承認済みビューは、参照させたいデータを基にしたビューを、他のデータセットに共有できる機能です。これにより、新たに IAM を設定し直すことなく、既存のプロジェクトやデータセットに設定されている IAM のままで参照権限を付与することが可能になります。また、公開するのはビューなので分析担当者には公開したくないレコードやフィールドを制限するということも可能になります。
ただし、承認済みビューはビューごとに共有設定が必要となり、多数のビューを公開する場合には煩雑さが増します。特定のデータセット全体に共有設定を行いたい場合は、承認済みデータセットを設定すると管理が楽になります。
それぞれ作成方法と効果を解説します。
検証用のBigQuery構成
プロジェクトとデータセットの構成
- ndd-bq-datasource: 参照元となるデータが入っているプロジェクト
- source_dataset: 参照元となるデータが入っているデータセット。リージョンは東京
- source_table: 参照元となるテーブル
- source_dataset: 参照元となるデータが入っているデータセット。リージョンは東京
- ndd-bq-dataview: 上記のプロジェクト内のデータを参照させたいプロジェクト。リージョンは東京
- user_dataset: このプロジェクト内のBQユーザーが自由に操作できるデータセット

IAM 構成
- admin: ndd-bq-datasource, ndd-bq-dataview プロジェクトで BigQuery 管理者 ロール
- analyst: ndd-bq-dataview プロジェクトで BigQuery データ閲覧者 ロール、BigQuery ジョブユーザー ロール
承認済みビュー
ビューの作成
admin
ユーザーで BigQueryスタジオを開いてビューを保存します。
このとき、作成先のプロジェクト、データセットをndd-bq-dataview.user_dataset
にしておきます。
ビューの名前はview_P0001
としました。
SELECT sales_cd, quantity
FROM `ndd-bq-datasource.source_dataset.source_table`
WHERE product_cd = 'P0001';


公開状況の確認(未承認時点)
この状態で analyst
ユーザーからクエリを発行してみると、承認をしていないので次のようにアクセスが拒否されます。

ビューを承認する
再び admin
ユーザーで ndd-bq-datasource.source_dataset
を選択し、概要画面から「共有」>「ビューを承認」をクリックします。

ダイアログが開いたら「承認済みビューの入力項目」を確認します。この時点では候補が表示されません。
手動で、先ほど作成したview_P0001
を入力します。入力すると候補に表示されます。
候補に表示されたら、それを選択し「承認を追加」してください。


承認済みビューを追加すると次のように表示されます。ダイアログ下部の「Close」で画面を閉じてください。

公開状況の確認(承認後)
再び analyst
ユーザーでクエリを発行してみると、結果が表示されるようになりました。

承認済みデータセット
続いて承認済みデータセットについて説明します。承認済みデータセットを設定しておけば、そこに公開されたビューはすべて承認済みビューとして扱えます。
承認済みデータセットの作成
admin
ユーザーで、ndd-bq-datasource.source_dataset
を選択して、概要画面から「共有」>「データセットを承認」をクリックします。

ダイアログに公開先として承認したいデータセットを入力します。
ここでは既存の ndd-bq-dataview.user_dataset
も選択可能ですが、承認済みデータセット用の新しいデータセットを作成してみます。

「新しいデータセットの作成」をクリックするとダイアログが開きます。
ここでプロジェクトを ndd-bq-dataview
に変更して新しいデータセット view_dataset
を作成します。
データセットを作成したら「承認を追加」してください。

承認済みデータセットを追加すると次のように表示されます。ダイアログ下部の「Close」で画面を閉じてください。

承認済みデータセットにビューを作成
新しいデータセット ndd-bq-dataview.view_dataset
にビューを作成していきます。
ビューの名前はview_P0002
としました。
SELECT sales_cd, quantity
FROM `ndd-bq-datasource.source_dataset.source_table`
WHERE product_cd = 'P0002';

公開状況の確認
承認済みビューでは、承認前の状態では analyst ユーザーがビューに対してクエリを発行してもアクセス拒否されました。一方、承認済みデータセットの場合は問題無くクエリを発行することが可能です。

想定されるユースケース
- 更新されるテーブルが入っているデータセットのテーブル一覧、テーブル構成、データの変更を他のユーザーに行わせたくないが、分析目的などで参照をさせたい場合
- 公開先のユーザーに不必要なレコードやフィールドを公開したくない、あるいは加工済みデータを公開したい場合
- マテリアライズドビューも承認済みで公開できるので効率的なクエリ実行も可能
まとめ
承認済みビュー
承認済みビューは他のプロジェクト、他のデータセットにビューを作成し、作成したビューを承認するという行為が必要です。
作成したビューごとに承認が必要なので、多くのビューを公開しなければならない場合は面倒なケースがあります。
承認済みデータセット
承認済みデータセットを作成すると、その中に作成した元となるデータセットへのビューを通じてデータへの参照を許可することができる。
承認済みビューの煩雑さを軽減したい場合はこちらが有効。