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 ロールにデータセットへのアクセス権を付与するには、次のいずれかのオプションを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. 左側のペインで、 エクスプローラをクリックします。

    ハイライト表示されたエクスプローラ ペインのボタン。

    左側のペインが表示されていない場合は、 [左ペインを開く] をクリックしてペインを開きます。

  3. [エクスプローラ] ペインでプロジェクトを開き、[データセット] をクリックして、データセットを選択します。

  4. [共有] > [権限] の順にクリックします。

  5. [ プリンシパルを追加] をクリックします。

  6. [新しいプリンシパル] フィールドに、プリンシパルを入力します。

  7. [ロールを選択] リストで、事前定義ロールまたはカスタムロールを選択します。

  8. [保存] をクリックします。

  9. データセット情報に戻るには、[閉じる] をクリックします。

SQL

プリンシパルにデータセットへのアクセス権を付与するには、GRANT DCL ステートメントを使用します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    GRANT `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    TO "USER_LIST"

    次のように置き換えます。

    • ROLE_LIST: 付与するロールまたはカンマ区切りのロールのリスト
    • RESOURCE_NAME: アクセス権を付与するデータセットの名前
    • USER_LIST: ロールが付与されているユーザーのカンマ区切りのリスト

      有効な形式の一覧については、user_list をご覧ください。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

次の例では、myDataset に BigQuery データ閲覧者のロールを付与します。

GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:user@example.com", "user:user2@example.com"

bq

  1. In the Google Cloud console, activate Cloud Shell.

    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.

  2. 既存のデータセット情報(アクセス制御を含む)を JSON ファイルに書き込むには、bq show コマンドを使用します。

    bq show \
        --format=prettyjson \
        PROJECT_ID:DATASET > PATH_TO_FILE

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET: データセットの名前
    • PATH_TO_FILE: ローカルマシン上の JSON ファイルへのパス
  3. JSON ファイルの access セクションに変更を加えます。specialGroup エントリ(projectOwnersprojectWritersprojectReadersallAuthenticatedUsers)はどれも追加できます。また、userByEmailgroupByEmaildomain も追加できます。

    たとえば、データセットの 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"
      }
     ],
     ...
    }
  4. 編集が完了したら、bq update コマンドを実行します。その際、--source フラグを使用して JSON ファイルを指定します。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、PROJECT_ID:DATASET の形式でプロジェクト ID をデータセット名に追加します。

      bq update 
    --source PATH_TO_FILE
    PROJECT_ID:DATASET

  5. アクセス制御の変更を確認するには、bq show コマンドをもう一度使用します。ただし、今回は情報をファイルに書き込む指定を省略します。

    bq show --format=prettyjson PROJECT_ID:DATASET
  6. 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 を準備する

    1. Cloud Shell を起動します。
    2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

      このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

    ディレクトリを準備する

    Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

    1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

      新しく作成した main.tf にサンプルコードをコピーします。

      必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

    3. 環境に適用するサンプル パラメータを確認し、変更します。
    4. 変更を保存します。
    5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
      terraform init

      最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

      terraform init -upgrade

    変更を適用する

    1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
      terraform plan

      必要に応じて構成を修正します。

    2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
      terraform apply

      Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

    3. Google Cloud プロジェクトを開いて結果を表示します。 Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

    API

    データセットの作成時にアクセス制御を適用するには、定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。アクセス制御を更新するには、datasets.patch メソッドを呼び出して、Dataset リソースの access プロパティを使用します。

    datasets.update メソッドは、データセット リソース全体を置き換えるため、アクセス制御の更新には datasets.patch メソッドのほうが適切です。

    Go

    このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

    BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

    DatasetMetadataToUpdate タイプの新しいエントリを既存のリストに追加して、新しいアクセスリストを設定します。次に、dataset.Update() 関数を呼び出してプロパティを更新します。
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // grantAccessToDataset creates a new ACL conceding the READER role to the group "example-analyst-group@google.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func grantAccessToDataset(w io.Writer, projectID, datasetID string) error {
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    
    	ctx := context.Background()
    
    	// Create BigQuery handler.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Create dataset handler
    	dataset := client.Dataset(datasetID)
    
    	// Get metadata
    	meta, err := dataset.Metadata(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Metadata: %w", err)
    	}
    
    	// Find more details about BigQuery Entity Types here:
    	// https://pkg.go.dev/cloud.google.com/go/bigquery#EntityType
    	//
    	// Find more details about BigQuery Access Roles here:
    	// https://pkg.go.dev/cloud.google.com/go/bigquery#AccessRole
    
    	entityType := bigquery.GroupEmailEntity
    	entityID := "example-analyst-group@google.com"
    	roleType := bigquery.ReaderRole
    
    	// Append a new access control entry to the existing access list.
    	update := bigquery.DatasetMetadataToUpdate{
    		Access: append(meta.Access, &bigquery.AccessEntry{
    			Role:       roleType,
    			EntityType: entityType,
    			Entity:     entityID,
    		}),
    	}
    
    	// Leverage the ETag for the update to assert there's been no modifications to the
    	// dataset since the metadata was originally read.
    	meta, err = dataset.Update(ctx, update, meta.ETag)
    	if err != nil {
    		return err
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)
    	for _, access := range meta.Access {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", access.Role)
    		fmt.Fprintf(w, "Entities: %v\n", access.Entity)
    	}
    
    	return nil
    }
    

    Java

    このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

    BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

    import com.google.cloud.bigquery.Acl;
    import com.google.cloud.bigquery.Acl.Entity;
    import com.google.cloud.bigquery.Acl.Group;
    import com.google.cloud.bigquery.Acl.Role;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;
    import com.google.cloud.bigquery.DatasetId;
    import java.util.ArrayList;
    import java.util.List;
    
    public class GrantAccessToDataset {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project and dataset from which to get the access policy
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        // Group to add to the ACL
        String entityEmail = "group-to-add@example.com";
    
        grantAccessToDataset(projectId, datasetName, entityEmail);
      }
    
      public static void grantAccessToDataset(
          String projectId, String datasetName, String entityEmail) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create datasetId with the projectId and the datasetName.
          DatasetId datasetId = DatasetId.of(projectId, datasetName);
          Dataset dataset = bigquery.getDataset(datasetId);
    
          // Create a new Entity with the corresponding type and email
          // "user-or-group-to-add@example.com"
          // For more information on the types of Entities available see:
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity
          // and
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity.Type
          Entity entity = new Group(entityEmail);
    
          // Create a new ACL granting the READER role to the group with the entity email
          // "user-or-group-to-add@example.com"
          // For more information on the types of ACLs available see:
          // https://cloud.google.com/storage/docs/access-control/lists
          Acl newEntry = Acl.of(entity, Role.READER);
    
          // Get a copy of the ACLs list from the dataset and append the new entry.
          List<Acl> acls = new ArrayList<>(dataset.getAcl());
          acls.add(newEntry);
    
          // Update the ACLs by setting the new list.
          Dataset updatedDataset = bigquery.update(dataset.toBuilder().setAcl(acls).build());
          System.out.println(
              "ACLs of dataset \""
                  + updatedDataset.getDatasetId().getDataset()
                  + "\" updated successfully");
        } catch (BigQueryException e) {
          System.out.println("ACLs were not updated \n" + e.toString());
        }
      }
    }

    Node.js

    このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

    BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

    Dataset#metadata メソッドを使用して、新しいエントリを既存のリストに追加し、新しいアクセスリストを設定します。次に、Dataset#setMetadata() 関数を呼び出してプロパティを更新します。
    
    /**
     * TODO(developer): Update and un-comment below lines.
     */
    
    // const datasetId = "my_project_id.my_dataset_name";
    
    // ID of the user or group from whom you are adding access.
    // const entityId = "user-or-group-to-add@example.com";
    
    // One of the "Basic roles for datasets" described here:
    // https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
    // const role = "READER";
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const client = new BigQuery();
    
    // Type of entity you are granting access to.
    // Find allowed allowed entity type names here:
    // https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource:-dataset
    const entityType = 'groupByEmail';
    
    async function grantAccessToDataset() {
      const [dataset] = await client.dataset(datasetId).get();
    
      // The 'access entries' array is immutable. Create a copy for modifications.
      const entries = [...dataset.metadata.access];
    
      // Append an AccessEntry to grant the role to a dataset.
      // Find more details about the AccessEntry object in the BigQuery documentation:
      // https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
      entries.push({
        role,
        [entityType]: entityId,
      });
    
      // Assign the array of AccessEntries back to the dataset.
      const metadata = {
        access: entries,
      };
    
      // Update will only succeed if the dataset
      // has not been modified externally since retrieval.
      //
      // See the BigQuery client library documentation for more details on metadata updates:
      // https://cloud.google.com/nodejs/docs/reference/bigquery/latest
    
      // Update just the 'access entries' property of the dataset.
      await client.dataset(datasetId).setMetadata(metadata);
    
      console.log(
        `Role '${role}' granted for entity '${entityId}' in '${datasetId}'.`
      );
    }

    Python

    このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

    BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

    dataset.access_entries プロパティに、データセットのアクセス制御を設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。
    from google.api_core.exceptions import PreconditionFailed
    from google.cloud import bigquery
    from google.cloud.bigquery.enums import EntityTypes
    
    # TODO(developer): Update and uncomment the lines below.
    
    # ID of the dataset to grant access to.
    # dataset_id = "my_project_id.my_dataset"
    
    # ID of the user or group receiving access to the dataset.
    # Alternatively, the JSON REST API representation of the entity,
    # such as the view's table reference.
    # entity_id = "user-or-group-to-add@example.com"
    
    # One of the "Basic roles for datasets" described here:
    # https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
    # role = "READER"
    
    # Type of entity you are granting access to.
    # Find allowed allowed entity type names here:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/enums#class-googlecloudbigqueryenumsentitytypesvalue
    entity_type = EntityTypes.GROUP_BY_EMAIL
    
    # Instantiate a client.
    client = bigquery.Client()
    
    # Get a reference to the dataset.
    dataset = client.get_dataset(dataset_id)
    
    # The `access_entries` list is immutable. Create a copy for modifications.
    entries = list(dataset.access_entries)
    
    # Append an AccessEntry to grant the role to a dataset.
    # Find more details about the AccessEntry object here:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
    entries.append(
        bigquery.AccessEntry(
            role=role,
            entity_type=entity_type,
            entity_id=entity_id,
        )
    )
    
    # Assign the list of AccessEntries back to the dataset.
    dataset.access_entries = entries
    
    # Update will only succeed if the dataset
    # has not been modified externally since retrieval.
    #
    # See the BigQuery client library documentation for more details on `update_dataset`:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.client.Client#google_cloud_bigquery_client_Client_update_dataset
    try:
        # Update just the `access_entries` property of the dataset.
        dataset = client.update_dataset(
            dataset,
            ["access_entries"],
        )
    
        # Show a success message.
        full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
        print(
            f"Role '{role}' granted for entity '{entity_id}'"
            f" in dataset '{full_dataset_id}'."
        )
    except PreconditionFailed:  # A read-modify-write error
        print(
            f"Dataset '{dataset.dataset_id}' was modified remotely before this update. "
            "Fetch the latest version and retry."
        )

データセットへのアクセス権を付与する事前定義ロール

次の IAM 事前定義ロールにデータセットへのアクセス権を付与できます。

ロール 説明
BigQuery データオーナーroles/bigquery.dataOwner このロールをデータセットに関して付与すると、次の権限が与えられます。
  • データセットと、データセット内のすべてのリソース(テーブルとビュー、モデル、ルーティン)に対するすべての権限。
BigQuery データ編集者roles/bigquery.dataEditor このロールをデータセットに関して付与すると、次の権限が与えられます。
  • データセットのメタデータと権限の取得。
  • テーブルとビューに対して:
    • データセットのテーブルとビューの作成、更新、取得、一覧表示、削除。
    • テーブルデータの読み取り(クエリ)、エクスポート、複製、更新。
    • インデックスの作成、更新、削除。
    • スナップショットの作成と復元。
  • データセットのルーティンとモデルに対するすべての権限。
BigQuery データ閲覧者roles/bigquery.dataViewer このロールをデータセットに関して付与すると、次の権限が与えられます。
  • データセットのメタデータと権限の取得。
  • データセットのテーブル、ビュー、モデルの一覧表示。
  • データセットのテーブルとビューのメタデータとアクセス制御の取得。
  • テーブルデータの読み取り(クエリ)、複製、エクスポート、スナップショットの作成。
  • データセットのルーティンの一覧表示と呼び出し。
BigQuery メタデータ閲覧者roles/bigquery.metadataViewer このロールをデータセットに関して付与すると、次の権限が与えられます。
  • データセットのメタデータとアクセス制御の取得。
  • テーブルとビューのメタデータとアクセス制御の取得。
  • データセットのモデルとルーティンからのメタデータの取得。
  • データセット内のテーブル、ビュー、モデル、ルーティンの一覧表示。

データセットの権限

bigquery.datasets で始まるほとんどの権限は、データセット レベルで適用されます。ただし、bigquery.datasets.create は異なります。データセットを作成するには、親コンテナ(プロジェクト)のロールに bigquery.datasets.create 権限が付与されている必要があります。

次の表に、データセットのすべての権限と、権限を適用できる最下位のリソースを示します。

権限 リソース アクション
bigquery.datasets.create プロジェクト プロジェクトに新しいデータセットを作成する。
bigquery.datasets.get データセット データセットのメタデータとアクセス制御を取得する。コンソールで権限を表示するには、bigquery.datasets.getIamPolicy 権限も必要です。
bigquery.datasets.getIamPolicy データセット コンソールで、データセットのアクセス制御を取得する権限をユーザーに付与するために必要です。フェール オープン。コンソールでデータセットを表示するには、bigquery.datasets.get 権限も必要です。
bigquery.datasets.update データセット データセットのメタデータとアクセス制御を更新する。コンソールでアクセス制御を更新するには、bigquery.datasets.setIamPolicy 権限も必要です。
bigquery.datasets.setIamPolicy データセット コンソールで、データセットのアクセス制御を設定する権限をユーザーに付与するために必要です。フェール オープン。コンソールでデータセットを更新するには、bigquery.datasets.update 権限も必要です。
bigquery.datasets.delete データセット データセットを削除する。
bigquery.datasets.createTagBinding データセット データセットにタグを適用する。
bigquery.datasets.deleteTagBinding データセット データセットからタグの適用を解除する。
bigquery.datasets.listTagBindings データセット データセットのタグを一覧表示する。
bigquery.datasets.listEffectiveTags データセット データセットの有効なタグ(適用済みと継承済み)を一覧表示する。
bigquery.datasets.link データセット リンクされたデータセットを作成します。
bigquery.datasets.listSharedDatasetUsage プロジェクト プロジェクト内でアクセス権のあるデータセットについて、共有データセットの使用統計情報を一覧表示する。この権限は、INFORMATION_SCHEMA.SHARED_DATASET_USAGE ビューにクエリを実行するために必要です。

データセットのアクセス制御を表示する

データセットに明示的に設定されたアクセス制御を表示するには、次のいずれかのオプションを選択します。データセットで継承されたロールを確認するには、BigQuery ウェブ UI を使用します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. 左側のペインで、 エクスプローラをクリックします。

    エクスプローラ ペインのボタンがハイライト表示されている。

  3. [エクスプローラ] ペインでプロジェクトを開き、[データセット] をクリックして、データセットを選択します。

  4. [共有] > [権限] の順にクリックします。

    データセットのアクセス制御が [データセットの権限] ペインに表示されます。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    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.

  2. 既存のポリシーを取得して JSON でローカル ファイルに出力するには、Cloud Shell で bq show コマンドを使用します。

    bq show \
       --format=prettyjson \
       PROJECT_ID:DATASET > PATH_TO_FILE

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET: データセットの名前
    • PATH_TO_FILE: ローカルマシン上の JSON ファイルのパス
  3. SQL

    INFORMATION_SCHEMA.OBJECT_PRIVILEGES ビューをクエリします。データセットのアクセス制御を取得するクエリでは、object_name を指定する必要があります。

    1. Google Cloud コンソールで、[BigQuery] ページに移動します。

      [BigQuery] に移動

    2. クエリエディタで次のステートメントを入力します。

      SELECT
      COLUMN_LIST
      FROM
        PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
      WHERE
      object_name = "DATASET";

      次のように置き換えます。

    3. [実行] をクリックします。

    クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

    例:

    このクエリは、mydataset のアクセス制御を取得します。

    SELECT
    object_name, privilege_type, grantee
    FROM
    my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
    WHERE
    object_name = "mydataset";

    出力は次のようになります。

    +------------------+-----------------------------+-------------------------+
    |   object_name    |  privilege_type             | grantee                 |
    +------------------+-----------------------------+-------------------------+
    | mydataset        | roles/bigquery.dataOwner    | projectOwner:myproject  |
    | mydataset        | roles/bigquery.dataViwer    | user:user@example.com   |
    +------------------+-----------------------------+-------------------------+
    

    API

    データセットのアクセス制御を表示するには、定義済みの dataset リソースを使用して、datasets.get メソッドを呼び出します。

    アクセス制御は、dataset リソースの access プロパティに表示されます。

    Go

    このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

    BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

    client.Dataset().Metadata()関数を呼び出します。アクセス ポリシーは Access プロパティで使用できます。
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // viewDatasetAccessPolicies retrieves the ACL for the given dataset
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func viewDatasetAccessPolicies(w io.Writer, projectID, datasetID string) error {
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    
    	ctx := context.Background()
    
    	// Create new client.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Get dataset's metadata.
    	meta, err := client.Dataset(datasetID).Metadata(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Client.Dataset.Metadata: %w", err)
    	}
    
    	fmt.