はじめに
Databricks Serverless から Private Link Service Direct Connect を利用して、Snowflake 用の Private Endpoint を経由し、Snowflake の Private Link Service に接続する方法を検証しました。
また、上記のネットワーク経路の確認するために、Databricks から Catalog Federation 経由で Snowflake のマネージド Iceberg テーブルへ接続します。
検証したネットワーク構成のイメージは以下の通りです。
Databricks Serverless
↓
Databricks NCC
↓
Databricks 管理 Private Endpoint
↓
Private Link Service Direct Connect
↓
Snowflake Private Endpoint IP
↓
Snowflake Private Link Service
注意
本記事は検証結果の共有です。Microsoft 公式ドキュメントでは、Private Link Service Direct Connect の制限事項として「宛先として Private Endpoint はサポートされない」と記載されています。
そのため、本番利用する場合は Microsoft / Databricks / Snowflake のサポートへの確認を推奨します。
関連する構成要素
Databricks Network Connectivity Configuration(NCC)
NCC は、Databricks Serverless compute からプライベート接続を行うためのネットワーク接続設定です。
Databricks Serverless からユーザー管理 VNet 内のリソースへ接続する場合、NCC に Private Endpoint Rule を作成し、対象の Private Link Service へ接続します。
Azure Private Link Service
Private Link Service は、自分の VNet 内のサービスを Private Link 経由で他のネットワークから利用できるようにするための Azure リソースです。
通常の Private Link Service では、以下のように Standard Load Balancer を利用します。
Private Link Service Direct Connect
Private Link Service Direct Connect は、Load Balancer を経由せず、Private Link Service から指定したプライベート IP へ直接接続する構成です。
通常の Private Link Service で必要となる Load Balancer / Backend Pool を省略できる点が特徴です。
本機能は 2026/07/03 時点でパブリックプレビュー段階です。
Catalog Federation
データを Databricks にコピーせずに、外部カタログのメタデータを Unity Catalog に連携し、Databricks から参照できるようにする仕組みです。
本記事では、Snowflake カタログに登録されている Iceberg テーブルを参照するために利用します。
実施手順
1. Snowflake の Private Link 情報を取得
Snowflake 側で SYSTEM$GET_PRIVATELINK_CONFIG を実行し、Private Link 構成に必要な情報を取得します。
USE ROLE ACCOUNTADMIN;
SELECT
key,
value
FROM TABLE(
FLATTEN(INPUT => PARSE_JSON(SYSTEM$GET_PRIVATELINK_CONFIG()))
)
ORDER BY key;
取得する主な値は以下です。
| 項目 | 内容 |
|---|---|
privatelink-pls-id |
Snowflake 側 Private Link Service の識別子 |
privatelink-account-url |
Private Link 用 Snowflake アカウント URL |
privatelink_ocsp-url |
OCSP 用 Private Link URL |
snowsight-privatelink-url |
Snowsight 用 PrivateLink URL |
2. Snowflake 向け Private Endpoint を作成
Azure 側で Snowflake 向け Private Endpoint を作成します。
Private Endpoint 作成時は、接続先として Snowflake から取得した privatelink-pls-id を指定します。
接続方法は「リソース ID またはエイリアスを使って~~~」を選択して、前の手順で取得した privatelink-pls-id の値を入力します。
作成直後は、Private Endpoint の接続状態が Pending になります。
3. Snowflake で Private Endpoint を承認
Snowflake で以下を実行して、Private Endpoint を承認します。
USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$AUTHORIZE_PRIVATELINK(
'<private-endpoint-resource-id>',
'<azure-access-token>'
);
private-endpoint-resource-id の取得
Azure Portal で Private Endpoint の JSON ビューを表示して、リソース ID (ARM Resource ID) をコピーします。
取得できる値は以下のような形式です。
/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/privateEndpoints/<private-endpoint-name>
azure-access-token の取得
Azure CLI で Azure access token を取得します。
az account get-access-token \
--subscription <subscription-id>
出力例:
{
"accessToken": "eyJ...",
"expiresOn": "...",
"subscription": "...",
"tenant": "...",
"tokenType": "Bearer"
}
承認状態の確認
承認されると、Azure Portal 側の Private Endpoint の接続状態が Approved になります。
4. Private Link Service Direct Connect を作成
作成する前に
本機能は 2026/07/03 時点でパブリックプレビュー段階であり、Azure Portal から作成するには以下のリンクを介して利用します。
本記事では Azure Portal での作成手順を示します。
設定値
Private Link Service を作成し、接続方法は 宛先 IP アドレス を選択します。
(宛先)IP アドレスには手順2で作成した Snowflake の Private Endpoint IP を指定します。
NAT IP は 2つ以上 を 静的 に割り当てる必要があります。また、NAT IP から宛先 IP アドレスに到達できる必要があります。
5. Databricks で NCC を作成
Account Console から NCC を作成します。
対象の Databricks ワークスペースと同じリージョンで作成します。
6. NCC にプライベートエンドポイントルールを追加
作成した NCC にプライベートエンドポイントルールを追加します。
AzureリソースID には、手順4で作成した Private Link Service のリソース ID を指定します。
ドメインには、手順1で取得した Snowflake の Privatelink 情報を指定します。
7. NCC で作成した Private Endpoint を承認
Databricks NCC でプライベートエンドポイントルールを作成すると、Private Link Service に接続要求が作成されます。
Azure Portal で Private Link Service のプライベートエンドポイント接続を確認し、Databricks からの接続要求を承認します。
承認後、Databricks 側のプライベートエンドポイントルールが ESTABLISHED になることを確認します。
8. Snowflake にて外部ボリュームを作成
Databricks Serverless から Snowflake への Private Link 接続を確認するため、Databricks の Catalog Federation を作成します。
その準備として、Snowflake にて、Iceberg Table の出力先として外部ボリュームを作成します。出力先には ADLS を設定します。
ADLS 向け Private Link endpoint を作成
本記事では ADLS への接続も Private Link 経由にするため、Private Link endpoint を作成します。
USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
'<storage_account_resource_id>',
'<storage_account>.dfs.core.windows.net',
'dfs'
);
Azure Storage Account で Private Endpoint を承認する
Azure Portal で対象の ADLS を開き、Snowflake から作成された Private Endpoint を承認します。
承認後、Snowflake で以下を実行し、対象 ADLS の private endpoint が Aprroved になっていれば OK です。
USE ROLE ACCOUNTADMIN;
WITH raw AS (
SELECT PARSE_JSON(SYSTEM$GET_PRIVATELINK_ENDPOINTS_INFO()) AS arr
),
flattened AS (
SELECT PARSE_JSON(f.value::STRING) AS info
FROM raw,
TABLE(FLATTEN(input => arr)) f
)
SELECT
info:provider_resource_id::STRING AS provider_resource_id,
info:snowflake_resource_id::STRING AS snowflake_resource_id,
info:host::STRING AS host,
info:endpoint_state::STRING AS endpoint_state,
info:subresource::STRING AS subresource,
info:status::STRING AS status
FROM flattened;
外部ボリュームの作成
ADLS への接続を Private Link 経由にするため、STORAGE_LOCATIONS の中に USE_PRIVATELINK_ENDPOINT = TRUE を指定します。
また、Snowflake から Iceberg テーブルに書き込む場合は、ALLOW_WRITES = TRUE とします。
USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE EXTERNAL VOLUME <external_volume_name>
STORAGE_LOCATIONS =
(
(
NAME = '<name>'
STORAGE_PROVIDER = 'AZURE'
STORAGE_BASE_URL = 'azure://<storage_account>.dfs.core.windows.net/<container>/<path>/'
AZURE_TENANT_ID = '<azure_tenant_id>'
USE_PRIVATELINK_ENDPOINT = TRUE
)
)
ALLOW_WRITES = TRUE;
作成した外部ボリュームは UI でも確認できます。
Azure Consent URL から Snowflake アプリに同意する
作成した外部ボリュームの詳細から、Azure テナントへの同意に必要な AZURE_CONSENT_URL と AZURE_MULTI_TENANT_APP_NAME を取得します。
DESC EXTERNAL VOLUME <external_volume_name>;
SELECT
PARSE_JSON($4):AZURE_MULTI_TENANT_APP_NAME::string AS AZURE_MULTI_TENANT_APP_NAME,
PARSE_JSON($4):AZURE_CONSENT_URL::string AS AZURE_CONSENT_URL
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE $2 = 'STORAGE_LOCATION_1';
AZURE_CONSENT_URL にアクセスし、Microsoft の許可リクエストページで 承諾 をクリックします。
Azure Storage Account に IAM ロールを付与する
Azure Portal で対象の Storage Account を開き、Snowflake のサービスプリンシパル( AZURE_MULTI_TENANT_APP_NAME )にロールを付与します。
本記事では ストレージ BLOB データ共同作成者 (Storage Blob Data Contributor) を付与しています。
外部ボリュームを検証する
Snowflake で以下を実行し、正常に検証できれば、Snowflake から ADLS へのアクセスが Private Link 経由で行える状態です。
SELECT PARSE_JSON(SYSTEM$VERIFY_EXTERNAL_VOLUME('EXVOL_ADLS_DFS'));
9. Snowflake にて検証用のデータベースオブジェクト作成
CATALOG FEDERATION するためのデータベース・スキーマ・Iceberg テーブルを作成します。
サンプルコード
-- 検証用データベース・スキーマ作成
CREATE DATABASE IF NOT EXISTS CATALOG_FEDERATION_TEST_DB;
CREATE SCHEMA IF NOT EXISTS CATALOG_FEDERATION_TEST_DB.SCH_02;
-- 検証用 ICEBERG テーブル作成
CREATE OR REPLACE ICEBERG TABLE CATALOG_FEDERATION_TEST_DB.SCH_02.SALE_ICEBERG_01 (
SALE_ID NUMBER(38,0),
STORE_ID STRING,
ITEM_ID STRING,
QUANTITY NUMBER(38,0),
AMOUNT NUMBER(18,2),
SOLD_AT TIMESTAMP_NTZ(6),
UPDATED_AT TIMESTAMP_NTZ(6)
)
EXTERNAL_VOLUME = 'EXVOL_ADLS_DFS'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'SALE_ICEBERG_01/'
;
-- データ挿入
INSERT INTO CATALOG_FEDERATION_TEST_DB.SCH_02.SALE_ICEBERG_01
SELECT
1 AS SALE_ID,
'STORE_001' AS STORE_ID,
'ITEM_001' AS ITEM_ID,
2 AS QUANTITY,
1200.50 AS AMOUNT,
TO_TIMESTAMP_NTZ('2026-06-30 10:00:00.123456') AS SOLD_AT,
TO_TIMESTAMP_NTZ('2026-06-30 10:05:00.123456') AS UPDATED_AT
UNION ALL
SELECT
2,
'STORE_001',
'ITEM_002',
1,
980.00,
TO_TIMESTAMP_NTZ('2026-06-30 10:10:00.987654'),
TO_TIMESTAMP_NTZ('2026-06-30 10:15:00.987654')
UNION ALL
SELECT
3,
'STORE_002',
'ITEM_003',
5,
3500.75,
TO_TIMESTAMP_NTZ('2026-06-30 11:00:00.111222'),
TO_TIMESTAMP_NTZ('2026-06-30 11:10:00.111222')
;
SELECT * FROM CATALOG_FEDERATION_TEST_DB.SCH_02.SALE_ICEBERG_01;
10. Snowflake にてロールの作成および権限付与
Databricks からアクセスできるようにするためのロールと、アクセスできるようにするための権限を付与します。
サンプルコード
-- ロール作成
CREATE ROLE IF NOT EXISTS DBX_READER_02;
-- ロールに対して WH とデータベースオブジェクトへの権限付与
GRANT USAGE ON WAREHOUSE WH_01 TO ROLE DBX_READER_02;
GRANT USAGE ON DATABASE CATALOG_FEDERATION_TEST_DB TO ROLE DBX_READER_02;
GRANT USAGE ON SCHEMA CATALOG_FEDERATION_TEST_DB.SCH_02 TO ROLE DBX_READER_02;
GRANT SELECT ON ALL ICEBERG TABLES IN SCHEMA CATALOG_FEDERATION_TEST_DB.SCH_02 TO ROLE DBX_READER_02;
GRANT SELECT ON FUTURE ICEBERG TABLES IN SCHEMA CATALOG_FEDERATION_TEST_DB.SCH_02 TO ROLE DBX_READER_02;
GRANT USAGE ON EXTERNAL VOLUME EXVOL_ADLS_DFS TO ROLE DBX_READER_02;
11. Snowflake にて PEM 秘密キー認証の設定
本記事では、Snowflakeユーザーの MFA 要件によるエラーを避けるため、Databricks からの接続には PEM 秘密キー認証を採用します。
そのため、ユーザーの作成と公開鍵のセットを実施します。
また、作成したユーザに対してロールの権限を付与します。
サンプルコード
-- ユーザー作成
CREATE USER IF NOT EXISTS DATABRICKS_SERVICE_02
TYPE = SERVICE
LOGIN_NAME = 'DATABRICKS_SERVICE_02'
DEFAULT_ROLE = DBX_READER_02
DEFAULT_WAREHOUSE = WH_01;
-- 公開鍵をユーザーにセット
ALTER USER DATABRICKS_SERVICE_02
SET RSA_PUBLIC_KEY = '<public_key>';
-- ユーザーにロールの権限付与
GRANT ROLE DBX_READER_02 TO USER DATABRICKS_SERVICE_02;
PEM 秘密キー認証の詳細については以下の manabian 氏の記事およびドキュメントをご参照ください。
12. Databricks で Catalog Federation の作成
接続の作成
PEM 秘密キー認証で Snowflake の接続を作成します。
また、host には手順1で取得した privatelink-account-url を指定する必要があります。通常の public URL を指定すると、Private Link 経由になりません。
%sql
CREATE CONNECTION sf_conn_04
TYPE snowflake
OPTIONS (
host '<privatelink-account-url>',
port '443',
sfWarehouse 'WH_01',
user 'DATABRICKS_SERVICE_02',
pem_private_key '<private_key>'
);
外部カタログの作成
作成した接続を利用して外部カタログを作成します。
%sql
CREATE FOREIGN CATALOG sf_catalog_federation_02
USING CONNECTION sf_conn_04
OPTIONS (
database '<snowflake_db_name>',
authorized_paths 'abfss://<storage_name>@<container_name>.dfs.core.windows.net/<path>/',
storage_root 'abfss://<storage_name>@<container_name>.dfs.core.windows.net/<path>/'
);
接続確認
この時点ではまだエラーとなります。
エラー内容
Your request failed with status FAILED: [BAD_REQUEST] [CANNOT_ESTABLISH_CONNECTION_SERVERLESS] Cannot establish connection to remote snowflake database. Please check connection information and credentials e.g. host, port, user, password and database options. ** If you believe the information is correct, please allow inbound traffic from the Internet to your host, as you are using Serverless Compute. If your network policies do not allow inbound Internet traffic, please use non Serverless Compute, or you may reach out to your Databricks representative to learn about Serverless Private Networking. ** Detailed error message: JDBC driver encountered communication error. Message: Exception encountered for HTTP request: xx12345.japan-east.privatelink.snowflakecomputing.com.. SQLSTATE: 08001
13. Databricks ワークスペースに NCC をアタッチ
作成した NCC を Databricks ワークスペースにアタッチします。
Account Console
→ Workspaces
→ 対象ワークスペース
→ ワークスペースを更新
→ ネットワーク接続構成
14. Databricks Serverless から接続確認
Databricks Serverless Notebook または Serverless SQL Warehouse から Snowflake の PrivateLink URL に接続できるかを確認します。
Python で名前解決を確認する例です。
import socket
host = "<account>.<region>.privatelink.snowflakecomputing.com"
print(socket.gethostbyname(host))
カタログエクスプローラーから Iceberg テーブルを確認することができました。
SELECT も可能でした。
Load Balancer を利用した構成について
Private Link Service Direct Connect ではなく、Load Balancer を利用した構成も試したのですが、以下のポイントでつまづきました。
1. Load Balancer で IP ベースのバックエンドプールを設定しても Private Link Service を作成できない
Load Balancer のバックエンドプールに Snowflake のプライベートエンドポイント IP を設定しても、 Private Link Service への紐づけで以下のエラーが発生しました。
IP ベースのバックエンド プールがあるロード バランサーは使用できません。
通常の Private Link Service を使う場合は、NIC ベースのバックエンドプールが必要になります。
2. Load Balancer のバックエンドプールに Snowflake Private Endpoint の NIC は追加できない
Load Balancer のバックエンドプールに Snowflake Private Endpoint の NIC を追加できないか試しましたが、選択することができませんでした。
仮想マシンと仮想マシン スケール セットに関連付けられている IP 構成は、
ロード バランサーと同じ場所にあり、同じ仮想ネットワーク内にある必要があります。
上記の条件に一致する IP 構成が見つかりません。
上記を踏まえると、Load Balancer を利用する構成を選択する場合は、バックエンドプールに VM を配置し、その VM をプロキシとして利用して、Snowflake のプライベートエンドポイント IP へ通信を中継する構成になる可能性があります。
注意事項
ドキュメントに記載されている制限との挙動差異
公式ドキュメントでは、Private Link Service Direct Connect の制限事項として、宛先に Private Endpoint を指定することはサポートされない旨が記載されています。
また、Private Link Service Direct Connect の対象リージョンに japaneast の記載は無いですが、利用できている状況です。
※プライベートリンクサービスの作成時に以下のような注釈出てきます。
上記の注意事項を踏まえると、本番利用の際はサポートに確認することを推奨します。




































