IAM を使用してリソースへのアクセスを制御する
このドキュメントでは、BigQuery データセットと、データセット内のリソース(テーブル、ビュー、ルーティン)のアクセス制御を表示、付与、取り消す方法について説明します。モデルもデータセット レベルのリソースですが、IAM ロールを使用して個々のモデルへのアクセス権を付与することはできません。
Google Cloud リソースへのアクセスを許可するには、Identity and Access Management(IAM)ポリシー(許可ポリシー)を使用します。これはリソースに適用されます。各リソースに適用できる許可ポリシーは 1 つだけです。許可ポリシーは、リソース自体だけでなく、そのリソースの許可ポリシーを継承する子孫へのアクセスも制御します。
許可ポリシーの詳細については、IAM ドキュメントのポリシー構造をご覧ください。
このドキュメントは、 Google Cloudの Identity and Access Management(IAM)に関する知識があることを前提としています。
制限事項
- ルーティン アクセス制御リスト(ACL)は、複製されたルーティンに含まれません。
- 外部データセットまたはリンクされたデータセット内のルーティンは、アクセス制御をサポートしていません。
- 外部データセットまたはリンクされたデータセット内のテーブルは、アクセス制御をサポートしていません。
- ルーティン アクセス制御は、Terraform を使用して設定することはできません。
- ルーティン アクセス制御は、Google Cloud SDK を使用して設定することはできません。
- ルーティン アクセス制御は、BigQuery データ制御言語(DCL)を使用して設定することはできません。
- Data Catalog は、ルーティン アクセス制御をサポートしていません。ユーザーが条件付きでルーティンレベルのアクセス権を付与した場合、BigQuery のサイドパネルにルーティンは表示されません。回避策として、データセット レベルのアクセス権を付与します。
INFORMATION_SCHEMA.OBJECT_PRIVILEGESビューには、ルーティンのアクセス制御は表示されません。
始める前に
このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。
必要なロール
リソースの IAM ポリシーを変更するために必要な権限を取得するには、プロジェクトに対する BigQuery データオーナー(roles/bigquery.dataOwner)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
この事前定義ロールには、リソースの IAM ポリシーを変更するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
リソースの IAM ポリシーを変更するには、次の権限が必要です。
-
データセットのアクセス ポリシーを取得するには:
bigquery.datasets.get -
データセットのアクセス ポリシーを設定するには:
bigquery.datasets.update -
データセットのアクセス ポリシーを取得するには(Google Cloud コンソールのみ):
bigquery.datasets.getIamPolicy -
データセットのアクセス ポリシーを設定するには(コンソールのみ):
bigquery.datasets.setIamPolicy -
テーブルまたはビューのポリシーを取得するには:
bigquery.tables.getIamPolicy -
テーブルまたはビューのポリシーを設定するには:
bigquery.tables.setIamPolicy -
ルーティンのアクセス ポリシーを取得するには:
bigquery.routines.getIamPolicy -
ルーティンのアクセス ポリシーを設定するには:
bigquery.routines.setIamPolicy -
bq ツールまたは SQL BigQuery ジョブ(省略可)を作成するには:
bigquery.jobs.create
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
データセットのアクセス制御を操作する
データセットへのアクセス権を付与するには、プリンシパルがデータセットに対して実行できる操作を決定する事前定義ロールまたはカスタムロールを IAM プリンシパルに付与します。この操作は、リソースに許可ポリシーを適用するとも呼ばれます。アクセス権を付与すると、データセットのアクセス制御を表示したり、データセットへのアクセス権を取り消すことができます。
データセットへのアクセス権を付与する
BigQuery ウェブ UI または bq コマンドライン ツールを使用してデータセットを作成するときに、データセットへのアクセス権を付与することはできません。まずデータセットを作成してから、データセットへのアクセス権を付与する必要があります。この API では、定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出すことで、データセットの作成時にアクセス権を付与できます。
プロジェクトはデータセットの親リソースであり、データセットはテーブル、ビュー、ルーティン、モデルの親リソースです。プロジェクト レベルでロールを付与すると、そのロールとその権限はデータセットとデータセットのリソースに継承されます。同様に、データセット レベルでロールを付与すると、ロールとその権限はデータセット内のリソースに継承されます。
データセットへのアクセス権を付与するには、IAM ロールにデータセットへのアクセス権を付与するか、IAM 条件を使用して条件付きでアクセス権を付与します。条件付きアクセス権の付与の詳細については、IAM Conditions によるアクセス制御をご覧ください。
条件を使用せずに IAM ロールにデータセットへのアクセス権を付与するには、次のいずれかのオプションを選択します。
コンソール
[BigQuery] ページに移動します。
左側のペインで、 エクスプローラをクリックします。

左側のペインが表示されていない場合は、 [左ペインを開く] をクリックしてペインを開きます。
[エクスプローラ] ペインでプロジェクトを開き、[データセット] をクリックして、データセットを選択します。
[共有] > [権限] の順にクリックします。
[ プリンシパルを追加] をクリックします。
[新しいプリンシパル] フィールドに、プリンシパルを入力します。
[ロールを選択] リストで、事前定義ロールまたはカスタムロールを選択します。
[保存] をクリックします。
データセット情報に戻るには、[閉じる] をクリックします。
SQL
プリンシパルにデータセットへのアクセス権を付与するには、GRANT DCL ステートメントを使用します。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
GRANT `ROLE_LIST` ON SCHEMA RESOURCE_NAME TO "USER_LIST"
次のように置き換えます。
ROLE_LIST: 付与するロールまたはカンマ区切りのロールのリストRESOURCE_NAME: アクセス権を付与するデータセットの名前USER_LIST: ロールが付与されているユーザーのカンマ区切りのリスト有効な形式の一覧については、
user_listをご覧ください。
[実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
次の例では、myDataset に BigQuery データ閲覧者のロールを付与します。
GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:user@example.com", "user:user2@example.com"
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
既存のデータセット情報(アクセス制御を含む)を JSON ファイルに書き込むには、
bq showコマンドを使用します。bq show \ --format=prettyjson \ PROJECT_ID:DATASET > PATH_TO_FILE
次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- DATASET: データセットの名前
- PATH_TO_FILE: ローカルマシン上の 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" } ], ... }
編集が完了したら、
bq updateコマンドを実行します。その際、--sourceフラグを使用して JSON ファイルを指定します。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、PROJECT_ID:DATASETの形式でプロジェクト ID をデータセット名に追加します。bq update
--source PATH_TO_FILE
PROJECT_ID:DATASETアクセス制御の変更を確認するには、
bq showコマンドをもう一度使用します。ただし、今回は情報をファイルに書き込む指定を省略します。bq show --format=prettyjson PROJECT_ID:DATASET
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tfにする必要があります(例:main.tf)。このチュートリアルでは、このファイルをmain.tfとします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tfにサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
terraform init
最新バージョンの Google プロバイダを使用する場合は、
-upgradeオプションを使用します。terraform init -upgrade
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行します。プロンプトで「
yes」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。 Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
Terraform
google_bigquery_dataset_iam リソースを使用して、データセットへのアクセス権を更新します。
データセットのアクセス制御ポリシーを設定する
次の例では、google_bigquery_dataset_iam_policy リソースを使用して、mydataset データセットの IAM ポリシーを設定する方法を示します。これにより、データセットにすでにアタッチされている既存のポリシーが置き換えられます。
# This file sets the IAM policy for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". data "google_iam_policy" "iam_policy" { binding { role = "roles/bigquery.admin" members = [ "user:user@example.com", ] } binding { role = "roles/bigquery.dataOwner" members = [ "group:data.admin@example.com", ] } binding { role = "roles/bigquery.dataEditor" members = [ "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.iam.gserviceaccount.com", ] } } resource "google_bigquery_dataset_iam_policy" "dataset_iam_policy" { dataset_id = google_bigquery_dataset.default.dataset_id policy_data = data.google_iam_policy.iam_policy.policy_data }
データセットのロール メンバーシップを設定する
次の例では、google_bigquery_dataset_iam_binding リソースを使用して、mydataset データセットの特定のロールのメンバーシップを設定する方法を示します。これにより、そのロールの既存のメンバーシップがすべて置き換えられます。データセットの IAM ポリシー内の他のロールは保持されます。
# This file sets membership in an IAM role for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". resource "google_bigquery_dataset_iam_binding" "dataset_iam_binding" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.jobUser" members = [ "user:user@example.com", "group:group@example.com" ] }
単一のプリンシパルのロール メンバーシップを設定する
次の例は、単一のプリンシパルにロールを付与するために、google_bigquery_dataset_iam_member リソースを使用して mydataset データセットの IAM ポリシーを更新する方法を示しています。この IAM ポリシーを更新しても、データセットに対してそのロールが付与されている他のプリンシパルのアクセス権には影響しません。
# This file adds a member to an IAM role for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". resource "google_bigquery_dataset_iam_member" "dataset_iam_member" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.user" member = "user:user@example.com" }
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
変更を適用する
API
データセットの作成時にアクセス制御を適用するには、定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。アクセス制御を更新するには、datasets.patch メソッドを呼び出して、Dataset リソースの access プロパティを使用します。
datasets.update メソッドは、データセット リソース全体を置き換えるため、アクセス制御の更新には datasets.patch メソッドのほうが適切です。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
DatasetMetadataToUpdate タイプの新しいエントリを既存のリストに追加して、新しいアクセスリストを設定します。次に、dataset.Update() 関数を呼び出してプロパティを更新します。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。