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

このドキュメントでは、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 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

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

データセットにアクセス制御を適用するとき、以下のユーザーとグループにアクセス権を付与できます。

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

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

従来の UI

以下では、従来の BigQuery ウェブ UI を使用してデータセットにアクセス制御を割り当てる手順を説明します。現在、GCP Console でアクセス制御を割り当てることはできません。
  1. データセットの右側にあるプルダウン矢印をクリックし、[Share Dataset] を選択します。

  2. [Share Dataset] ダイアログの [Add People] で、フィールドの左側にあるプルダウンをクリックして、適切なオプションを選択します。

  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 のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset = client.get_dataset(client.dataset('my_dataset'))

entry = bigquery.AccessEntry(
    role='READER',
    entity_type='userByEmail',
    entity_id='sample.bigquery.dev@gmail.com')
assert entry not in dataset.access_entries
entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

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

assert entry in dataset.access_entries

次のステップ

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

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

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