無駄と文化

実用的ブログ

BigQueryまわりのロール - これが足りない/これが過剰

Google Cloud にはいろいろな組み込みロールが用意されていて便利です。
一方で、

  • クエリは実行できるのに結果が見れない
  • データは見れるのにクエリが打てない
  • テーブルを作りたいのに作れない

など、思ってたのと権限が違ってしまうこともあります。

この記事ではよく使うロールと権限をピックアップし、

  • このロールはどういうときに付けたくなるか
  • どの権限が足りない/過剰に感じるか

という観点で整理します。

※ 各ロールの詳細な定義は公式ドキュメントを参照してください。この記事では全ての権限を列挙・解説することはせず、実務上の振る舞いにフォーカスします

 

Google Cloud コンソールを使えるかどうか決める権限

多くの BigQuery ロールには次の権限が含まれています。

権限 説明
resourcemanager.projects.get プロジェクト情報を取得する
resourcemanager.projects.list プロジェクト一覧を取得する

これらは Google Cloud コンソールからプロジェクトを閲覧するために必要な権限です。
これが無いと、BigQuery の権限があっても Google Cloud コンソール上でプロジェクトが見えません。

本記事では以降、この2つの権限については個別には触れません。

 

BigQuery Job User (roles/bigquery.jobUser)

公式ドキュメント: https://docs.cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.dataViewer

BigQuery Job User はクエリを実行するための最小限のロールです。
クエリ実行のために bigquery.jobs.create 権限が必要になります。

※ BigQuery における「ジョブ」とは、クエリ実行・データロード・エクスポート・コピーなどの処理単位を指します

権限 説明
bigquery.jobs.create ジョブを作成する

 

これが足りないかも?

権限 説明 追加を検討
bigquery.datasets.get データセット一覧・情報を取得する BigQuery Metadata Viewer
bigquery.tables.getData テーブルデータを読み取る BigQuery Data Viewer

クエリの実行と結果の表示は別の権限が必要です。
クエリ実行は bigquery.jobs.create 、結果表示は bigquery.tables.getData です。

 

権限 説明 追加を検討
bigquery.jobs.get ジョブ情報を取得する BigQuery Resource Viewer
bigquery.jobs.list ジョブ一覧を取得する BigQuery Resource Viewer

また、このロールは bigquery.jobs.create を持つ一方で bigquery.jobs.get, bigquery.jobs.list を持ちません。
そのため実行済みクエリの履歴や詳細を参照できません。

 

BigQuery Metadata Viewer (roles/bigquery.metadataViewer)

公式ドキュメント: https://docs.cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.metadataViewer

BigQuery Metadata Viewer はデータセット・テーブルのメタデータの参照を許すロールです。
bigquery.datasets.get, bigquery.tables.list, bigquery.tables.get あたりがまとまっていて便利。

例えばメタデータとして次のようなものが見られます。

  • データセット名・説明・ロケーション
  • テーブル名・説明
  • テーブルのスキーマ (カラム名・データ型・制約)
  • パーティション設定・クラスタリング設定
  • 作成日時・更新日時
  • テーブルサイズ・行数

一方で次のようなレコードそのものは見られません。

  • テーブルのプレビュー
  • SELECT * FROM table の実行結果
  • テーブルデータのエクスポートも不可
権限 説明
bigquery.datasets.get データセット情報を取得する
bigquery.datasets.getIamPolicy データセットのIAMポリシーを取得する
bigquery.tables.get テーブル情報を取得する
bigquery.tables.getIamPolicy テーブルのIAMポリシーを取得する
bigquery.tables.list テーブル一覧を取得する

 

これが足りないかも?

権限 説明 追加を検討
bigquery.jobs.create クエリを実行する BigQuery Job User, BigQuery User

BigQuery Metadata Viewer には bigquery.jobs.create が含まれていないのでクエリの実行ができません。

 

BigQuery Data Viewer (roles/bigquery.dataViewer)

公式ドキュメント: https://docs.cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.dataViewer

BigQuery Data Viewer はテーブルの行 (レコード) を表示するための権限を含むロールです。 bigquery.tables.getData がレコードを読み取ることを許します。

権限 説明
bigquery.datasets.get データセット情報を取得する
bigquery.datasets.getIamPolicy データセットの IAM ポリシーを取得する
bigquery.tables.createSnapshot スナップショットを作成する
bigquery.tables.export テーブルデータを出力する
bigquery.tables.get テーブル情報を取得する
bigquery.tables.getData テーブルデータを読み取る
bigquery.tables.getIamPolicy テーブルのIAMポリシーを取得する
bigquery.tables.list テーブル一覧を取得する
bigquery.tables.replicateData テーブルデータを複製する

 

これが足りないかも?

権限 説明 追加を検討
bigquery.jobs.create クエリを実行する BigQuery Job User, BigQuery User

bigquery.tables.getData を持っているので実行済みのクエリの結果を見ることができる一方で、 bigquery.jobs.create を持っていないのでクエリを実行する権限はありません。

 

これが過剰かも?

権限 説明 代替を検討
bigquery.datasets.getIamPolicy データセットの IAM ポリシーを取得する カスタムロール
bigquery.tables.getIamPolicy テーブルの IAM ポリシーを取得する カスタムロール

データセットやテーブルに誰がどんな権限を持っているか見ることができます。場合によっては過剰に思うかも。
ちなみに bigquery.*.setIamPolicy は持っていないので、権限変更をすることはできません。

 

権限 説明 代替を検討
bigquery.tables.createSnapshot スナップショットを作成する カスタムロール
bigquery.tables.export テーブルデータを出力する カスタムロール

テーブルの全レコードをエクスポートできます。
bigquery.tables.getData を持っている時点で全レコードを読めることに変わりありませんが。

 

BigQuery Data Editor (roles/bigquery.dataEditor)

公式ドキュメント: https://docs.cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.dataEditor

BigQuery Data Editor はデータセットの作成を許し、テーブルに対して CRUD (Create, Read, Update, Delete) するための権限がまとまったロールです。

権限 説明
bigquery.config.get BigQuery設定情報を取得する
bigquery.datasets.create データセットを作成する
bigquery.datasets.get データセット情報を取得する
bigquery.datasets.getIamPolicy データセットの IAM ポリシーを取得する
bigquery.datasets.updateTag タグを更新する
bigquery.tables.create テーブルを作成する
bigquery.tables.createIndex インデックスを作成する
bigquery.tables.createSnapshot スナップショットを作成する
bigquery.tables.delete テーブルを削除する
bigquery.tables.deleteIndex インデックスを削除する
bigquery.tables.export テーブルデータを出力する
bigquery.tables.get テーブル情報を取得する
bigquery.tables.getData テーブルデータを読み取る
bigquery.tables.getIamPolicy テーブルの IAM ポリシーを取得する
bigquery.tables.list テーブル一覧を取得する
bigquery.tables.replicateData テーブルデータを複製する
bigquery.tables.restoreSnapshot スナップショットから復元する
bigquery.tables.update テーブルを更新する
bigquery.tables.updateData テーブルデータを更新する
bigquery.tables.updateIndex インデックスを更新する
bigquery.tables.updateTag タグを更新する

 

これが足りないかも?

権限 説明 追加を検討
bigquery.jobs.create クエリを実行する BigQuery Job User, BigQuery User
bigquery.datasets.delete データセットを削除する BigQuery Data Owner, カスタムロール

 

これが過剰かも?

権限 説明 代替を検討
bigquery.tables.delete テーブルを削除する カスタムロール

bigquery.tables.delete を含むのでテーブルを削除できます。テーブルの誤削除を懸念するなら外しておきたくなるかも。

とはいえ、誤ってテーブルを削除してしまった場合でもタイムトラベル期間内 (デフォルトでは7日) であればリカバリー可能です。
リカバリー対応まで見越して運用設計するならば、そこまで重たく考える必要はないかも知れません。

逆に誤削除を防止するために bigquery.tables.delete を外してしまうと CREATE OR REPLACE TABLE が失敗するようになることに注意が必要です。

 

BigQuery User (roles/bigquery.user)

公式ドキュメント: https://docs.cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.user

BigQuery User は クエリを実行して集計分析を行うのに十分な権限を提供するロールです。

権限 説明
bigquery.jobs.create ジョブを作成する
bigquery.jobs.list ジョブ一覧を取得する
bigquery.datasets.create データセットを作成する
bigquery.datasets.get データセット情報を取得する
bigquery.datasets.getIamPolicy データセットのIAMポリシーを取得する
bigquery.tables.list テーブル一覧を取得する
bigquery.readsessions.create 読み取りセッションを作成する
bigquery.readsessions.getData 読み取りセッションからデータを取得する
bigquery.readsessions.update 読み取りセッションを更新する

 

自身が作ったデータセットに BigQuery Data Owner ロールを付与する

BigQuery User をプロジェクトレベルでアタッチした場合、bigquery.datasets.create によってデータセットの新規作成ができるようになります。
データセットを作成すると、そのデータセットに限って BigQuery Data Owner ロール が付与されます。

自分用のデータセットを作ることを許し、そのデータセット中でテーブルの CRUD や権限設定 (bigquery.datasets.setIamPolicy) など一連の操作も許すようになります。

 

これが足りないかも?

権限 説明 追加を検討
bigquery.tables.getData テーブルデータを読み取る BigQuery Data Editor

 

これが過剰かも?

権限 説明 代替を検討
bigquery.datasets.create データセットを作成する BigQuery Job User

前述したように、BigQuery User を持っているアカウントではデータセットを自由に作成し、そのデータセットの中で強い権限を持つようになります。
データセットを乱立されたくない場合は、もっと弱いロールである BigQuery Job User ロール を検討するべきかも知れません。

 

BigQuery Studio User (roles/bigquery.studioUser)

公式ドキュメント: https://docs.cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.studioUser

BigQuery Studio User は BigQuery スタジオと BigQuery ノートブック (Google Colab) を使うのに必要な権限を集めたロールです。
bigquery.jobs.create がクエリの発行、aiplatform.notebookRuntimes.assign がノートブックの操作を許します。

bigquery.readsessions.getData が pandas DataFrame への高速なデータ読み込み (Storage API) を許します。
ただし、実際にデータを読み込むには元テーブルに対する bigquery.tables.getData 権限が別途必要です。

権限 説明
bigquery.jobs.create ジョブを作成する
aiplatform.locations.get Vertex AI ロケーション情報を取得する
aiplatform.notebookRuntimeTemplates.apply ランタイムテンプレートを適用する
aiplatform.notebookRuntimeTemplates.get ランタイムテンプレート情報を取得する
aiplatform.notebookRuntimeTemplates.getIamPolicy ランタイムテンプレートのIAMポリシーを取得する
aiplatform.notebookRuntimeTemplates.list ランタイムテンプレート一覧を取得する
aiplatform.notebookRuntimes.assign ノートブック実行環境を割り当てる
aiplatform.notebookRuntimes.get ノートブック実行環境情報を取得する
aiplatform.notebookRuntimes.list ノートブック実行環境一覧を取得する
aiplatform.operations.list 操作一覧を取得する
bigquery.readsessions.create 読み取りセッションを作成する
bigquery.readsessions.getData 読み取りセッションからデータを取得する
bigquery.readsessions.update 読み取りセッションを更新する

 

これが足りないかも?

権限 説明 追加を検討
bigquery.tables.create テーブルを作成する BigQuery Data Editor
bigquery.tables.update テーブルを更新する BigQuery Data Editor

ノートブックによって分析を実行することは可能ですが、有益な結果が得られたとしてそれを永続化するための権限はありません。
分析結果をどこかのテーブルに書き戻させたい場合には BigQuery Data Editor ロール などを合わせてアタッチすることを検討しましょう。

 

BigQuery Data Owner (roles/bigquery.dataOwner)

公式ドキュメント: https://docs.cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.dataOwner

BigQuery Data Owner は IAM をいじることも可能な、とても強いロールです。
プロジェクトレベル・データセットレベル・テーブルレベルでアタッチすることで、そのプロジェクト・データセット・テーブルに対して削除を含む多くの操作を許します。

権限名 説明
bigquery.dataPolicies.attach データポリシーを適用する
bigquery.dataPolicies.create データポリシーを作成する
bigquery.dataPolicies.delete データポリシーを削除する
bigquery.dataPolicies.get データポリシー情報を取得する
bigquery.dataPolicies.getIamPolicy データポリシーのIAMポリシーを取得する
bigquery.dataPolicies.list データポリシー一覧を取得する
bigquery.dataPolicies.setIamPolicy データポリシーのIAMポリシーを設定する
bigquery.dataPolicies.update データポリシーを更新する
bigquery.rowAccessPolicies.create 行アクセス制御ポリシーを作成する
bigquery.rowAccessPolicies.delete 行アクセス制御ポリシーを削除する
bigquery.rowAccessPolicies.get 行アクセス制御ポリシー情報を取得する
bigquery.rowAccessPolicies.getIamPolicy 行アクセス制御のIAMポリシーを取得する
bigquery.rowAccessPolicies.list 行アクセス制御ポリシー一覧を取得する
bigquery.rowAccessPolicies.setIamPolicy 行アクセス制御のIAMポリシーを設定する
bigquery.rowAccessPolicies.update 行アクセス制御ポリシーを更新する
bigquery.datasets.create データセットを作成する
bigquery.datasets.createTagBinding タグを紐付ける
bigquery.datasets.delete データセットを削除する
bigquery.datasets.deleteTagBinding タグの紐付けを解除する
bigquery.datasets.get データセット情報を取得する
bigquery.datasets.getIamPolicy データセットの IAM ポリシーを取得する
bigquery.datasets.link 共有データセットへのリンクを作成する
bigquery.datasets.listEffectiveTags 有効なタグ一覧を取得する
bigquery.datasets.listSharedDatasetUsage 共有データセットの使用状況を取得する
bigquery.datasets.listTagBindings タグ紐付け一覧を取得する
bigquery.datasets.setIamPolicy データセットのIAMポリシーを設定する
bigquery.datasets.update データセットを更新する
bigquery.datasets.updateTag タグを更新する
bigquery.tables.create テーブルを作成する
bigquery.tables.createIndex インデックスを作成する
bigquery.tables.createSnapshot スナップショットを作成する
bigquery.tables.createTagBinding タグを紐付ける
bigquery.tables.delete テーブルを削除する
bigquery.tables.deleteIndex インデックスを削除する
bigquery.tables.deleteSnapshot スナップショットを削除する
bigquery.tables.deleteTagBinding タグの紐付けを解除する
bigquery.tables.export テーブルデータを出力する
bigquery.tables.get テーブル情報を取得する
bigquery.tables.getData テーブルデータを読み取る
bigquery.tables.getIamPolicy テーブルのIAMポリシーを取得する
bigquery.tables.list テーブル一覧を取得する
bigquery.tables.listEffectiveTags 有効なタグ一覧を取得する
bigquery.tables.listTagBindings タグ紐付け一覧を取得する
bigquery.tables.replicateData テーブルデータを複製する
bigquery.tables.restoreSnapshot スナップショットから復元する
bigquery.tables.setCategory カテゴリを設定する
bigquery.tables.setColumnDataPolicy 列データポリシーを適用する
bigquery.tables.setIamPolicy テーブルのIAMポリシーを設定する
bigquery.tables.update テーブルを更新する
bigquery.tables.updateData テーブルデータを更新する
bigquery.tables.updateIndex インデックスを更新する
bigquery.tables.updateTag タグを更新する

 

これが足りないかも?

権限 説明 追加を検討
bigquery.jobs.create クエリを実行する BigQuery Job User

 

これが過剰かも?

権限 説明 代替を検討
bigquery.datasets.delete データセットを削除する BigQuery Data Editor
bigquery.tables.delete テーブルを削除する カスタムロール

データセット・テーブルを削除できます。誤削除を懸念するなら外しておきたくなるかも。

とはいえ、誤ってデータセット・テーブルを削除してしまった場合でもタイムトラベル期間内 (デフォルトでは7日) であればリカバリー可能です。
リカバリー対応まで見越して運用設計するならば、そこまで重たく考える必要はないかも知れません。

逆に誤削除を防止するために bigquery.tables.delete を外してしまうと CREATE OR REPLACE TABLE が失敗するようになることに注意が必要です。

 

権限 説明 代替を検討
bigquery.datasets.setIamPolicy データセットのIAMポリシーを設定する カスタムロール

データセットのアクセス権限を自由に変更できます。意図せぬアカウントに権限を付与してしまわないように注意が必要です。

 

まとめ

うーん、とってもややこしーですね。
とはいえここに書いたポイントを押さえておけば、ロールを選ぶまたはカスタムロールを定義する判断がしやすくなると思います。

 

 

私からは以上です。