承認済みビューの作成

BigQuery は、ペタバイト級のアナリティクス データ ウェアハウスであり、巨大容量のデータに対して SQL クエリをリアルタイムに近い速度で実行できます。

データセットに表示アクセス権を設定する場合、BigQuery では承認済みビューを作成します。承認済みビューを使用すると、元のテーブルへのアクセス権がないユーザーでも、クエリの結果を特定のユーザーやグループと共有できます。ビューの SQL クエリを使用して、ユーザーがクエリを実行できる列(フィールド)を制限することもできます。このチュートリアルでは、承認済みビューを作成します。

目標

このチュートリアルの内容は次のとおりです。

  • データセットを作成し、アクセス制御を適用する
  • プロジェクトにアクセス制御を割り当てる
  • ユーザーがクエリを実行できるデータを制限する承認済みビューを作成する

費用

BigQuery は有料のプロダクトです。このチュートリアルを行うと、BigQuery の使用料金が発生します。BigQuery では、特定の上限まで無料でリソースを使用できます。詳細については、BigQuery の無料のオペレーションと無料枠をご覧ください。

始める前に

このチュートリアルを始める前に、Google Cloud Console を使用して、プロジェクトを作成または選択します。

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

  3. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、 BigQuery API を有効にします。

    API を有効にする

    にアクセスします。
  4. クレジット カード情報の提供やプロジェクトに対する課金の有効化を行わない場合は、BigQuery によってサンドボックスが提供されます。このトピックの手順は、プロジェクトへの課金が有効かどうかに関係なく機能します。必要に応じて課金を有効にする場合は、課金を有効にする方法についてをご覧ください。

はじめに

このチュートリアルでは、2 つのデータセットを作成します。1 つはソースデータに使用し、もう 1 つは承認済みビューに使用します。GitHub 一般公開データセットのデータからソース データセットを作成します。次に、ソース データセットのテーブルにクエリを実行するビューを作成します。

データセットとビューを作成したら、ビューを含むデータセットとソースデータを含むデータセットに対するアクセス制御をプロジェクトに割り当てます。

ソース データセットに表示アクセス権を設定するために、承認済みのビューを作成します。承認済みのビューは次の手順で作成します。

  • ビューを保存するデータセットを別に作成する
  • 新しいデータセットにビューを作成する
  • プロジェクトにアクセス制御を割り当てる
  • ビューを含むデータセットにアクセス制御を割り当てる
  • ソース データセットの表示アクセスを承認する

ソース データセットを作成する

まず、ソースデータを格納するデータセットを作成します。このチュートリアルでは、GitHub 一般公開データセットからクエリでデータを取得し、ソース データセットのテーブルに格納します。ソース データセットには、データ アナリストに見せたくない情報も含まれています。このようなデータに対するアクセスを承認済みのビューで制限します。

ソース データセットを作成するには:

コンソール

  1. Cloud Console で、[BigQuery] ページを開きます。

    BigQuery に移動

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

  3. 詳細パネルで [データセットを作成] をクリックします。

  4. [データセット ID] に「github_source_data」と入力します。

  5. その他のデフォルト設定はすべてそのままにし、[データセットを作成] をクリックします。

Java

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

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

Python

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

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)

source_dataset = bigquery.Dataset(source_dataset_id_full)
# Specify the geographic location where the dataset should reside.
source_dataset.location = "US"
source_dataset = client.create_dataset(source_dataset)  # API request

ソース データセットを作成したら、SQL クエリを使用してテーブルを更新します。このクエリでは、GitHub 一般公開データセットからデータを取得します。

コンソール

  1. Cloud Console で、[BigQuery] ページを開きます。

    [BigQuery] に移動

  2. [クエリを新規作成] をクリックします。

  3. 次のクエリをコピーして、[クエリエディタ] テキスト領域に貼り付けます。

    SELECT
      commit,
      author,
      committer,
      repo_name
    FROM
      `bigquery-public-data.github_repos.commits`
    LIMIT
      1000
    
  4. [展開] をクリックして、[クエリの設定] を選択します。

  5. [送信先] で、[クエリ結果の宛先テーブルを設定する] チェックボックスをオンにします。

    • [プロジェクト名] で、適切なプロジェクトが選択されていることを確認します。
    • [データセット名] で [github_source_data] が選択されていることを確認します。
    • [テーブル名] に「github_contributors」と入力します。
    • [保存] をクリックします。

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

  7. クエリが完了したら、[github_contributors] をクリックしてから [プレビュー] をクリックし、データがテーブルに書き込まれていることを確認します。

Java

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

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

Python

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

source_table_id = "github_contributors"
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location="US",
    job_config=job_config,
)  # API request - starts the query

query_job.result()  # Waits for the query to finish

ビューを保存するデータセットを別に作成する

ソース データセットを作成したら、データ アナリストと共有する承認済みビューを格納する新しい別のデータセットを作成します。後のステップで、ソース データセット内のデータへのアクセス権を承認済みビューに付与します。データ アナリストには承認済みビューへのアクセス権が付与されますが、ソースデータへの直接アクセス権は付与されません。

データセット レベルでのアクセス制御の対象となる承認済みビューは、ソースデータとは別のデータセットに作成する必要があります。これにより、データオーナーはユーザーに対して元のデータへのアクセス権を同時に付与することなく、承認済みビューへのアクセス権を付与できます。ソース データセットと承認済みビューのデータセットは、同じリージョンのロケーションに存在する必要があります。

ビューを保存するデータセットを作成するには:

コンソール

  1. Cloud Console で、[BigQuery] ページを開きます。

    BigQuery に移動

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

  3. 詳細パネルで [データセットを作成] をクリックします。

  4. [データセット ID] に「shared_views」と入力します。

  5. その他のデフォルト設定はすべてそのままにし、[データセットを作成] をクリックします。

Java

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

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

Python

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

shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)

shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

新しいデータセットにビューを作成する

新しいデータセットに、承認用に使用するビューを作成します。このビューをデータ アナリストと共有します。このビューは SQL クエリで作成します。このクエリで、データ アナリストに見せない列を除外します。

このチュートリアルでは、作成者の氏名を除き、作成者のすべての情報を共有ビューから除外します。また、実行者の名前を除き、実行者の情報もすべて除外します。

新しいデータセットにビューを作成するには:

コンソール

  1. Cloud Console で、[BigQuery] ページを開きます。

    [BigQuery] に移動

  2. [クエリを新規作成] をクリックします。

  3. 次のクエリをコピーして、[クエリエディタ] テキスト領域に貼り付けます。project_id は実際のプロジェクト ID に置き換えます。

    SELECT
      commit,
      author.name as author,
      committer.name as committer,
      repo_name
    FROM
      `project_id.github_source_data.github_contributors`
    
  4. [展開] をクリックして、[クエリの設定] を選択します。

  5. [SQL 言語] で [標準] を選択します。[保存] をクリックして、クエリの設定を更新します。

  6. [保存] プルダウン リストで、[ビューを保存] を選択します。

  7. [ビューの保存] ダイアログで、次の操作を行います。

    • [プロジェクト名] で、適切なプロジェクトが選択されていることを確認します。
    • [データセット名] で [shared_views] が選択されていることを確認します。
    • [テーブル名] に「github_analyst_view」と入力します。
    • [保存] をクリックします。

Java

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

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

Python

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

shared_view_id = "github_analyst_view"
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id
)
view = client.create_table(view)  # API request

データ アナリストにプロジェクト レベルの IAM ロールを割り当てる

データ アナリストがビューにクエリを実行するには、クエリジョブの実行権限が必要になります。bigquery.user ロールには、プロジェクト内でジョブ(クエリジョブを含む)を実行する権限が含まれます。ユーザーまたはグループにプロジェクト レベルで bigquery.user 役割を付与すると、ユーザーはデータセットを作成し、それらのデータセット内のテーブルに対してクエリジョブを実行できます。bigquery.user 役割では、他のユーザーが作成しなかったデータセットのクエリ、テーブルデータの表示、テーブル スキーマの詳細の表示はできません。

プロジェクト レベルの bigquery.user 役割を割り当てても、データ アナリストはビューからクエリするテーブルを含むデータセット内のテーブルデータを表示したり、クエリしたりすることはできません。通常、企業に所属するほとんどの個人(データ サイエンティスト、ビジネス インテリジェンス アナリスト、データ アナリスト)には、プロジェクト レベルの bigquery.user ロールを割り当てる必要があります。

グループに IAM ロールを追加する場合には、有効な Google アカウントまたは Google Apps アカウントに関連付けられたメールアドレスまたはドメインを使用する必要があります。

プロジェクト レベルでデータ アナリストのグループを bigquery.user ロールに割り当てるには:

Console

  1. Google Cloud Console で IAM ページを開きます。

    [IAM] ページを開く

  2. [プロジェクトを選択] をクリックします。

  3. 実際のプロジェクトを選択し、[開く] をクリックします。

  4. [IAM] ページで、[追加] をクリックします。

  5. [メンバーの追加] ダイアログで、次の操作を行います。

    • [メンバー] ボックスに、データ アナリストを含むグループ(たとえば、data_analysts@example.com)を入力します。
    • [ロールを選択] ボックスで、BigQuery ユーザーのロールを検索して選択します。
    • [保存] をクリックします。

ビューを含むデータセットにアクセス制御を割り当てる

データ アナリストがビューにクエリを実行するには、ビューを含むデータセットに対する bigquery.dataViewer ロールが必要です。bigquery.user ロールは、データ アナリストにクエリジョブの作成に必要な権限を付与しますが、ビューを含むデータセットに対して少なくとも bigquery.dataViewer 権限がないと、クエリが失敗します。

データセットに対する bigquery.dataViewer アクセス権をデータ アナリストに付与するには:

Console

  1. [エクスプローラ] パネルで、shared_views データセットを選択します。

  2. [共有データセット] をクリックします。

  3. [新しいをメンバー] テキスト ボックスに、データ アナリストを含むグループ(たとえば、data_analysts@example.com)を入力します。

  4. [ロールを選択] をクリックし、[BigQuery] > [BigQuery データ閲覧者] を選択します。

  5. [追加] をクリックします。

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

Java

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

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

Python

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

# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry("READER", "groupByEmail", analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ["access_entries"]
)  # API request

ソース データセットの表示アクセスを承認する

ビューを含むデータセットのアクセス制御を作成したら、承認済みのビューとしてソース データセットにビューを追加します。これにより、データ アナリスト グループ以外は、ビューからソースデータにアクセスできるようになります。

ソースデータにアクセスするビューを承認するには:

Console

  1. [エクスプローラ] パネルで、github_source_data データセットを選択します。

  2. [共有データセット] をクリックします。

  3. [データセットの権限] パネルで、[承認済みのビュー] タブをクリックします。

  4. [承認済みビューの共有] で、次の操作を行います。

    • [プロジェクトを選択] で、適切なプロジェクトが選択されていることを確認します。
    • [データセットを選択] で [shared_views] を選択します。
    • [ビューを選択] で、ビュー名として「github_analyst_view」と入力します。
    • [追加] をクリックします。

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

Java

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

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, "view", view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request

構成を確認する

構成が完了すると、データ アナリスト グループ(たとえば、data_analysts)のメンバーがビューにクエリを実行して、構成を確認できます。

構成を確認するには:

Console

  1. データ アナリスト グループのメンバーを Cloud Console の BigQuery ページに移動します。

    BigQuery に移動

  2. [クエリを新規作成] をクリックします。

  3. 次のクエリをコピーして、[クエリエディタ] テキスト領域に貼り付けます。project_id は実際のプロジェクト ID に置き換えます。

    SELECT
      *
    FROM
      `project_id.shared_views.github_analyst_view`
    

完全なソースコード

次に、このチュートリアル用のソースコード全体を示します。

Java

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

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

# Create a source dataset
from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)

source_dataset = bigquery.Dataset(source_dataset_id_full)
# Specify the geographic location where the dataset should reside.
source_dataset.location = "US"
source_dataset = client.create_dataset(source_dataset)  # API request

# Populate a source table
source_table_id = "github_contributors"
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location="US",
    job_config=job_config,
)  # API request - starts the query

query_job.result()  # Waits for the query to finish

# Create a separate dataset to store your view
shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)

shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

# Create the view in the new dataset
shared_view_id = "github_analyst_view"
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id
)
view = client.create_table(view)  # API request

# Assign access controls to the dataset containing the view
# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry("READER", "groupByEmail", analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ["access_entries"]
)  # API request

# Authorize the view to access the source dataset
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, "view", view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ