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ポリシーを設定する | カスタムロール |
データセットのアクセス権限を自由に変更できます。意図せぬアカウントに権限を付与してしまわないように注意が必要です。
まとめ
うーん、とってもややこしーですね。
とはいえここに書いたポイントを押さえておけば、ロールを選ぶまたはカスタムロールを定義する判断がしやすくなると思います。
私からは以上です。