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

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

datasets.insert API メソッドを呼び出すことにより、データセットを作成しているにアクセス制御を適用できます。

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

以下の手段でデータセットを作成したは、データセットにアクセス制御を適用できます。

  • 従来の BigQuery ウェブ UI

    • 現在、GCP Console でアクセス制御を割り当てることはできません。
  • bq update CLI コマンド

  • datasets.patch API メソッドの呼び出し

概要

BigQuery のテーブルやビューへのアクセス権を共有するには、プロジェクト レベルの IAM 役割とデータセット レベルのアクセス制御を使用します。現時点では、アクセス制御を直接テーブルやビューに適用することはできません。

プロジェクト レベルのアクセス制御は、特定のプロジェクト内のすべてのデータセット、テーブル、ビュー、テーブルデータへのアクセスをどのユーザー、グループ、サービス アカウントに許可するかを決定します。データセット レベルのアクセス制御は、特定のデータセット内のテーブル、ビュー、テーブルデータへのアクセスをどのユーザー、グループ、サービス アカウントに許可するかを決定します。

たとえば、プロジェクト レベルでユーザーに bigquery.dataOwner 役割を割り当てると、そのユーザーは対象のプロジェクトのすべてのデータセットでテーブルとビューを作成、更新、削除できます。データセット レベルで OWNER 役割を割り当てると、そのユーザーはそのデータセット内に限りテーブルとビューを作成、更新、削除できます。データセット レベルで基本の役割の OWNER を付与することは、そのデータセットに対する bigquery.dataOwner 役割を付与することと同じです。

ユーザーまたはグループにプロジェクト レベルでより限定的な役割を割り当てる場合、個々のデータセットに対するアクセス権も付与する必要があります。たとえば、ユーザーまたはグループにプロジェクト レベルで bigquery.user 役割を付与すると、そのユーザーはデータセットを作成することや、そのデータセット内のテーブルに対してクエリジョブを実行できます。自分が作成したものではないデータセット内のテーブルに対してクエリを実行するには、クエリ対象のデータセットそれぞれについて、少なくともデータセット レベルの READER アクセス権が付与されている必要があります。データセット レベルで基本の役割の READER を付与することは、そのデータセットに対する bigquery.dataViewer 役割を付与することと同じです。

事前定義されたプロジェクト レベルの IAM 役割とデータセット レベルのアクセス制御の詳細については、アクセス制御をご覧ください。

必要な権限

データセットのアクセス制御の割り当てまたは更新を行うには、データセット レベルで OWNER アクセス権が付与されているか、bigquery.datasets.update 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。次の定義済みのプロジェクト レベルの IAM 役割には bigquery.datasets.update 権限が含まれます。

また、bigquery.user 役割には bigquery.datasets.create 権限が含まれているため、bigquery.user 役割に割り当てられたユーザーは、自分が作成した任意のデータセットを更新できます。bigquery.user 役割に割り当てられているユーザーがデータセットを作成すると、そのユーザーには、作成したデータセットへの OWNER アクセス権が付与されます。 データセットへの OWNER アクセス権が付与されたユーザーは、そのデータセットを完全に制御できます。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

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

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

Console

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

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

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

  3. [メンバーの追加] パネルで、追加する個人またはグループのメールアドレスを [新しいメンバー] テキスト ボックスに入力します。

  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] をクリックします。

コマンドライン

  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

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 のサポートページをご覧ください。