はじめに
Entra ID 認証での手順がわかりにくかったので記録
手順のあらまし
- Entra ID リソース用のアプリケーションの作成
- OAuth クライアント用のアプリケーションの作成
-
- を呼び出す Snowflake セキュリティ統合の作成(この手順では既存の Power BI SSO 用のセキュリティ統合にaudienceを追加)
- Databricks から Snowflake に対する接続を作成する
- 外部カタログを作成する
docs:
前提となる環境の状態:
以下を構成済み
-
Microsoft Entra ID でシングル サインオン用に Snowflake を構成する
- Entra ID ユーザーで Snowflake にログインできるようにする
-
Snowflakeとの Microsoft Entra ID SCIM 統合
- Entra ID ユーザーを Snowflake ユーザーとして自動プロビジョニングする
-
Power BI から Snowflake へのSSO
- Power BI 上で Entra ID にログインして、Snowflake に認証する
実施記録
1. Entra ID リソース用のアプリケーションの作成
-
ここでの URI は後続で使用するのでメモします。
:
2. OAuth クライアント用のアプリケーションの作成
-
リダイレクト URI (WEB)を追加する。docsにならい、https:///login/oauth/snowflake.html の形式。
-
シークレットとテナント ID や クライアント ID をメモしておきます。
3. Snowflake セキュリティ統合の作成
ここではセキュリティ統合を作成するが、docs通りにやると、既存の Power BI SSO 用セキュリティ統合の存在により、以下の種類および同じテナント ID でのセキュリティ統合が作成されているため、エラーが発生する
type = external_oauth
external_oauth_type = azure
このような場合は、audience を追加することで対応
実際の SQL はこちら ※IDなどは別値
create or replace security integration powerbi
type = external_oauth
enabled = true
external_oauth_type = azure
external_oauth_issuer = 'https://sts.windows.net/tenant/'
external_oauth_jws_keys_url = 'https://login.windows.net/common/discovery/keys'
external_oauth_audience_list = ('https://analysis.windows.net/powerbi/connector/Snowflake', 'https://analysis.windows.net/powerbi/connector/snowflake','api://aaaaaaaaaaaaaaaaaaaaaaaaa')
external_oauth_token_user_mapping_claim = 'upn'
external_oauth_snowflake_user_mapping_attribute = 'login_name';
4. Databricks から Snowflake に対する接続を作成する
- 接続作成画面に移動
- 接続の基本
- 接続を確立する
先ほどメモした、 OAuth クライアント の情報や /.default offline_access を入力
- 成功すると次の画面に進める
- 接続で使用する Snowflake の WH とロールを設定して接続作成完了
5. 外部カタログを作成する
続けて作成した場合のキャプチャ
-
カタログ名とデータベースを指定する
-
Iceberg カタログフェデレーションをする際は認証パス(iceberg の配置先)と、ストレージの場所(iceberg 読取用のdelta log などのメタデータを生成する場所)を構成する
20250807 現時点では、認証パスで設定されているようなマネージドiDを使用してのアクセスはできませんでした。
iceberg メタデータは blob.windows.net のエンドポイントを指す形で作成されるため、そこから生成される delta_log も blob エンドポイントを参照してしまうのですが、Unity Catalog は Blob エンドポイントをサポートしておらず、外部ロケーションとして構成・認証ができないためです。回避策は現時点では、spark conf に認証情報を取得するほかなく、Unity Catalog 対応のサーバレスクラスターからのアクセスはできません。
サーバレス SQL ウェアハウスであれば、データアクセスの構成による spark conf 設定が可参考:https://qiita.com/ryoma-nagata/items/39fd52ab81015e3c9527
-
接続のテストをします。このようにエラーが出たら権限が不足しています。
ログから操作内容を確認して不足権限を洗い出すといいです。
-
この環境では以下のように権限付与しました。テーブルはやりすぎたかもしれません。
sql-- 1) ロール切り替え(SECURITYADMIN or 権限付与可能なロールで実行) USE ROLE SECURITYADMIN; -- 2) データベースへの参照権限 GRANT USAGE, MONITOR ON DATABASE ICEBERG_ON_AZURE TO ROLE ANALYST; -- 3) スキーマへの参照権限 GRANT USAGE ON SCHEMA ICEBERG_ON_AZURE.PUBLIC TO ROLE ANALYST; -- 4) 既存テーブルへの SELECT 権限 GRANT SELECT ON ALL TABLES IN SCHEMA ICEBERG_ON_AZURE.PUBLIC TO ROLE ANALYST; -- 5) 今後作成されるテーブルへの自動 SELECT 権限 GRANT SELECT ON FUTURE TABLES IN SCHEMA ICEBERG_ON_AZURE.PUBLIC TO ROLE ANALYST; -- 6) 外部ボリュームへの参照権限 GRANT USAGE ON EXTERNAL VOLUME EXT_VOL_AZURE TO ROLE ANALYST; -- 7) ウェアハウスのモニター権限(クエリ実行用ウェアハウス) GRANT MONITOR ON WAREHOUSE compute_wh TO ROLE ANALYST;
カタログの確認
カタログ作成が成功したら画面更新をすると、テーブル情報が反映されます。
カタログへの反映の際、裏側ではこんなクエリが発生しています。
カタログフェデレーションの対象として、 iceberg であることが認識できるとこのような表示に
前述のデータアクセスの構成をして、blob.core のエンドポイントにサーバレス SQL WH が認証できるようにしています。
Iceberg テーブルのサンプルデータの表示は Databricks のコンピューティングにより実行されます。
ストレージの場所として選んだパスでは、このようにdelta log が生成されます。
ただし、前述のように、iceberg のメタデータをもとにしているため delta_log でも blob.core が使用され、これが認証の問題を起こします。