Google CloudがBigQueryとSnowflake Horizon Catalogの連携手順を紹介、WIFでサービスユーザーを設定してパスワード不要の認証を実現
公開:
Snowflake Horizonの管理対象Icebergテーブルは、Google Cloud側のフェデレーションカタログを通じてBigQueryと接続できます。WIFによるパスワード不要の認証で、BigQueryはテーブルのメタデータと一時的な認証情報をSnowflake Horizonから得られる構成です。[1]
この記事では、Snowflake Horizon CatalogとBigQueryを接続する手順と、手順で使用・指定する設定値を解説します。手順は、SnowflakeのSQLワークシートとgcloudコマンドラインツールを行き来して進める形です。
目次
Snowflake HorizonとBigQueryの連携
Snowflake Horizonの管理対象Icebergテーブルは、Apache Iceberg RESTカタログのインターフェースを自動で公開します。外部のエンジンがこのカタログを読み取るには、専用の読み取りロールを構成し、データベースやスキーマ、テーブルに権限を付与することが前提です。[1]
BigQueryは、Snowflake Horizonから直接テーブルのメタデータを検出し、クエリ時の一時的な認証情報を取得できます。この認証は、WIFでGoogle Cloudの数値IDをパスワード不要のサービスユーザーに紐付けて、OpenID Connect上で確立されます。
Snowflake Horizonのフェデレーション手順
接続の設定は、Snowflake側の準備から始め、Google Cloudでのカタログ作成を挟んでSnowflakeへ戻ります。手順例のコードは、Snowflake側がSQL、Google Cloud側がbashのgcloudコマンドです。[1]
この手順例では、WIFでGoogle Cloudの数値IDをSnowflakeのパスワード不要のサービスユーザーへ紐付けます。そのため、Google Cloud側でカタログを作成し、割り当てられた数値IDを確認してからSnowflakeへ戻る順序です。
Snowflakeでのテーブル作成
手順例のSQLは、Snowflake SQL worksheetで実行する前提です。sf_retail_dbデータベースとsf_retail_db.coreスキーマは、IF NOT EXISTSで存在しない場合だけ作成する指定です。
dim_customersはCREATE OR REPLACEで作るIcebergテーブルで、既存の同名テーブルは置き換わります。テーブルにはCATALOG = 'SNOWFLAKE'とEXTERNAL_VOLUME = 'SNOWFLAKE_MANAGED'を指定しています。
dim_customersテーブルの列は8つで、customer_keyはINTEGER、signup_dateはDATEです。customer_idやfirst_name、last_name、email、gender、countryの6列はVARCHARです。
外部エンジン向けの読み取りロール作成
外部のエンジンがカタログを読み取る前に、専用の読み取りロールを作り、各階層に権限を付与する必要があります。手順例では、gcp_lakehouse_reader_roleにデータベースとスキーマ、テーブルの権限を付与します。
データベースやスキーマへのUSAGEは階層をたどるための権限で、テーブルへのSELECTは読み取りの権限です。手順例では、同じ読み取りロールを後のgcloudコマンドやサービスユーザーの設定でも指定します。
フェデレーションカタログの作成
Google Cloud側では、gcloudコマンドラインツールでフェデレーションカタログを作成します。作成には、Snowflakeのアカウント識別子や読み取りロール、ルートのIcebergデータベース名が必要です。
フェデレーションカタログを作成するgcloudコマンドの例は、以下の通りです。
export GCP_PROJECT_ID="my-lakehouse-project"
export GCP_REGION="us-central1"
gcloud alpha biglake iceberg catalogs create sf_retail_db \
--project="$GCP_PROJECT_ID" \
--primary-location="$GCP_REGION" \
--catalog-type="federated" \
--federated-catalog-type="snowflake" \
--snowflake-account-identifier="xy12345-ab67890" \
--snowflake-warehouse="SF_RETAIL_DB" \
--snowflake-role="gcp_lakehouse_reader_role" \
--refresh-interval="300s"
公式資料からの抜粋:Cross-cloud conversational analytics made simple with open standards(Connect Snowflake and Big Query / Configure Snowflake Horizon Catalog)。対象版・範囲:Google Cloudブログ掲載の手順例(gcloud alphaコマンド)。
上記のコードでは、カタログの種類にfederated、フェデレーションの種類にsnowflakeを指定しています。Apache Iceberg REST仕様では、--snowflake-warehouseは仮想コンピュートウェアハウスではなく、ルートデータベース名を指します。
Snowflakeのサービスユーザー作成
カタログの作成後は、カタログに割り当てられた数値のサービスアカウントIDを確認します。続いてSnowflakeに戻り、WIFでその数値IDをパスワード不要のサービスユーザーに紐付けます。
手順例のgcloud alpha biglake iceberg catalogs describeは、sf_retail_dbカタログを参照するコマンドです。--format='value(biglake-service-account-id)'の指定により、biglake-service-account-idの値を出力します。
Snowflake側でサービスユーザーを作成するSQLの例は、以下の通りです。
-- Run inside Snowflake SQL worksheet
USE ROLE ACCOUNTADMIN;
-- Bind Google Cloud's numeric identity to a passwordless service user
CREATE OR REPLACE USER snowflake_service_user
TYPE = SERVICE
WORKLOAD_IDENTITY = (
TYPE = GCP
SUBJECT = '102669xxxxxxxxxxxxxxxxx' -- Numeric subject ID returned by gcloud describe
)
DEFAULT_ROLE = gcp_lakehouse_reader_role
COMMENT = 'Service user for Lakehouse catalog federation over WIF';
-- Grant the reader role to this service user
GRANT ROLE gcp_lakehouse_reader_role TO USER snowflake_service_user;
公式資料からの抜粋:Cross-cloud conversational analytics made simple with open standards(Connect Snowflake and Big Query / Configure Snowflake Horizon Catalog)。対象版・範囲:Google Cloudブログ掲載の手順例。
上記のコードでは、SUBJECTにdescribeで返った数値IDを入れ、読み取りロールをサービスユーザーに付与しています。この設定によって、OpenID Connect上でパスワード不要の認証が確立されます。
Snowflake Horizon手順例の実行環境
手順例のgcloudコマンドは、gcloud alphaで始まるbiglake iceberg catalogsのコマンドです。Snowflake側のサービスユーザー作成は、手順例ではACCOUNTADMINロールで実行しています。[1]
手順例のリージョンはus-central1で、東京や大阪のリージョンを指定した例は含まれていません。テーブルの例は、CATALOGにSNOWFLAKE、EXTERNAL_VOLUMEにSNOWFLAKE_MANAGEDを指定したIcebergテーブルです。
Snowflakeフェデレーション手順例の照合項目
編集部では、手順例の値を利用者の環境へ置き換える場合に、Snowflake側とGoogle Cloud側の両方に現れる値を3つに整理しました。リージョンの指定は、この3つとは別に、条件に当てはまる場合だけ確かめる項目として節の最後に示します。
gcloud alpha biglake iceberg catalogs createを使う場合は、--snowflake-warehouseの値を確かめます。照合するのは、値が仮想コンピュートウェアハウス名ではなくルートデータベース名かどうかです。[1]
手順例と同じロール構成にする場合は、--snowflake-roleとDEFAULT_ROLEが同じ読み取りロールかも照合の対象です。手順例では、どちらにもgcp_lakehouse_reader_roleを指定しています。
3つの照合項目とは別に、東京や大阪のリージョンでカタログを作成したい場合は、手順例のus-central1に代わる値を利用前に確かめる必要があるでしょう。手順例では、環境変数GCP_REGIONを通じて--primary-locationにus-central1を渡しています。
出典
- ^ Google Cloud. 「Cross-cloud conversational analytics made simple with open standards」. https://cloud.google.com/blog/products/data-analytics/cross-cloud-conversational-analytics-with-borderless-lakehouse, (参照 26-10-13).
※本記事は公式の一次情報を基に編集しています。内容はAIで確認していますが、誤りや最新情報との差異がある場合は、以下フォームよりご報告ください。
修正・削除・掲載などの依頼はこちら














