はじめに
弊社では、分析やデータソリューション開発、データ基盤構築など様々なデータ関連のプロジェクトを進めています。その中には、BigQueryを中心とするGCPデータ基盤構築のプロジェクトもあります。この記事では、機密性の高いデータも取り扱うそのプロジェクトで、実際に私が利用した承認済ビューという機能についてまとめたいと思います。
要約
BigQueryにて、あるテーブルへのアクセス権限は与えたくないが、そのデータをソースにするビューへのアクセスは可能にしたい、というユースケースは、承認済ビュー(Authorized View)機能を利用することで、実現可能。
詳細
ビューとは
ビューとは 、別のテーブル(orビュー)へのSQL クエリによって定義される仮想テーブルです。ビューの作成後は、テーブルをクエリするのと同じ方法でビューをクエリします。
データの実体は持たず(=ストレージは消費せず)、都度ビューへクエリされるたびに、ソースデータへのクエリが実行されます(指定した期間、クエリの結果を保持するマテリアライズドビューというものもあります)
頻繁に使う加工処理や結合処理をビューにして、普段の処理を簡略化したり、テーブルから一部のアクセス制限を行いたいカラムを除いて機密性を下げたりする際に用いられます。
ビューのアクセス権限
BigQueryにおいてビューへアクセスする際、本来は、ビュー自体へのアクセス権限に加えて、ビューのソースとなるテーブルへのアクセス権限も必要となります。下記の図で言うと、Aの構成でのみビューへのクエリが実行できます(データセットの権限は配下のテーブル・ビューに継承されます)
なお、ソースのテーブルへのアクセス権限が無い場合は、ビューにアクセスした際に下記のようなエラーが出てきます。ビューへアクセスしているのに、テーブルへのアクセス権限が無いよ、と怒られます。
Access Denied: Table {ソーステーブルのID}: User does not have permission to query table {ソーステーブルのID}, or perhaps it does not exist in location {ビューのロケーション}.
承認済ビューのユースケース
しかし、中にはソースデータのテーブルへのアクセス権限は渡さずに、ビューへのアクセス権限を渡したい、というユースケースもあります。
例えば、個人情報を含むデータをソースに対して、個人情報に該当する列を省いた(あるいは加工した)ビューを作成し、個人情報を扱う権限がないユーザに対して、ソースデータへのアクセスは不可にしつつ、ビューのみアクセス可能にしたい、というようなケースです。構成でいうと、先ほどの図でいうところのBのようなイメージです。
そのようなときに役に立つのが承認済みビューという機能です。
承認済ビューの概要
承認済ビュー機能は、ビューへのアクセス権限だけで、ソースデータのテーブルへのアクセス権限が無くてもビューへクエリが実行できるようにする機能です。英語ではAuthorized Viewsと表記します(個人的には、「承認済み」という名前がちょっとわかりづらいと思っており、「認可済」とかの和訳の方が直感的に理解しやすいんじゃないかな、、と思ってます)
設定方法
ソースデータのテーブルが存在するデータセット(ソースが複数ある場合は全て)から、ビューを「承認」することで、本機能を利用することができます。ざっくりな手順を下記に記載します。具体的な詳細手順や設定する際に必要なIAM権限などは公式ドキュメントをご確認ください。
- ビューを作成する
- ユーザに対してビューへのアクセス権限を付与する
- ビューのソースデータが属するデータセットにて、「承認済ビュー」として対象のビューを指定する
先ほどの図におけるBにおいて、承認済ビュー設定をしたのが下記のB'になります。
承認済データセット
ビューが複数存在する場合、都度ビューを「承認済ビュー」へ追加するのは煩わしいかなと思います。そのような時に役に立つのが承認済データセットという機能です。これはビューの代わりにデータセットを承認対象として設定するもので、承認されたデータセット配下のビューは全て承認済ビュー同様、ソースデータへのアクセス権限無しに、クエリ実行可能となります。
先ほどの図におけるBにおいて、承認済データセット設定をしたのが下記のB''になります。1つの設定で全てのビューに適用できます。また以後作成されるビューにおいても自動で承認設定が適用されます。
終わりに
データ基盤を構築するうえで、切っても切り離せないアクセス制御において、柔軟な設定を可能にするのが、今回紹介した承認済ビュー機能です。GCPデータ基盤のアクセス制御の設計を任された際には、ぜひご活用をご検討ください!