IAM を使用してリソースへのアクセスを制御する

このドキュメントでは、リソースの現在のアクセス ポリシーを表示する方法、リソースにアクセス権を付与する方法、そしてリソースへのアクセス権を取り消す方法について説明します。

このドキュメントは、Google Cloud の Identity and Access Management(IAM)システムに精通していることを前提としています。

必要なロール

リソースの IAM ポリシーを変更するために必要な権限を取得するには、プロジェクトの BigQuery データオーナー(roles/bigquery.dataOwner)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセスの管理をご覧ください。

この事前定義ロールには、リソースの IAM ポリシーを変更するために必要な権限が含まれています。必要な権限を正確に確認するには、[必要な権限] セクションを開いてください。

必要な権限

  • データセットのアクセス ポリシーを取得するには: bigquery.datasets.get
  • データセットのアクセス ポリシーを設定するには: bigquery.datasets.update
  • コンソールのみ。データセットのアクセス ポリシーを取得するには: bigquery.datasets.getIamPolicy
  • コンソールのみ。データセットのアクセス ポリシーを設定するには: bigquery.datasets.setIamPolicy
  • テーブルまたはビューのポリシーを取得するには: bigquery.tables.getIamPolicy
  • テーブルまたはビューのポリシーを設定するには: bigquery.tables.setIamPolicy
  • 省略可。bq ツールまたは SQL BigQuery ジョブを作成する場合: bigquery.jobs.create

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

リソースのアクセス ポリシーを表示する

以降のセクションでは、さまざまなリソースのアクセス ポリシーを表示する方法について説明します。

データセットのアクセス ポリシーを表示する

次のオプションのいずれかを選択します。

コンソール

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

    BigQuery に移動

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

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

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

bq

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

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

以下を置き換えます。

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

API

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

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

テーブルまたはビューのアクセス ポリシーを表示する

次のオプションのいずれかを選択します。

コンソール

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

    BigQuery に移動

  2. [エクスプローラ] ペインでプロジェクトを開き、テーブルまたはビューを選択します。

  3. [共有] をクリックします。

    テーブルまたはビューのアクセス ポリシーが [共有] ペインに表示されます。

bq

既存のアクセス ポリシーを取得し、ローカル ファイルに JSON 形式で出力するには、Cloud Shell で bq get-iam-policy コマンドを使用します。

bq get-iam-policy \
    --table=true \
    PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE

以下を置き換えます。

  • PROJECT_ID: プロジェクト ID
  • DATASET: データセットの名前
  • RESOURCE: ポリシーを表示するテーブルまたはビューの名前
  • PATH_TO_FILE: ローカルマシン上の JSON ファイルへのパス

API

現在のポリシーを取得するには、tables.getIamPolicy メソッドを呼び出します。

リソースへのアクセス権を付与する

以降のセクションでは、さまざまなリソースへのアクセス権を付与する方法について説明します。

データセットへのアクセス権を付与する

次のオプションのいずれかを選択します。

コンソール

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

    BigQuery に移動

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

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

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

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

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

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

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

SQL

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

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

    BigQuery に移動

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

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

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

    • ROLE_LIST: 付与するロールまたはカンマ区切りのロールのリスト
    • RESOURCE_TYPE: ロールが適用されるリソースのタイプ

      サポートされている値には、SCHEMA(データセットに相当)、TABLEVIEWEXTERNAL TABLE があります。

    • RESOURCE_NAME: 権限を付与するリソースの名前
    • USER_LIST: ロールが付与されるユーザーのカンマ区切りのリスト

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

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

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

bq

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

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

    以下を置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET: データセットの名前
    • PATH_TO_FILE: ローカルマシン上の JSON ファイルへのパス
  2. 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"
      }
     ],
     ...
    }
    

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

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

    bq show --format=prettyjson PROJECT_ID:DATASET
    

API

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

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

Go

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

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateDatasetAccessControl demonstrates how the access control policy of a dataset
// can be amended by adding an additional entry corresponding to a specific user identity.
func updateDatasetAccessControl(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}
	// Append a new access control entry to the existing access list.
	update := bigquery.DatasetMetadataToUpdate{
		Access: append(meta.Access, &bigquery.AccessEntry{
			Role:       bigquery.ReaderRole,
			EntityType: bigquery.UserEmailEntity,
			Entity:     "sample.bigquery.dev@gmail.com"},
		),
	}

	// Leverage the ETag for the update to assert there's been no modifications to the
	// dataset since the metadata was originally read.
	if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

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

import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Role;
import com.google.cloud.bigquery.Acl.User;
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 java.util.ArrayList;

public class UpdateDatasetAccess {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Create a new ACL granting the READER role to "sample.bigquery.dev@gmail.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    Acl newEntry = Acl.of(new User("sample.bigquery.dev@gmail.com"), Role.READER);

    updateDatasetAccess(datasetName, newEntry);
  }

  public static void updateDatasetAccess(String datasetName, Acl newEntry) {
    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();

      Dataset dataset = bigquery.getDataset(datasetName);

      // Get a copy of the ACLs list from the dataset and append the new entry
      ArrayList<Acl> acls = new ArrayList<>(dataset.getAcl());
      acls.add(newEntry);

      bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println("Dataset Access Control updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Dataset Access control was not updated \n" + e.toString());
    }
  }
}

Python

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

dataset.access_entries プロパティをデータセットのアクセス制御に設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom
# you are adding access. Alternatively, to the JSON REST API representation
# of the entity, such as a view's table reference.
entity_id = "user-or-group-to-add@example.com"

from google.cloud.bigquery.enums import EntityTypes

# TODO(developer): Set entity_type to the type of entity you are granting access to.
# Common types include:
#
# * "userByEmail" -- A single user or service account. For example "fred@example.com"
# * "groupByEmail" -- A group of users. For example "example@googlegroups.com"
# * "view" -- An authorized view. For example
#       {"projectId": "p", "datasetId": "d", "tableId": "v"}
#
# For a complete reference, see the REST API reference documentation:
# https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#Dataset.FIELDS.access
entity_type = EntityTypes.GROUP_BY_EMAIL

# TODO(developer): Set role to a one of the "Basic roles for datasets"
# described here:
# https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
role = "READER"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
entries.append(
    bigquery.AccessEntry(
        role=role,
        entity_type=entity_type,
        entity_id=entity_id,
    )
)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
)

テーブルまたはビューへのアクセス権を付与する

次のオプションのいずれかを選択します。

コンソール

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

    BigQuery に移動

  2. [エクスプローラ] ペインでプロジェクトを開き、共有するテーブルまたはビューを選択します。

  3. [共有] をクリックします。

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

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

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

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

  8. テーブルまたはビューの詳細に戻るには、[閉じる] をクリックします。

SQL

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

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

    BigQuery に移動

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

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

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

    • ROLE_LIST: 付与するロールまたはカンマ区切りのロールのリスト
    • RESOURCE_TYPE: ロールが適用されるリソースのタイプ

      サポートされている値には、SCHEMA(データセットに相当)、TABLEVIEWEXTERNAL TABLE があります。

    • RESOURCE_NAME: 権限を付与するリソースの名前
    • USER_LIST: ロールが付与されるユーザーのカンマ区切りのリスト

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

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

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

bq

  1. 既存のテーブルまたはビュー情報(アクセス制御を含む)を JSON ファイルに書き込むには、bq get-iam-policy コマンドを使用します。

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    以下を置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET: 更新するテーブルまたはビューが含まれるデータセットの名前
    • TABLE_OR_VIEW: 更新するリソースの名前
    • PATH_TO_FILE: ローカルマシン上の JSON ファイルへのパス
  2. 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"
      }
     ],
     ...
    }
    

  3. set-iam-policy コマンドを使用して、ポリシーを更新します。

    bq set-iam-policy \
        PROJECT_ID:DATASET.TABLE_OR_VIEW \
        > PATH_TO_FILE
    

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

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. 現在のポリシーを取得するには、tables.getIamPolicy メソッドを呼び出します。
  2. ポリシーを編集してメンバーやバインディングを追加します。 ポリシーに必要な形式については、ポリシー リファレンスのトピックをご覧ください。

Java

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

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to create iam policy for table
public class CreateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    createIamPolicy(datasetName, tableName);
  }

  public static void createIamPolicy(String datasetName, String tableName) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      policy
          .toBuilder()
          .addIdentity(Role.of("roles/bigquery.dataViewer"), Identity.allUsers())
          .build();
      bigquery.setIamPolicy(tableId, policy);
      System.out.println("Iam policy created successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not created. \n" + e.toString());
    }
  }
}

リソースに対するアクセス権の取り消し

以降のセクションでは、さまざまなリソースへのアクセス権を取り消す方法について説明します。

データセットに対するアクセス権の取り消し

次のオプションのいずれかを選択します。

コンソール

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

    BigQuery に移動

  2. [エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。

  3. 詳細パネルで、[共有 > 権限] をクリックします。

  4. [データセットの権限] ダイアログで、アクセス権を取り消すプリンシパルを開きます。

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

  6. [ロールをプリンシパルから削除しますか?] ダイアログで、[削除] をクリックします。

  7. データセットの詳細に戻るには、[閉じる] をクリックします。

SQL

プリンシパルからデータセットへのアクセスを削除するには、REVOKE DCL ステートメントを使用します。

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

    BigQuery に移動

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

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

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

    • ROLE_LIST: 取り消すロールまたはカンマ区切りのロールのリスト
    • RESOURCE_TYPE: ロールが取り消されるリソースのタイプ

      サポートされている値には、SCHEMA(データセットに相当)、TABLEVIEWEXTERNAL TABLE があります。

    • RESOURCE_NAME: 権限を取り消すリソースの名前
    • USER_LIST: ロールが取り消されるユーザーのカンマ区切りのリスト

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

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

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

bq

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

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

    以下を置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET: データセットの名前
    • PATH_TO_FILE: ローカルマシン上の JSON ファイルへのパス。
  2. 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"
      }
     ],
     ...
    }
    

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

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

    bq show --format=prettyjson PROJECT_ID:DATASET
    

API

アクセス制御を更新するには、Dataset リソースで datasets.patch を呼び出して access プロパティを使用します。

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

Go

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

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// revokeDatasetAccess updates the access control on a dataset to remove all
// access entries that reference a specific entity.
func revokeDatasetAccess(projectID, datasetID, entity string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// entity := "user@mydomain.com"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}

	var newAccessList []*bigquery.AccessEntry
	for _, entry := range meta.Access {
		if entry.Entity != entity {
			newAccessList = append(newAccessList, entry)
		}
	}

	// Only proceed with update if something in the access list was removed.
	// Additionally, we use the ETag from the initial metadata to ensure no
	// other changes were made to the access list in the interim.
	if len(newAccessList) < len(meta.Access) {

		update := bigquery.DatasetMetadataToUpdate{
			Access: newAccessList,
		}
		if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
			return err
		}
	}
	return nil
}

Python

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

dataset.access_entries プロパティをデータセットのアクセス制御に設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom you are revoking access.
entity_id = "user-or-group-to-remove@example.com"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
dataset.access_entries = [
    entry for entry in entries if entry.entity_id != entity_id
]

dataset = client.update_dataset(
    dataset,
    # Update just the `access_entries` property of the dataset.
    ["access_entries"],
)  # Make an API request.

full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
print(f"Revoked dataset access for '{entity_id}' to ' dataset '{full_dataset_id}.'")

テーブルまたはビューに対するアクセス権の取り消し

次のオプションのいずれかを選択します。

コンソール

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

    BigQuery に移動

  2. [エクスプローラ] パネルでプロジェクトを開き、テーブルまたはビューを選択します。

  3. 詳細パネルで [共有] をクリックします。

  4. [共有] ダイアログで、アクセス権を取り消すプリンシパルを開きます。

  5. [削除] をクリックします。

  6. [ロールをプリンシパルから削除しますか?] ダイアログで、[削除] をクリックします。

  7. テーブルまたはビューの詳細に戻るには、[閉じる] をクリックします。

SQL

プリンシパルからテーブルまたはビューへのアクセス権を削除するには、REVOKE DCL ステートメントを使用します。

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

    BigQuery に移動

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

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

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

    • ROLE_LIST: 取り消すロールまたはカンマ区切りのロールのリスト
    • RESOURCE_TYPE: ロールが取り消されるリソースのタイプ

      サポートされている値には、SCHEMA(データセットに相当)、TABLEVIEWEXTERNAL TABLE があります。

    • RESOURCE_NAME: 権限を取り消すリソースの名前
    • USER_LIST: ロールが取り消されるユーザーのカンマ区切りのリスト

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

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

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

bq

  1. 既存のテーブルまたはビュー情報(アクセス制御を含む)を JSON ファイルに書き込むには、bq get-iam-policy コマンドを使用します。

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    以下を置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET: 更新するテーブルまたはビューが含まれるデータセットの名前
    • TABLE_OR_VIEW: 更新するリソースの名前
    • PATH_TO_FILE: ローカルマシン上の JSON ファイルへのパス

  2. 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"
      }
     ],
     ...
    }
    

  3. bq set-iam-policy コマンドを使用して、ポリシーを更新します。

     bq set-iam-policy \
         PROJECT_ID:DATASET.TABLE_OR_VIEW \
         > PATH_TO_FILE
    

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

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. 現在のポリシーを取得するには、tables.getIamPolicy メソッドを呼び出します。
  2. ポリシーを編集してメンバーやバインディングを削除します。ポリシーに必要な形式については、ポリシー リファレンスのトピックをご覧ください。

  3. tables.setIamPolicy を呼び出して、更新されたポリシーを書き込みます。 注: メンバーのない空のバインドは許可されません。エラーが発生します。

Java

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

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

// Sample to update iam policy in table
public class UpdateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateIamPolicy(datasetName, tableName);
  }

  public static void updateIamPolicy(String datasetName, String tableName) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      Map<Role, Set<Identity>> binding = new HashMap<>(policy.getBindings());
      binding.remove(Role.of("roles/bigquery.dataViewer"));

      policy.toBuilder().setBindings(binding).build();
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("Iam policy updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not updated. \n" + e.toString());
    }
  }
}