Snowflake (Okta) でフェデレーテッドクエリを実行する
このページでは、 Databricksによって管理されていないSnowflakeデータに対してフェデレーション クエリを実行するためにレイクハウスフェデレーションをセットアップする方法について説明します。 レイクハウスフェデレーションの詳細については、 「レイクハウスフェデレーションとは何ですか?」を参照してください。
レイクハウスフェデレーションを使用してSnowflakeデータベースに接続するには、 Databricks Unity Catalogメタストアに次のものを作成する必要があります。
- Snowflake データベースへの 接続 。
- Unity Catalog 内のSnowflakeデータベースをミラーリングする フォーリンカタログ で、 Unity Catalog クエリー構文およびデータガバナンスツールを使用して、データベースへのDatabricksユーザーアクセスを管理できます。
Okta を外部 OAuth プロバイダーとして使用して、Snowflake データに対してフェデレーション クエリを実行する方法を学習します。このページでは、ユーザーからマシンへの (U2M) フローとマシンからマシンへの (M2M) フローの両方について説明します。
その他の認証方法については、次のページを参照してください。
クエリ フェデレーションまたはカタログ フェデレーションを使用して、Snowflake でフェデレーション クエリを実行できます。
クエリ フェデレーションでは、 JDBC Unity Catalogクエリを外部データベースにプッシュします。 これは、ETL パイプラインでのオンデマンド レポートや概念実証作業に最適です。
カタログ フェデレーションでは、 Unity Catalogクエリがファイル ストレージに対して直接実行されます。 このアプローチは、コードを調整せずに段階的に移行する場合や、Unity Catalog に登録されたデータと並行して Snowflake の一部のデータを維持する必要がある組織向けの長期的なハイブリッド モデルとして役立ちます。「Snowflake カタログ フェデレーションの有効化」を参照してください。
始める前に
ワークスペースの要件:
- Unity Catalogのワークスペースが有効になっています。
コンピュートの要件:
- コンピュート・リソースからターゲット・データベース・システムへのネットワーク接続。 レイクハウスフェデレーションのネットワーキングに関する推奨事項を参照してください。
- Databricksコンピュートでは、 Databricks Runtime 13.3 LTS以降と 標準 または 専用 アクセス モードを使用する必要があります。
- SQLウェアハウスはProまたはServerlessで、2023.40以上を使用している必要があります。
必要な権限:
- 接続を作成するには、メタストア管理者か、ワークスペースに接続されているUnity Catalogメタストアの CREATE CONNECTION権限を持つユーザーである必要があります。
- フォーリンカタログを作成するには、メタストアに対する CREATE CATALOG権限を持ち、接続の所有者であるか、接続に対するCREATE FOREIGN CATALOG権限を持っている必要があります。
追加の権限要件は、以下の各タスクベースのセクションに記載しています。
Snowflake の外部 OAuth とは何ですか?
外部 OAuth は、Snowflake にアクセスするために OAuth 2.0 を使用する外部サーバーを使用できる認証方法です。ユーザーまたはアプリケーションがSnowflakeに直接ログインする代わりに、OAuthプロバイダー(例:Okta、Microsoft Entra ID、または PingFederate など)。
次に、 OAuthプロバイダーがアクセス VPN を発行し、 Databricks Snowflakeにそれを提示します。 次に、Snowflake は構成されたセキュリティ統合を使用してトークンの署名とクレームを検証し、アクセスを許可します。
OAuthフローを決定する
Snowflake コネクタに適切な OAuth フローを選択するには、U2M (ユーザー対マシン) と M2M (マシン対マシン) という 2 つの主要なタイプを理解する必要があります。
U2M は、アプリケーション (Databricks) がユーザーに代わって操作する許可を受け取る承認フローです。このフローは対話型です。つまり、ユーザーは外部接続を作成するときにサインインを求められ、アプリケーションは ユーザーの権限にスコープ設定されたアクセストークンを 受け取ります。
M2M は、アプリケーションがユーザーの介入なしに直接リソースにアクセスする必要がある場合に使用される非対話型フローです。このフローでは、特定のユーザーとは無関係に、一連の権限を使用してアプリケーションを OAuth プロバイダーに登録する必要があります。
Databricks ワークスペースでは、 OAuth は U2M 認証を指し、 OAuth Machine to Machine は M2M 認証を指します。
Oktaを構成する
正確な Okta 構成は、会社のニーズとポリシーによって異なります。このセクションと次のセクションのステップは、機能的なOAuthセットアップに到達するためのガイドとして機能し、包括的な Okta リソースではなく、単純な実際の例を示しています。 Okta のプラットフォームと機能の詳細については、Okta のドキュメントを参照してください。
OAuthクライアントを作成する
Okta の OAuth 互換クライアントは、トークンを取得するために Okta の認可サーバーと対話する必要があるアプリケーションを表します。この場合、クライアントは Databricks を表します。
- 
Okta 管理コンソールで、 「アプリケーション」 に移動し、 「アプリ統合の作成」を クリックします。 
- 
OIDC (OpenID Connect) サインイン方法を選択します。 
- 
アプリケーションの種類を選択します: - (U2M のみ) ネイティブ アプリケーション を選択します。
- (M2M のみ) Web アプリケーション を選択します。
 
- 
次へ をクリックします。 
- 
アプリケーションの名前を入力します。 
- 
付与タイプを選択してください: - (U2M のみ) 認証コード と 更新トークン を選択します。
- (M2M のみ) クライアント資格情報 を選択します。
 
- 
(U2M のみ) サインイン リダイレクト URI として https://<WORKSPACE>/login/oauth/snowflake.htmlを追加します。
- 
制御されたアクセスに必要な値を選択します。テスト目的であれば、 組織内のすべてのユーザーにアクセスを許可すれば 十分です。 
- 
フェデレーション ブローカーModeを有効にすると、即時アクセスを 維持できます。 
- 
保存 をクリックします。 新しく作成されたアプリケーション ページにリダイレクトされます。 
- 
[クライアント資格情報] セクションで、 クライアント ID の値をメモします。 
- 
[編集] を クリックし、 [クライアント シークレット] を選択して、 [保存] をクリックします。 
- 
シークレットをコピーし、この値を後で使用するために保存します。 
フェデレーション ブローカーModeで即時アクセスを無効にする場合は、割り当てタブでユーザーを割り当てる必要があります。 詳細については、Okta のドキュメントを参照してください。
認可サーバーを作成する
- 
Okta 管理コンソールで、 [セキュリティ ] セクションを展開し、 [API] を クリックします。 
- 
[認証サーバーの追加] をクリックします。 
- 
名前を入力してください。 
- 
対象ユーザーの場合は、URL スキーマ ( httpsプレフィックス) を保持したまま、Snowflake JDBC URL とホストを使用します。
- 
[保存] をクリックします。新しく作成された認証サーバーにリダイレクトされます。 
- 
[スコープ] タブで、 [スコープの追加] をクリックします。希望する Snowflake スコープの名前を設定します (例: session:role:PUBLIC)。 [作成] をクリックします。
- 
[アクセス ポリシー] をクリックし、 [新しいアクセス ポリシーの追加] をクリックします。 
- 
ポリシーの名前と説明を入力します。 
- 
作成したクライアントにポリシーを割り当て、 [作成] をクリックします。 
- 
アクセス ポリシーで、 [ルールの追加] をクリックします。 
- 
ルール名を入力します。 
- 
承認された許可の種類を選択します: - (U2M のみ) 認証コード を選択します。
- (M2M のみ) クライアント資格情報 を選択します。
 
- 
スコープについては、 「任意のスコープ」 を選択するか、以前に作成した目的のスコープを選択できます。 
- 
(U2M のみ) 更新を受信したい場合は、スコープのリストに offline_accessを含めてください。
- 
必要に応じて追加の設定を構成します。 
- 
最後に、 「ルールの作成」を クリックします。 
Okta 情報の取得
次の情報をメモしてください。
- 
クライアント ID とクライアント シークレット: 作成したクライアント アプリケーションから取得します。 
- 
OIDC (OpenID Connect) メタデータ: - 認可サーバー ページで、 [設定] タブの [メタデータ URI] リンクをクリックします。
- (U2M のみ) 次の形式で authorization_endpoint 値をコピーします。 https://<OKTA_ENV_ID>.okta.com/oauth2/<AUTH_SERVER_ID>/v1/authorize
- (M2M のみ) メタデータ URI リンクをコピーします。Databricks の Snowflake M2M 接続は、このメタデータを直接読み取り、必要なすべての情報を自動的に取得します。
- 発行者の 値をコピーします。これは、Snowflake のセットアップ中に必要になります。
 
セキュリティ統合を作成する
このステップでは、 Snowflakeでセキュリティ統合を構成し、 Snowflake Okta と安全に通信し、ウイルスを検証し、 OAuthアクセス ウイルスに関連付けられたロールに基づいて適切なデータ アクセスを提供できるようにします。
- U2M flow
- M2M flow
- 
ACCOUNTADMINロールを持つユーザーとして Snowflake アカウントに接続します。
- 
CREATE SECURITY INTEGRATIONコマンドを実行します。例えば:SQLCREATE SECURITY INTEGRATION <OKTA_U2M_SECURITY_INTEGRATION_NAME>
 TYPE = EXTERNAL_OAUTH
 ENABLED = TRUE
 EXTERNAL_OAUTH_TYPE = OKTA
 EXTERNAL_OAUTH_ISSUER = '<OKTA_OAUTH_ISSUER_URL>'
 EXTERNAL_OAUTH_JWS_KEYS_URL = '<OKTA_OAUTH_ISSUER_URL>/v1/keys'
 EXTERNAL_OAUTH_AUDIENCE_LIST = ('<SNOWFLAKE_APPLICATION_ID_URI>')
 EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
 EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'EMAIL_ADDRESS';この例では、電子メール マッピングのクレームと属性を使用します。 これには、 Snowflakeユーザーの電子メールが Okta ユーザーの電子メールと一致する必要があります。 SQLALTER USER <SNOWFLAKE_USER> SET EMAIL = '<YOUR_EMAIL>';要件に応じて、さまざまなクレームを使用できます。 
- 
ACCOUNTADMINロールを持つユーザーとして Snowflake アカウントに接続します。
- 
CREATE SECURITY INTEGRATIONコマンドを実行します。例えば:SQLCREATE OR REPLACE SECURITY INTEGRATION <OKTA_M2M_SECURITY_INTEGRATION_NAME>
 TYPE = EXTERNAL_OAUTH
 ENABLED = TRUE
 EXTERNAL_OAUTH_TYPE = OKTA
 EXTERNAL_OAUTH_ISSUER = '<OKTA_OAUTH_ISSUER_URL>'
 EXTERNAL_OAUTH_JWS_KEYS_URL = '<OKTA_OAUTH_ISSUER_URL>/v1/keys'
 EXTERNAL_OAUTH_AUDIENCE_LIST = ('<SNOWFLAKE_APPLICATION_ID_URI>')
 EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
 EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'login_name';データベースに接続するクライアントを表すには、Snowflake で新しい非人間ユーザーを作成する必要があります。ログイン名を OAuth クライアントのクライアント ID に設定します。 SQLCREATE OR REPLACE USER <OKTA_M2M_CLIENT_USER>
 LOGIN_NAME = '<CLIENT_ID>'
 DEFAULT_ROLE = 'PUBLIC';
接続を作成する
接続では、外部データベースシステムにアクセスするためのパスと認証情報を指定します。接続を作成するには、カタログエクスプローラーを使用するか、Databricksノートブックまたは Databricks SQLクエリーエディタで CREATE CONNECTION SQLコマンドを使用できます。
Databricks REST API または Databricks CLI を使用して接続を作成することもできます。 POST /api/2.1/unity-catalog/connections および Unity Catalog コマンドを参照してください。
必要な権限: メタストア管理者またはCREATE CONNECTION権限を持つユーザー。
- U2M flow
- M2M flow : Catalog Explorer
- M2M flow : SQL
- 
Databricks ワークスペースで、 カタログ をクリックします。 
- 
カタログ ウィンドウの上部にある 追加 アイコンをクリックし、メニューから 接続の追加 を選択します。 または、 クイックアクセス ページから 外部データ > ボタンをクリックし、 接続 タブに移動して 接続を作成 をクリックします。 
- 
接続のセットアップ ウィザードの 「接続の基本」 ページで、ユーザーフレンドリな 接続名 を入力します。 
- 
Snowflake の 接続タイプ を選択します。 
- 
認証タイプ については、ドロップダウン メニューから OAuth選択します。
- 
(オプション)コメントを追加します。 
- 
次へ をクリックします。 
- 
Snowflake ウェアハウスの次の認証および接続の詳細を入力します。 - ホスト :例えば、 snowflake-demo.east-us-2.azure.snowflakecomputing.com
- ポート : たとえば、 443
- ユーザー : 例えば、 snowflake-user
- 認可エンドポイント : https://<OKTA_ENV_ID>.okta.com/oauth2/<AUTH_SERVER_ID>/v1/authorize
- クライアント シークレット : セキュリティ統合を作成したときに保存したクライアント シークレット。
- クライアント ID : セキュリティ統合を作成したときに保存したクライアント ID。
- OAuthスコープ : session:role:PUBLIC offline_access
- OAuthプロバイダー : Okta
- Okta でサインイン : クリックして、Okta の資格情報を使用して Snowflake にサインインします。
 
- ホスト :例えば、 
- 
次へ をクリックします。 
- 
接続について次の 接続詳細 を入力します。 - Snowflake ウェアハウス : 使用するウェアハウスの名前。
- (オプション) プロキシの使用 : プロキシ サーバーを使用して Snowflake に接続するかどうか。
- (オプション) プロキシ ホスト : Snowflake への接続に使用されるプロキシのホスト。また、 「プロキシを使用する」 を選択し、 プロキシ ポート を指定する必要があります。
- (オプション) プロキシ ポート : Snowflake への接続に使用されるプロキシのポート。また、 「プロキシを使用する」 を選択し、 プロキシ ホスト を指定する必要があります。
- (オプション) Snowflake ロール : 接続後にセッションで使用するデフォルトのセキュリティ ロール。
 
- 
接続の作成 をクリックします。 
- 
カタログの基本 ページで、フォーリンカタログの名前を入力します。 
- 
(オプション)[ 接続をテスト ]をクリックして、動作することを確認します。 
- 
[ カタログを作成 ] をクリックします。 
- 
[アクセス] ページで、作成したカタログにユーザーがアクセスできるワークスペースを選択します。 [すべてのワークスペースにアクセス権があります] を選択するか、 [ワークスペースに割り当て] をクリックしてワークスペースを選択し、 [割り当て] をクリックすることができます。 
- 
カタログ内のすべてのオブジェクトへのアクセスを管理できる 所有者 を変更します。テキスト ボックスにプリンシパルの入力を開始し、返された結果内のプリンシパルをクリックします。 
- 
カタログに対する 権限 を付与します。 許可 をクリックします: - 
カタログ内のオブジェクトにアクセスできる プリンシパル を指定します。テキスト ボックスにプリンシパルの入力を開始し、返された結果内のプリンシパルをクリックします。 
- 
各プリンシパルに付与する 権限プリセットを 選択します。すべてのアカウント ユーザーにデフォルトで BROWSEが付与されます。- ドロップダウン メニューから データ リーダー を選択して、カタログ内のオブジェクトに対するread権限を付与します。
- ドロップダウン メニューから データ エディターを 選択して、カタログ内のオブジェクトに対するreadおよびmodify権限を付与します。
- 付与する権限を手動で選択します。
 
- ドロップダウン メニューから データ リーダー を選択して、カタログ内のオブジェクトに対する
- 
付与 をクリックします。 
 
- 
- 
次へ をクリックします。 
- 
メタデータ ページで、タグのキーと値のペアを指定します。詳細については、 Unity Catalogセキュリティ保護可能なオブジェクトにタグを適用する」を参照してください。 
- 
(オプション)コメントを追加します。 
- 
保存 をクリックします。 
- 
Databricks ワークスペースで、 カタログ をクリックします。 
- 
カタログ ウィンドウの上部にある 追加 アイコンをクリックし、メニューから 接続の追加 を選択します。 または、 クイックアクセス ページから 外部データ > ボタンをクリックし、 接続 タブに移動して 接続を作成 をクリックします。 
- 
接続のセットアップ ウィザードの 「接続の基本」 ページで、ユーザーフレンドリな 接続名 を入力します。 
- 
Snowflake の 接続タイプ を選択します。 
- 
認証タイプ については、ドロップダウン メニューから OAuth Machine to Machine選択します。
- 
(オプション)コメントを追加します。 
- 
次へ をクリックします。 
- 
接続の次の認証詳細を入力します。 - ホスト :例えば、 snowflake-demo.east-us-2.azure.snowflakecomputing.com
- ポート : たとえば、 443
- Openid メタデータエンドポイント : https://<OKTA_ENV_ID>.okta.com/oauth2/<AUTH_SERVER_ID>/.well-known/oauth-authorization-server
- クライアント シークレット : セキュリティ統合を作成したときに保存したクライアント シークレット。
- クライアント ID : セキュリティ統合を作成したときに保存したクライアント ID。
- OAuthスコープ : session:role:PUBLIC
 
- ホスト :例えば、 
- 
次へ をクリックします。 
- 
接続について次の接続詳細を入力します。 - Snowflake ウェアハウス : 使用するウェアハウスの名前。
- (オプション) プロキシ ホスト : Snowflake への接続に使用されるプロキシのホスト。また、 「プロキシを使用する」 を選択し、 プロキシ ポート を指定する必要があります。
- (オプション) プロキシの使用 : プロキシ サーバーを使用して Snowflake に接続するかどうか。
- (オプション) プロキシ ポート : Snowflake への接続に使用されるプロキシのポート。また、 「プロキシを使用する」 を選択し、 プロキシ ホスト を指定する必要があります。
- (オプション) Snowflake ロール : 接続後にセッションで使用するデフォルトのセキュリティ ロール。
 
- 
接続の作成 をクリックします。 
- 
カタログの基本 ページで、フォーリンカタログの名前を入力します。 
- 
(オプション)[ 接続をテスト ]をクリックして、動作することを確認します。 
- 
[ カタログを作成 ] をクリックします。 
- 
[アクセス] ページで、作成したカタログにユーザーがアクセスできるワークスペースを選択します。 [すべてのワークスペースにアクセス権があります] を選択するか、 [ワークスペースに割り当て] をクリックしてワークスペースを選択し、 [割り当て] をクリックすることができます。 
- 
カタログ内のすべてのオブジェクトへのアクセスを管理できる 所有者 を変更します。テキスト ボックスにプリンシパルの入力を開始し、返された結果内のプリンシパルをクリックします。 
- 
カタログに対する 権限 を付与します。 許可 をクリックします: - 
カタログ内のオブジェクトにアクセスできる プリンシパル を指定します。テキスト ボックスにプリンシパルの入力を開始し、返された結果内のプリンシパルをクリックします。 
- 
各プリンシパルに付与する 権限プリセットを 選択します。すべてのアカウント ユーザーにデフォルトで BROWSEが付与されます。- ドロップダウン メニューから データ リーダー を選択して、カタログ内のオブジェクトに対するread権限を付与します。
- ドロップダウン メニューから データ エディターを 選択して、カタログ内のオブジェクトに対するreadおよびmodify権限を付与します。
- 付与する権限を手動で選択します。
 
- ドロップダウン メニューから データ リーダー を選択して、カタログ内のオブジェクトに対する
- 
付与 をクリックします。 
 
- 
- 
次へ をクリックします。 
- 
メタデータ ページで、タグのキーと値のペアを指定します。詳細については、 Unity Catalogセキュリティ保護可能なオブジェクトにタグを適用する」を参照してください。 
- 
(オプション)コメントを追加します。 
- 
保存 をクリックします。 
ノートブックまたはDatabricks SQLクエリーエディタで次のコマンドを実行します。
CREATE CONNECTION <connection-name>
TYPE SNOWFLAKE
OPTIONS (
  host '<hostname>',
  port '443',
  sfWarehouse '<warehouse-name>',
  client_id '<client-id>',
  client_secret '<client-secret>',
  openid_metadata_endpoint '<oidc-metadata-endpoint>',
  oauth_scope 'session:role:PUBLIC'
);
次に、次のコマンドを実行して、新しい接続を使用してフォーリンカタログを作成できます。
CREATE FOREIGN CATALOG <catalog-name>
USING CONNECTION <connection-name>
OPTIONS (database = '<database>');
大文字と小文字を区別するデータベース識別子
フォーリンカタログのdatabaseフィールドは、Snowflake データベース識別子にマップされます。 Snowflake データベース識別子が大文字と小文字を区別しない場合は、フォーリンカタログ<database-name>で使用する大文字と小文字が保持されます。 ただし、Snowflake データベース識別子が大文字と小文字を区別する場合は、大文字と小文字を保持するためにフォーリンカタログ<database-name>を二重引用符で囲む必要があります。
例えば:
- 
databaseに変換されますDATABASE
- 
"database"に変換されますdatabase
- 
"database"""に変換されますdatabase"二重引用符をエスケープするには、別の二重引用符を使用します。 
- 
"database""二重引用符が正しくエスケープされていないため、エラーが発生します。
詳細については、 Snowflakeドキュメントの識別子の要件を参照してください。
サポートされているプッシュダウン
次のプッシュダウンがサポートされています。
- フィルター
- 予測
- 上限
- テーブルのJOIN
- 集計 (平均、相関、CovPopulation、CovSample、カウント、最大、最小、StddevPop、StddevSamp、合計、VariancePop、VarianceSamp)
- 関数(文字列関数、数学関数、データ、時刻およびタイムスタンプ関数、および Alias、Cast、SortOrder などのその他のさまざまな関数)
- Windows の機能 (密度ランク、ランク、行番号)
- ソート
データ型のマッピング
Snowflake から Spark に読み取る場合、データ型は次のようにマップされます。
| Snowflake型 | Sparkタイプ | 
|---|---|
| decimal, number, numeric | DecimalType | 
| bigint, byteint, int, integer, smallint, tinyint | IntegerType | 
| float, float4, float8 | FloatType | 
| double, double precision, real | DoubleType | 
| char, character, string, text, time, varchar | StringType | 
| binary | BinaryType | 
| boolean | BooleanType | 
| 日付 | DateType | 
| datetime, timestamp, timestamp_ltz, timestamp_ntz, timestamp_tz | TimestampType | 
制限事項
- Snowflake OAuth エンドポイントは、Databricks コントロール プレーン IP からアクセスできる必要があります。Databricks サービスとアセットの IP アドレスとドメインを参照してください。Snowflake 、セキュリティ統合レベルでのネットワーク ポリシーの構成をサポートしています。これにより、承認のためにDatabricksコントロール プレーンからOAuthエンドポイントへの直接接続を可能にする別のネットワーク ポリシーが可能になります。