データセットへのアクセスの制御
このドキュメントでは、BigQuery 内のデータセットへのアクセスを制御する方法を説明します。
さらに、次のことも可能です。
- テーブルレベルとビューレベルでアクセスを制御する。
- IAM リソース階層の上位レベルでアクセスを制御する。
概要
データセット レベルの権限により、特定のデータセット内のテーブル、ビュー、テーブルデータにアクセスできるユーザー、グループ、サービス アカウントが決まります。たとえば、あるユーザーに特定のデータセットに対する bigquery.dataOwner
Identity and Access Management(IAM)ロールを付与した場合、そのユーザーはそのデータセット内のテーブルとビューを作成、更新、削除できます。
データセットの作成時にアクセス制御を適用するには、datasets.insert
API メソッドを呼び出します。
Google Cloud Console、bq
コマンドライン ツール、データ定義言語(DDL)ステートメントでデータセットを作成している間は、アクセス制御を適用できません。
データセットを作成した後、次の方法でアクセス制御を適用できます。
- Google Cloud コンソールの使用
GRANT
とREVOKE
DCL ステートメントを使用する。bq
コマンドライン ツールでbq update
コマンドを使用する。datasets.patch
API メソッドを呼び出す。- クライアント ライブラリを使用する。
始める前に
このドキュメントの各タスクを行うために必要な権限をユーザーに与える IAM ロールを付与します。
必要な権限
データセットへのアクセスを制御するには、次の IAM 権限が必要です。
bigquery.datasets.update
bigquery.datasets.get
bigquery.datasets.getIamPolicy
(Google Cloud Console を使用してデータセットへのアクセスを制御できます)bigquery.datasets.setIamPolicy
(Google Cloud Console を使用してデータセットへのアクセスを制御できます)
IAM 事前定義ロール roles/bigquery.dataOwner
には、データセットへのアクセスを制御するために必要な権限が含まれています。
BigQuery での IAM のロールと権限については、事前定義ロールと権限をご覧ください。
データセットへのアクセス権の付与
データセットへのアクセス権を付与するには:
Console
[エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。
詳細パネルで、[共有] > [権限] をクリックします。
[プリンシパルを追加] をクリックします。
[新しいプリンシパル] フィールドに、追加するエンティティを入力します。 次のエンティティを追加できます。
- Google アカウントのメールアドレス: 個々の Google アカウントにデータセットへのアクセスを許可します。
- Google グループ: Google グループ内のすべてのメンバーにデータセットへのアクセスを許可します。
- Google Apps ドメイン: Google ドメイン内のすべてのユーザーとグループにデータセットへのアクセスを許可します。
- サービス アカウント: サービス アカウントにデータセットへのアクセスを許可します。
- 全員: 「
allUsers
」と入力して、一般ユーザーにアクセス権を付与します。 - すべての Google アカウント: Google アカウントによって認証されたすべてのサービス アカウントとインターネット上のすべてのユーザーにアクセス権を付与するには、「
allAuthenticatedUsers
」と入力します。例:user@gmail.com
[ロールを選択] で、[BigQuery] を選択し、新しいメンバーに適切な定義済みの IAM ロールを選択します。事前定義された各 BigQuery ロールに割り当てられている権限の詳細については、アクセス制御ページのロールのセクションをご覧ください。
[完了] をクリックします。
SQL
次の例では、GRANT
DCL ステートメントを使用して、データセット mydataset
のユーザー joe@example.com
に BigQuery データ閲覧者(roles/bigquery.dataViewer
)ロールを付与します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
GRANT
`roles/bigquery.dataViewer`
ON SCHEMA mydataset TO 'user:joe@example.com';[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリの実行をご覧ください。
bq
show
コマンドを使用して、既存のデータセット情報(アクセス制御も含む)を JSON ファイルに書き込みます。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset
の形式でプロジェクト ID をデータセット名に追加します。bq show \ --format=prettyjson \ project_id:dataset > path_to_file
以下を置き換えます。
- project_id はプロジェクト ID です。
- dataset はデータセットの名前です。
- path_to_file は、ローカルマシン上の JSON ファイルへのパスです。
例:
次のコマンドを入力すると、
mydataset
のアクセス制御が JSON ファイルに書き込まれます。mydataset
はデフォルト プロジェクトにあります。bq show --format=prettyjson mydataset > /tmp/mydataset.json
次のコマンドを入力すると、
mydataset
のアクセス制御が JSON ファイルに書き込まれます。mydataset
はmyotherproject
にあります。bq show --format=prettyjson \ myotherproject:mydataset > /tmp/mydataset.json
JSON ファイルの
"access"
セクションに変更を加えます。specialGroup
エントリ(projectOwners
、projectWriters
、projectReaders
、allAuthenticatedUsers
)はどれも追加できます。さらに、userByEmail
、groupByEmail
、domain
の追加や変更もできます。たとえば、データセットの JSON ファイルの access セクションは次のようになります。
{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" }, { "role": "READER", "specialGroup": "allAuthenticatedUsers" }, { "role": "READER", "domain": "domain_name" }, { "role": "WRITER", "userByEmail": "user_email" }, { "role": "WRITER", "userByEmail": "service_account_email" }, { "role": "READER", "groupByEmail": "group_email" } ], ... }
編集が完了したら、
update
コマンドを実行します。その際、--source
フラグを使用して JSON ファイルを指定します。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset
の形式でプロジェクト ID をデータセット名に追加します。bq update \ --source path_to_file \ project_id:dataset
以下を置き換えます。
- path_to_file は、ローカルマシン上の JSON ファイルへのパスです。
- project_id はプロジェクト ID です。
- dataset はデータセットの名前です。
例:
次のコマンドを入力すると、
mydataset
のアクセス制御が更新されます。mydataset
はデフォルト プロジェクトにあります。bq update --source /tmp/mydataset.json mydataset
次のコマンドを入力すると、
mydataset
のアクセス制御が更新されます。mydataset
はmyotherproject
にあります。bq update --source /tmp/mydataset.json myotherproject:mydataset
アクセス制御の変更を確認するには、
show
コマンドをもう一度入力します。ただし、今回は情報をファイルに書き込む指定を省略します。bq show --format=prettyjson dataset
または
bq show --format=prettyjson project_id:dataset
API
データセットの作成時にアクセス制御を適用するには、定義済みのデータセット リソースを使用して datasets.insert
を呼び出します。アクセス制御を更新するには、Dataset
リソースで datasets.patch
を呼び出して access
プロパティを使用します。
datasets.update
メソッドはデータセット リソース全体を置き換えるので、アクセス制御の更新には datasets.patch
メソッドのほうが適切です。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Go の手順に沿って設定を行ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Java の手順に沿って設定を行ってください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Python の手順に沿って設定を行ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
dataset.access_entries プロパティを使用してデータセットのアクセス制御を設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。データセットへのアクセス権の取消
データセットへのアクセスを取り消すには:
Console
[エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。
詳細パネルで、[共有] > [権限] をクリックします。
[データセットの権限] ダイアログで、メンバーシップを変更するロールを開きます。
削除するユーザー アカウントの [削除] アイコン
をクリックします。[メンバーを削除しますか?] ダイアログで [削除] をクリックします。
[完了] をクリックします。
SQL
次の例では、REVOKE
DCL ステートメントを使用して、データセット mydataset
のユーザー joe@example.com
から BigQuery データ閲覧者(roles/bigquery.dataViewer
)ロールを削除します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
REVOKE
`roles/bigquery.dataViewer`
ON SCHEMA mydataset FROM 'user:joe@example.com';[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリの実行をご覧ください。
bq
show
コマンドを使用して、既存のデータセット情報(アクセス制御も含む)を JSON ファイルに書き込みます。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset
の形式でプロジェクト ID をデータセット名に追加します。bq show \ --format=prettyjson \ project_id:dataset > path_to_file
以下を置き換えます。
- project_id はプロジェクト ID です。
- dataset はデータセットの名前です。
- path_to_file は、ローカルマシン上の JSON ファイルへのパスです。
例:
次のコマンドを入力すると、
mydataset
のアクセス制御が JSON ファイルに書き込まれます。mydataset
はデフォルト プロジェクトにあります。bq show --format=prettyjson mydataset > /tmp/mydataset.json
次のコマンドを入力すると、
mydataset
のアクセス制御が JSON ファイルに書き込まれます。mydataset
はmyotherproject
にあります。bq show --format=prettyjson \ myotherproject:mydataset > /tmp/mydataset.json
JSON ファイルの
"access"
セクションに変更を加えます。specialGroup
のエントリ(projectOwners
、projectWriters
、projectReaders
、allAuthenticatedUsers
)は削除できます。さらに、userByEmail
、groupByEmail
、domain
の削除もできます。たとえば、データセットの JSON ファイルの access セクションは次のようになります。
{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" }, { "role": "READER", "specialGroup": "allAuthenticatedUsers" }, { "role": "READER", "domain": "domain_name" }, { "role": "WRITER", "userByEmail": "user_email" }, { "role": "READER", "groupByEmail": "group_email" } ], ... }
編集が完了したら、
update
コマンドを実行します。その際、--source
フラグを使用して JSON ファイルを指定します。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset
の形式でプロジェクト ID をデータセット名に追加します。bq update \ --source path_to_file \ project_id:dataset
以下を置き換えます。
- path_to_file は、ローカルマシン上の JSON ファイルへのパスです。
- project_id はプロジェクト ID です。
- dataset はデータセットの名前です。
例:
次のコマンドを入力すると、
mydataset
のアクセス制御が更新されます。mydataset
はデフォルト プロジェクトにあります。bq update --source /tmp/mydataset.json mydataset
次のコマンドを入力すると、
mydataset
のアクセス制御が更新されます。mydataset
はmyotherproject
にあります。bq update --source /tmp/mydataset.json myotherproject:mydataset
アクセス制御の変更を確認するには、
show
コマンドをもう一度入力します。ただし、今回は情報をファイルに書き込む指定を省略します。bq show --format=prettyjson dataset
または
bq show --format=prettyjson project_id:dataset
API
アクセス制御を更新するには、Dataset
リソースで datasets.patch
を呼び出して access
プロパティを使用します。
datasets.update
メソッドはデータセット リソース全体を置き換えるので、アクセス制御の更新には datasets.patch
メソッドのほうが適切です。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Go の手順に沿って設定を行ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートの Python の手順に沿って設定を行ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
dataset.access_entries プロパティを使用してデータセットのアクセス制御を設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。次のステップ
- データセットの作成方法について詳しくは、データセットの作成をご覧ください。
- プロジェクト内のデータセットを一覧表示する方法について詳しくは、データセットの一覧表示をご覧ください。
- データセット メタデータの詳細については、データセットに関する情報の取得をご覧ください。
- データセット プロパティの変更方法について詳しくは、データセットの更新をご覧ください。
- ラベルの作成と管理の詳細は、ラベルの作成と管理をご覧ください。