承認済みビューの作成

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

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

目標

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

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

費用

BigQuery は有料のプロダクトです。このチュートリアルを行うと、BigQuery の使用料金が発生します。BigQuery クエリの料金については、毎月 1 TB まで無料です。詳細については、料金のページをご覧ください。

始める前に

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

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

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

  2. GCP プロジェクトを選択または作成します。

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

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

    APIを有効にする

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

はじめに

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

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

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

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

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

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

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

Console

  1. GCP Console で BigQuery ウェブ UI を開きます。
    GCP Console に移動する

  2. ナビゲーション パネルの [リソース] セクションでプロジェクトを選択し、[データセットを作成] をクリックします。

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

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

Python

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

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

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

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

Console

  1. GCP Console で BigQuery ウェブ UI を開きます。
    GCP Console に移動する

  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] をクリックしてから [プレビュー] をクリックし、データがテーブルに書き込まれていることを確認します。

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

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

ソース データセットを作成したら、データ アナリストと共有するビューを保存する新しいデータセットを作成します。このビューは、ソース データセット内のデータにアクセスできます。データ アナリストはソースデータではなくビューにアクセスできます。

ビューを作成するときに、ビューからクエリするソースデータのデータセットとは別にデータセットを作成する必要があります。アクセス制御はデータセット レベルでのみ割り当てることができるため、ソースデータと同じデータセットにビューを作成した場合、データ アナリストがビューとデータの両方にアクセスできてしまいます。

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

Console

  1. GCP Console で BigQuery ウェブ UI を開きます。
    GCP Console に移動する

  2. ナビゲーション パネルの [リソース] セクションでプロジェクトを選択し、[データセットを作成] をクリックします。

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

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

Python

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

shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

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

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

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

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

Console

  1. GCP Console で BigQuery ウェブ UI を開きます。
    GCP Console に移動する

  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」と入力します。
    • [保存] をクリックします。

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

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

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

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

このチュートリアルでは、データ アナリストは data_analysts@example.com というグループに所属しています。このグループ名は便宜上のもので、グループに IAM 役割を追加する場合には、有効な Google アカウントまたは Google Apps アカウントに関連付けられたメールアドレスまたはドメインを使用する必要があります。

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

Console

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

    [IAM] ページを開く

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

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

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

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

    • [メンバー] に、グループ名として「data_analysts@example.com」と入力します。
    • [役割] で [役割を選択] をクリックし、[BigQuery] > [BigQuery User] の順に選択します。
    • [追加] をクリックします。

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

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

データ アナリストにデータセットへの bigquery.dataViewer 権限を付与する手順は次のとおりです。

Console

  1. [リソース] セクションで shared_views データセットを選択し、[共有データセット] をクリックします。

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

  3. [新しいメンバー] テキスト ボックスに「data_analysts@example.com」と入力します。

  4. [役割を選択] をクリックし、[BigQuery] > [BigQuery データ編集者] を選択します。

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

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. [承認済みビューの共有] で、次の操作を行います。

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

  4. [追加] をクリックしてから [完了] をクリックします。

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. data_analysts グループのメンバーが GCP Console で BigQuery ウェブ UI に移動します。
    GCP Console に移動する

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

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

    SELECT
      *
    FROM
      `shared_views.github_analyst_view`
    

完全なソースコード

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

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 = bigquery.Dataset(client.dataset(source_dataset_id))
# 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 = bigquery.Dataset(client.dataset(shared_dataset_id))
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 Platform アカウントに課金されないようにする手順は次のとおりです。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

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

次のステップ

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

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