BigLake テーブルを作成して管理する

このドキュメントでは、BigLake テーブルの実装方法について説明します。また、このドキュメントは、データベース テーブルと権限管理を理解していることを前提としています。BigLake テーブルの全体像については、BigLake テーブルの概要をご覧ください。

準備

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

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

    このチュートリアルでは、本番環境のワークロードに影響を与えないように、テスト プロジェクトを作成することをおすすめします。

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. BigQuery Connection API を有効にします。

    API を有効にする

    Apache Spark などのオープンソース エンジンから BigLake テーブルを読み取る場合は、BigQuery Storage Read API を有効にする必要があります。

  4. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

  5. Google Cloud SDK のバージョンが 366.0.0 以降であることを確認します。

    gcloud version
    

    必要に応じて、Google Cloud SDK を更新します。

  6. 任意: Terraform には、Terraform GCP バージョン 4.25.0 以降を使用します。HashiCorp Terraform のダウンロードから最新バージョンをダウンロードできます。

IAM の権限

BigLake テーブルを使用するには、ユーザーの組織内のロールに基づいて、次の Identity and Access Management(IAM)権限が必要です。ユーザーロールの詳細については、セキュリティ モデルをご覧ください。権限付与の詳細については、リソースに対して付与可能なロールの表示をご覧ください。

  • データレイク管理者:
    • bigquery.connections.create
    • bigquery.connections.delete
    • bigquery.connections.list
    • bigquery.connections.update
  • データ ウェアハウス管理者:
    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • データ アナリスト:
    • bigquery.jobs.create
    • bigquery.tables.get
    • bigquery.tables.getData
    • bigquery.readsessions.create

ロケーションに関する考慮事項

Cloud Storage を使用してデータファイルを保存する場合は、マルチリージョン バケットではなく最適なパフォーマンスのために、Cloud Storage のシングル リージョン バケットまたはデュアル リージョン バケットを使用することをおすすめします。

接続リソースを作成して表示する

BigLake は、接続リソースを使用してデータレイクにアクセスします。接続リソースは、プロジェクト内の単一のテーブルまたは任意のテーブルのグループに関連付けることができます。

クラウド リソース接続を作成する

次のオプションのいずれかを選択します。

コンソール

  1. BigQuery ページに移動します。

    BigQuery に移動

  2. 接続を作成するには、[ データを追加] をクリックし、続いて [外部データソース] をクリックします。

  3. [接続タイプ] リストで、[BigLake とリモート関数(クラウド リソース)] を選択します。

  4. [接続 ID] フィールドに、接続の名前を入力します。

  5. [接続を作成] をクリックします。

  6. [エクスプローラ] ペインで、接続リソースの作成に使用したプロジェクトの接続をクリックします。接続情報が表示されます。

    接続情報を表示します。

  7. 後の手順で必要になるため、[接続情報] セクションの [サービス アカウント ID] をコピーします。

bq

  1. コマンドライン環境で、接続を作成します。

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID
    

    --project_id パラメータは、デフォルト プロジェクトをオーバーライドします。

    以下を置き換えます。

    接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。

  2. 別の手順で必要になるため、そのサービス アカウント ID を取得してコピーします。

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID
    

    出力は次のようになります。

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

main.tf ファイルに次のセクションを追加します。

 ## This creates a cloud resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "CONNECTION_ID"
    project = "PROJECT_ID"
    location = "REGION"
    cloud_resource {}
}        
以下を置き換えます。

次の接続エラーが発生した場合は、Google Cloud SDK を更新してください。

Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...

BigQuery AWS 接続を作成する

AWS に接続するには、BigQuery AWS 接続を作成する必要があります。接続リソースを作成すると、BigQuery は一意の ID を作成し、接続に関連付けます。

BigQuery Azure 接続を作成する

BigQuery には、Azure Blob Storage から安全にデータにアクセスするための 2 つの方法が用意されています。ID 連携の使用Google Cloud サービス アカウントに Azure アプリケーションへのアクセス権を付与するか、直接テナント内の Azure Active Directory(AD)アプリケーションへのアクセスを許可することができます。

データレイクへのアクセスを設定する

次の手順では、BigQuery がユーザーの代わりにファイルにアクセスできるように、新しい接続リソースにデータレイクへの読み取り専用アクセス権を付与します。

Cloud Storage へのアクセスを設定する

次のオプションのいずれかを選択します。

コンソール

接続リソース サービス アカウントに、ストレージ オブジェクト閲覧者 IAM ロールroles/storage.objectViewer)を付与することをおすすめします。これにより、サービス アカウントは Cloud Storage バケットにアクセスできるようになります。

コンソール

  1. [IAM と管理] ページに移動

    [IAM と管理] に移動

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

    [プリンシパルを追加します] ダイアログが開きます。

  3. [新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。

  4. [ロールを選択] フィールドで、[Cloud Storage] を選択し、続いて [Storage オブジェクト閲覧者] を選択します。

  5. [保存] をクリックします。

gsutil

gsutil iam ch コマンドを使用します。

gsutil iam ch MEMBER:objectViewer gs://example-bucket

MEMBER は、以前にコピーしたサービス アカウント ID(serviceAccount:example@gcp-sa-bigquery-condel.iam.gserviceaccount.com など)に置き換えます。

詳細については、バケットレベルのポリシーにプリンシパルを追加するをご覧ください。

Terraform

main.tf ファイルに次のセクションを追加します。

## This grants permissions to the service account of the connection created in the last step.
resource "google_project_iam_member" "connectionPermissionGrant" {
    project = "PROJECT_ID"
    role = "roles/storage.objectViewer"
    member = format("serviceAccount:%s", google_bigquery_connection.connection.cloud_resource[0].service_account_id)
}    

ユーザーを BigLake テーブルに移行した後は、Cloud Storage に直接アクセスするための権限を削除します。直接ファイル アクセスを使用すると、BigLake テーブルに設定されているガバナンス ポリシー(行レベルや列レベルのセキュリティなど)をユーザーがバイパスできるようになります。

Amazon S3 へのアクセスを設定する

S3 データにアクセスするには、AWS ロールに信頼関係を追加する必要があります。ただし、AWS アカウントにカスタム ID プロバイダがある場合は、カスタム AWS ID プロバイダを構成するの手順を行ってください。

Azure へのアクセスを設定する

Azure アプリへのアクセスを設定する手順は、Azure への接続によって異なります。ID 連携を使用して Azure に保存されているデータにアクセスする場合は、次の手順を行います。

  1. Azure アプリケーションに連携認証情報を追加します。
  2. BigQuery の Azure アプリケーションにロールを割り当てます

連携以外の ID を使用した場合は、次の手順を行います。

  1. Azure AD サービス プリンシパルを作成します。
  2. BigQuery の Azure AD アプリケーションにロールを割り当てます

BigLake テーブルを作成する

BigQuery でのテーブルの作成に詳しい場合、BigLake テーブルの作成プロセスも同様です。 テーブルは、BigLake がサポートするどのファイル形式にもできます。詳細については、制限事項をご覧ください。

Cloud Storage 用の BigLake テーブルを作成する

データセットは、BigLake テーブルを作成する前に必要です。BigLake テーブルを作成するには、次のいずれかのオプションを選択します。

コンソール

  1. BigQuery ページに移動します。

    BigQuery に移動

  2. [エクスプローラ] ペインで、テーブルを作成するデータセットを選択し、[ テーブルを作成] をクリックします。

  3. [テーブルの作成元] で、[Google Cloud Storage] を選択し、Cloud Storage バケットから外部テーブル用のデータソースを選択します。

  4. [ファイル形式] で、ファイルと一致する形式を選択します。

  5. [テーブル] フィールドに、テーブルの名前を入力します(例: mytable)。

  6. [テーブルタイプ] で、テーブルタイプを [外部テーブル] に設定します。 デフォルトでは、[クラウド リソース接続を使用して BigLake テーブルを作成する] チェックボックスが選択されています。

  7. [接続 ID] で、以前に作成した接続を選択します。

  8. [テーブルを作成] をクリックします。

SQL

外部の Cloud Storage テーブルに接続して BigLake テーブルを作成するには、CREATE EXTERNAL TABLE DDL ステートメントを使用します。

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

    BigQuery に移動

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

    CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME`
      WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
      OPTIONS (
        format ="TABLE_FORMAT",
        uris = ['FILE_PATH']);
    

    次のように置き換えます。

    • DATASET: テーブルを作成する BigQuery データセットの名前(例: mydataset
    • EXTERNAL_FILE_NAME: 作成するテーブルの名前(例: mytable
    • TABLE_FORMAT: 作成するテーブルの形式(例: PARQUET
    • FILE_PATH: 作成する外部テーブルのデータソースへのパス(例: gs://mybucket/myfile.parquet

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

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

bq

コマンドライン環境では、--external_table_definition パラメータの末尾で、@connection デコレータを使用して対象の接続を指定します。

bq mk \
    --table \
    --external_table_definition=TABLE_FORMAT=FILE_PATH@projects/PROJECT_ID/locations/REGION/connections/CONNECTION_ID \
    PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME

次のように置き換えます。

  • TABLE_FORMAT: 作成するテーブルの形式(例: PARQUET
  • FILE_PATH: 作成する外部テーブルのデータソースへのパス(例: gs://mybucket/myfile.parquet
  • DATASET: テーブルを作成する BigQuery データセットの名前(例: mydataset
  • EXTERNAL_TABLE_NAME: 作成するテーブルの名前(例: mytable

Terraform

main.tf ファイルに次のセクションを追加します。スキーマの自動検出を使用する場合は、次のセクションの関連する行のコメントを解除します。

## This creates a dataset for your table.
resource "google_bigquery_dataset" "dataset" {
    provider                    = google
    project                     = "PROJECT_ID"
    dataset_id                  = "DATASET"
    location                    = "REGION"
}
## If you are using schema autodetect, uncomment the following to set up ## a delay to give IAM changes time to propagate. #resource "time_sleep" "wait_7_min" { #depends_on = [google_project_iam_member.connectionPermissionGrant] #create_duration = "7m" #}
## This creates a table using the connection id. resource "google_bigquery_table" "biglakeTable" { ## If you are using schema autodetect, uncomment the following to ## set up a dependency on the prior delay. # depends_on = [time_sleep.wait_7_min] dataset_id = google_bigquery_dataset.dataset.dataset_id table_id = "EXTERNAL_TABLE_NAME" project = "PROJECT_ID" schema = <<EOF [ { "name": "country", "type": "STRING" }, { "name": "product", "type": "STRING" }, { "name": "price", "type": "INT64" } ] EOF external_data_configuration { ## Autodetect determines whether schema autodetect is active or inactive. autodetect = AUTODETECT_BOOLEAN source_format = "PARQUET" connection_id = google_bigquery_connection.connection.name source_uris = [ "gs://huron-userguide-demo/orders/*.parquet", ] } deletion_protection = false }

次のように置き換えます。

  • DATASET: テーブルを作成する BigQuery データセットの名前(例: mydataset
  • EXTERNAL_TABLE_NAME: 作成するテーブルの名前(例: mytable
  • AUTODETECT_BOOLEAN: プロジェクトでスキーマの自動検出を使用しているかどうか(true または false など)を定義する

BigLake はスキーマの自動検出をサポートしています。ただし、スキーマを提供せず、前の手順でサービス アカウントに付与されていない場合、スキーマを自動検出しようとすると、アクセス拒否メッセージで失敗します。

Amazon S3 用の BigLake テーブルを作成する

S3 に保存されているデータにアクセスするには、外部テーブルが必要です。Amazon S3 用の BigLake テーブルを作成するには、Amazon S3 データ用の外部テーブルを作成するの手順を行います。

Azure 用の BigLake テーブルを作成する

Azure ストレージに保存されているデータにアクセスするには、外部テーブルが必要です。Azure ストレージ用の BigLake テーブルを作成するには、Azure Storage データ用の外部テーブルを作成するの手順を行います。

外部テーブルを BigLake テーブルにアップグレードする

外部テーブルを Cloud リソース接続に関連付けることで、外部テーブルを BigLake テーブルにアップグレードできます。フラグと引数の完全なリストについては、リファレンス トピックの bq updatebq mkdef をご覧ください。

BigLake がサポートする任意のソース形式を使用できます。詳細については、制限事項をご覧ください。

外部テーブルを BigLake テーブルに更新するには、次のいずれかのオプションを選択します。

SQL

次の例では、CREATE OR REPLACE EXTERNAL TABLE DDL ステートメントを使用して、外部テーブルを Cloud リソース接続に関連付けることで、外部テーブルを BigLake テーブルにアップグレードします。

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

    BigQuery に移動

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

    CREATE OR REPLACE EXTERNAL TABLE
      `EXTERNAL_TABLE_NAME`
      WITH CONNECTION `CONNECTION_ID`
      OPTIONS(
        format="TABLE_FORMAT",
        uris="[FILE_PATH]"
        )
    

    次のように置き換えます。

    • DATASET: テーブルを作成する BigQuery データセットの名前(例: mydataset
    • EXTERNAL_FILE_NAME: 作成するテーブルの名前(例: mytable
    • TABLE_FORMAT: 作成するテーブルの形式(例: PARQUET
    • FILE_PATH: 作成する外部テーブルのデータソースへのパス(例: gs://mybucket/myfile.parquet

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

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

bq

  1. 使用する接続を指定する新しい外部テーブル定義を作成します。

    bq mkdef --connection_id=PROJECT_ID.REGION.CONNECTION_ID \
      --source_format=TABLE_FORMAT \
      "FILE_PATH" > /tmp/DEFINITION_FILE
    

    DEFINITION_FILE は、作成するテーブル定義ファイルの名前で置き換えます(例: tabledefinition.json)。

  2. 新しい外部テーブルの定義を使用してテーブルを更新します。

bq update --external_table_definition=/tmp/DEFINITION_FILE PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME

アクセス制御ポリシーを設定する

BigLake テーブルのアクセス制御ポリシーを作成するには、まず Data Catalog でポリシータグの分類階層を作成します。次に、ポリシータグを機密性の高い行または列に適用します。

  • 列レベルのセキュリティの設定方法については、列レベルのセキュリティ ガイドをご覧ください。

    BigLake の列レベルのアクセス制御ポリシーを定義するワークフローは、BigQuery マネージド テーブルのワークフローと同じです。

  • 行レベルのセキュリティの設定方法については、行レベルのセキュリティ ガイドをご覧ください。

たとえば、データセット mydataset 内のテーブル mytable に対する行アクセスを制限するとします。

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
| JP      | tablet  |   300 |
| UK      | laptop  |   200 |
+---------+---------+-------+

Kim(kim@example.com)用に行レベルのフィルタを作成して、アクセス権を countryUS の行だけに制限できます。

CREATE ROW ACCESS POLICY only_us_filter
ON mydataset.mytable
GRANT TO ('user:kim@example.com')
FILTER USING (country = 'US');

次に、Kim が次のクエリを実行すると:

SELECT * FROM projectid.mydataset.mytable;

出力には、countryUS の行のみが表示されます。

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
+---------+---------+-------+

BigQuery を使用し BigLake テーブルに対してクエリを実行する

クエリを送信には、どの BigQuery クライアントも使用できます。bq コマンドライン ツールを使用する場合は、--nouse_legacy_sql フラグか --use_legacy_sql=false フラグを使用して標準 SQL 構文を指定し query コマンドを使用します。次に例を示します。

bq query --nouse_legacy_sql "SELECT * FROM PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME;"

コネクタを使用して BigLake テーブルに対してクエリを実行する

Cloud Storage 上の BigLake テーブルには、BigQuery 以外のデータ処理ツールを使用してアクセスできます。たとえば、BigQuery コネクタを使うことで、Apache SparkTrinoApache Hive を使用できます。BigQuery Storage API により、Cloud Storage や BigQuery のすべての BigLake テーブルに行レベルと列レベルのガバナンス ポリシーが適用されます。

Spark

次の例では Dataproc を使用していますが、Spark BigQuery コネクタを使用する Spark デプロイメントでも動作します。

この例では、クラスタを作成するときに、初期化アクションとして Spark BigQuery コネクタを指定します。このアクションでは、Zeppelin ノートブックを使用して、データ アナリスト ユーザーの行動を実行できます。

  • Spark BigQuery コネクタの初期化アクションを使用して、単一ノードのクラスタを作成します。

    gcloud dataproc clusters create biglake-demo-cluster \
        --optional-components=ZEPPELIN \
        --region=REGION \
        --enable-component-gateway \
        --single-node \
        --initialization-actions gs://goog-dataproc-initialization-actions-us-central1/connectors/connectors.sh \
        --metadata bigquery-connector-url=gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar \
        --metadata spark-bigquery-connector-url=gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar
    

Dataflow

Dataflow から BigLake テーブルを読み取るには、DIRECT_READ モードで Dataflow コネクタを使用して、BigQuery Storage API を使います。クエリ文字列からの読み取りもサポートされています。Apache Beam ドキュメントの BigQuery I/O をご覧ください。

監査ロギング

BigQuery のロギングについては、BigQuery モニタリングの概要をご覧ください。Google Cloud のロギングの詳細については、Cloud Logging をご覧ください。