承認済みビューを作成する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

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

目標

このチュートリアルでは、次のタスクを行う方法を説明します。

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

費用

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

準備

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

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

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

    プロジェクト セレクタに移動

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

    BigQuery API を有効にします。

    API を有効にする

    に移動します。
  5. (省略可)プロジェクトに対する課金を有効にします。課金を有効にしない場合や、クレジット カードを指定しない場合でも、このドキュメントの手順は行えます。BigQuery には、この手順を実施するためのサンドボックスが用意されています。詳細については、BigQuery サ2ンドボックスを有効にするをご覧ください。

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

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

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

コンソール

  1. Google Cloud コンソールで、BigQuery ページを開きます。

    BigQuery に移動

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

  3. アクション オプションを開いて、[データセットを作成] をクリックします。

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

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

SQL

CREATE SCHEMA DDL ステートメントを使用します。

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

    BigQuery に移動

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

    CREATE SCHEMA github_source_data;
    

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

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

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. Google Cloud コンソールで、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. Google Cloud コンソールで、BigQuery ページを開きます。

    BigQuery に移動

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

  3. アクション オプションを開いて、[データセットを作成] をクリックします。

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

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

SQL

CREATE SCHEMA DDL ステートメントを使用します。

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

    BigQuery に移動

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

    CREATE SCHEMA shared_views;
    

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

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

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. Google Cloud コンソールで、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. [ビューの保存] ダイアログで、次の操作を行います。

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

SQL

CREATE VIEW DDL ステートメントを使用します。

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

    BigQuery に移動

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

    CREATE VIEW shared_views.github_analyst_view
    AS (
      SELECT
        commit,
        author.name AS author,
        committer.name AS committer,
        repo_name
      FROM
        `PROJECT_ID.github_source_data.github_contributors`
    );
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

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

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

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 ロールでは、ユーザーはビューを更新することもできません。通常、企業に所属するほとんどの個人(データ サイエンティスト、ビジネス インテリジェンス アナリスト、データ アナリスト)には、プロジェクト レベルの 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. [共有データセット] をクリックします。

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

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

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

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

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. 表示された [承認済みのビュー] ペインで、[承認済みのビュー] フィールドに github_analyst_view ビューを入力します。

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

これで、github_analyst_view ビューがソース データセット内のデータにアクセスできるようになりました。

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)のメンバーがビューにクエリを実行して、構成を確認できます。

構成を確認するには:

SQL

データ アナリスト グループのメンバーに次の作業を行ってもらいます。

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

    BigQuery に移動

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

    SELECT
      *
    FROM
      `PROJECT_ID.shared_views.github_analyst_view`;
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

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

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

完全なソースコード

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

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. Google Cloud コンソールで、[リソースの管理] ページに移動します。

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

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

次のステップ