データセットへのアクセスの制御

このドキュメントでは、BigQuery 内のデータセットへのアクセスを制御する方法を説明します。

BigQuery の権限は、Cloud IAM リソース階層でデータセットよりも高位のレベルで構成することもできます。Cloud IAM リソース階層について詳しくは、Cloud IAM ドキュメントのリソース階層を使用したアクセス制御をご覧ください。

概要

現時点では、テーブル、ビュー、列、行に対する権限を付与することはできません。データセットは、BigQuery でのアクセス制御をサポートする最下位レベルのリソースです。

データセット レベルの権限により、特定のデータセット内のテーブル、ビュー、テーブルデータにアクセスできるユーザー、グループ、サービス アカウントが決まります。たとえば、あるユーザーに特定のデータセットに対する bigquery.dataOwner Cloud IAM 役割を付与した場合、そのユーザーはそのデータセット内のテーブルとビューを作成、更新、削除できます。

データセットの作成時にアクセス制御を適用するには、datasets.insert API メソッドを呼び出します。

GCP Console、従来の BigQuery ウェブ UI、コマンドライン ツールでデータセットを作成している間は、アクセス制御を適用できません

データセットの作成後は、次の方法でデータセットにアクセス制御を適用できます。

  • GCP Console または従来の BigQuery ウェブ UI
  • bq update CLI コマンド
  • datasets.patch API メソッドの呼び出し
  • クライアント ライブラリを使用する

必要な権限

データセットのアクセス制御の割り当てまたは更新を行うには、少なくとも bigquery.datasets.update 権限と bigquery.datasets.get 権限が付与されている必要があります。次の事前定義された Cloud IAM 役割には、bigquery.datasets.update 権限と bigquery.datasets.get 権限が含まれています。

  • bigquery.dataOwner
  • bigquery.admin

また、bigquery.datasets.create 権限があるユーザーがデータセットを作成すると、作成したデータセットに対する bigquery.dataOwner アクセス権がそのユーザーに付与されます。 bigquery.dataOwner アクセス権により、ユーザーは自身が作成したデータセットを更新できます。

BigQuery での Cloud IAM 役割と権限の詳細については、事前定義された役割と権限をご覧ください。

データセットへのアクセスの制御

データセットにアクセス制御を割り当てるには:

Console

  1. [リソース] からデータセットを選択し、ウィンドウ右側の [共有データセット] をクリックします。

    データセットに個人を追加

  2. [共有データセット] パネルの [データセットの権限] タブで、[メンバーの追加] をクリックします。

  3. [メンバーの追加] パネルの [新しいメンバー] テキスト ボックスに、追加するエンティティを入力します。次のエンティティを追加できます。

    • Google アカウントのメールアドレス: 個々の Google アカウントにデータセットへのアクセスが許可されます。
    • Google グループ: Google グループ内のすべてのメンバーにデータセットへのアクセスが許可されます。
    • Google Apps ドメイン: Google ドメイン内のすべてのユーザーとグループにデータセットへのアクセスが許可されます。
    • サービス アカウント: サービス アカウントにデータセットへのアクセスが許可されます。
    • 全員: 一般ユーザーに公開されているデータへのアクセスを許可するには、「allUsers」と入力します。
    • すべての Google アカウント: Google アカウントにログインしたすべてのユーザーにアクセスを許可するには、「allAuthenticatedUsers」と入力します。
  4. [役割を選択] で、[BigQuery] を選択し、新しいメンバーに適切な定義済みの IAM 役割を選択します。事前定義された各 BigQuery 役割に割り当てられている権限の詳細については、アクセス制御ページの役割のセクションをご覧ください。

  5. [完了] をクリックします。

従来の UI

  1. データセットの右側にあるプルダウン矢印をクリックし、[Share Dataset] を選択します。

  2. [Share Dataset] ダイアログの [Add People] で、フィールドの左側にあるプルダウンをクリックして、適切なオプションを選択します。従来のウェブ UI を使用してデータセットにアクセス制御を適用する際は、以下のユーザーとグループにアクセス権を付与できます。

    • User by e-mail - 個々の Google アカウントにデータセットへのアクセスが許可されます。
    • Group by e-mail - Google グループのすべてのメンバーにデータセットへのアクセスが許可されます。
    • Domain - Google ドメイン内のすべてのユーザーとグループにデータセットへのアクセスが許可されます。
    • All Authenticated Users - すべての Google アカウント所有者にデータセットへのアクセスが許可されます(データセットが公開されます)。
    • Project Owners - すべてのプロジェクト オーナーにデータセットへのアクセスが許可されます。
    • Project Viewers - すべてのプロジェクト閲覧者にデータセットへのアクセスが許可されます。
    • Project Editors - すべてのプロジェクト編集者にデータセットへのアクセスが許可されます。
    • Authorized View - データセットに対する表示アクセスだけが許可されます。

  3. テキスト ボックスに値を入力します。たとえば、[User by e-mail] または [Group by e-mail] を選択した場合は、ユーザーまたはグループのメールアドレスを入力します。

  4. [Add People] フィールドの右側にある [Can view] をクリックし、リストから該当する役割を選択します。

    データセットに個人を追加

    • [Can view](READER)を選択すると、データセットに対する bigquery.dataViewer アクセス権が付与されます。
    • [Can edit](WRITER)を選択すると、データセットに対する bigquery.dataEditor アクセス権が付与されます。
    • [Is owner](OWNER)を選択すると、データセットに対する bigquery.dataOwner アクセス権が付与されます。

      データセットに対するこれらの役割について詳しくは、データセットに対する基本の役割をご覧ください。

  5. [Add] をクリックして、[Save changes] をクリックします。

CLI

  1. 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 ファイルに書き込まれます。mydatasetmyotherproject にあります。

      bq show --format=prettyjson \
      myotherproject:mydataset > /tmp/mydataset.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. 編集が完了したら、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 のアクセス制御が更新されます。mydatasetmyotherproject にあります。

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

    bq show --format=prettyjson dataset
    

    または

    bq show --format=prettyjson project_id:dataset
    

API

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

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

Go

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

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

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
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
}

Python

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

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

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

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

dataset = client.get_dataset(dataset_id)

entry = bigquery.AccessEntry(
    role="READER",
    entity_type="userByEmail",
    entity_id="sample.bigquery.dev@gmail.com",
)

entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

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

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。