はじめに
Databricks Serverless からプライベート ネットワーク ゲートウェイを利用して、Snowflake 用の Private Endpoint を経由し、Snowflake の Private Link Service に接続する方法を検証しました。
また、上記のネットワーク経路の確認するために、Databricks から Catalog Federation 経由で Snowflake のマネージド Iceberg テーブルへ接続します。
検証した構成のイメージは以下の通りです。
プライベート ネットワーク ゲートウェイは 2026/10 時点ではパブリック プレビューのため、アカウント コンソールのプレビューから有効化する必要があります。
1. プライベート ネットワーク ゲートウェイ用サブネットを作成
仮想ネットワークを作成して、プライベート ネットワーク ゲートウェイ用のサブネットを作成します。
サブネットの条件は以下となります。
- Microsoft.Databricks/workspaces に委任
- サイズは /28 以上
- 他のAzureリソースで使用されてはならず、NCC やワークスペースと同じリージョン
- 委任されたサブネットを含む VNet は、ワークスペースと同じテナントに存在
併せて、プライベートエンドポイント用のサブネットも作成しておきます。
2. 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 |
3. Snowflake 向け Private Endpoint を作成
Azure 側で Snowflake 向け Private Endpoint を作成します。
Private Endpoint 作成時は、接続先として Snowflake から取得した privatelink-pls-id を指定します。
接続方法は「リソース ID またはエイリアスを使って~~~」を選択して、前の手順で取得した privatelink-pls-id の値を入力します。
作成直後は、Private Endpoint の接続状態が Pending になります。
4. 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 になります。
5. プライベート DNS ゾーンを作成
プライベート DND ゾーンを作成します。
名前は privatelink.snowflakecomputing.com として、手順2で取得した URL を A レコードに追加します。IP アドレスは手順3で作成したプライベートエンドポイントの IP を指定します。
A レコードに追加する値は以下です。
| 項目 | 内容 |
|---|---|
privatelink-account-url |
Private Link 用 Snowflake アカウント URL |
privatelink_ocsp-url |
OCSP 用 Private Link URL |
snowsight-privatelink-url |
Snowsight 用 PrivateLink URL |
6. Snowflake にて外部ボリュームを作成
Snowflake にて、Iceberg Table の出力先として外部ボリュームを作成します。出力先には ADLS を設定します。
ADLS 向け Private Link endpoint を作成
本記事では ADLS への接続も Private Link 経由にするため、Private Link endpoint を作成します。
dfs と blob の2つを作成します。
USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
'<storage_account_resource_id>',
'<storage_account>.dfs.core.windows.net',
'dfs'
);
SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
'<storage_account_resource_id>',
'<storage_account>.blob.core.windows.net',
'blob'
);
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 )にロールを付与します。
リソースグループで Storage Blob デリゲータ と ADLS に ストレージ BLOB データ共同作成者 を付与します。
外部ボリュームを検証する
Snowflake で以下を実行し、正常に検証できれば、Snowflake から ADLS へのアクセスが Private Link 経由で行える状態です。
SELECT PARSE_JSON(SYSTEM$VERIFY_EXTERNAL_VOLUME('EXVOL_ADLS_DFS'));
7. Snowflake にて検証用のデータベースオブジェクト作成
CATALOG FEDERATION するためのデータベース・スキーマ・Iceberg テーブルを作成します。
サンプルコード
-- 検証用データベース・スキーマ作成
CREATE DATABASE IF NOT EXISTS CATALOG_FEDERATION_TEST_DB;
CREATE SCHEMA IF NOT EXISTS CATALOG_FEDERATION_TEST_DB.SCH_01;
-- 検証用 ICEBERG テーブル作成
CREATE OR REPLACE ICEBERG TABLE CATALOG_FEDERATION_TEST_DB.SCH_01.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_01.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_01.SALE_ICEBERG_01;
8. Snowflake にてロールの作成および権限付与
Databricks からアクセスできるようにするためのロールと、アクセスできるようにするための権限を付与します。
サンプルコード
-- ロール作成
CREATE ROLE IF NOT EXISTS DBX_READER_01;
-- ロールに対して WH とデータベースオブジェクトへの権限付与
GRANT USAGE ON WAREHOUSE WH_01 TO ROLE DBX_READER_01;
GRANT USAGE ON DATABASE CATALOG_FEDERATION_TEST_DB TO ROLE DBX_READER_01;
GRANT USAGE ON SCHEMA CATALOG_FEDERATION_TEST_DB.SCH_01 TO ROLE DBX_READER_01;
GRANT SELECT ON ALL ICEBERG TABLES IN SCHEMA CATALOG_FEDERATION_TEST_DB.SCH_01 TO ROLE DBX_READER_01;
GRANT SELECT ON FUTURE ICEBERG TABLES IN SCHEMA CATALOG_FEDERATION_TEST_DB.SCH_01 TO ROLE DBX_READER_01;
GRANT USAGE ON EXTERNAL VOLUME EXVOL_ADLS_DFS TO ROLE DBX_READER_01;
9. Snowflake にて PEM 秘密キー認証の設定
本記事では、Snowflakeユーザーの MFA 要件によるエラーを避けるため、Databricks からの接続には PEM 秘密キー認証を採用します。
OpenSSL のインストール等については以下の manabian 氏の記事をご参照ください。
PEM 秘密キー認証の詳細についてはドキュメントをご参照ください。
PowerShell にてキーを作成
暗号化なしで秘密鍵を作成します。
# 秘密鍵
openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8 -nocrypt
公開鍵を作成します。
# 公開鍵
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
エクスプローラーから rsa_key.pub を開きます。
-----BEGIN PUBLIC KEY-----、-----END PUBLIC KEY-----、および、改行を削除した値を控えます。
ユーザーの作成と公開鍵のセット
ユーザーの作成と公開鍵のセットを実施します。
また、作成したユーザに対してロールの権限を付与します。
サンプルコード
-- ユーザー作成
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;
10. Databricks で NCC を作成
Account Console から NCC を作成します。
対象の Databricks ワークスペースと同じリージョンで作成します。
作成した NCC は対象ワークスペースにアタッチします。
11. NCC にプライベートエンドポイントルールを追加
作成した NCC に Snowflake から作成した Iceberg のデータがある ADLS のプライベートエンドポイントルールを2つ追加します。
AzureリソースID には、ADLS のリソース ID を指定します。
サブリソースには dfsと blob をそれぞれ指定します。
12. NCC で作成した Private Endpoint を承認
Databricks NCC でプライベートエンドポイントルールを作成すると、ADLS に接続要求が作成されるので承認します。
承認後、Databricks 側のプライベートエンドポイントルールが ESTABLISHED になることを確認します。
13. プライベート ネットワーク ゲートウェイを作成
作成した NCC にプライベート ネットワーク ゲートウェイを追加します。
以下のように設定します。
送信先は、手順5で A レコードに設定した FQDN を設定します。
作成後に確立済みになることを確認します。
14. Catalog Federation の設定
接続の作成
PEM 秘密キー認証で Snowflake の接続を作成します。
pem_private_key には手順9で作成した秘密鍵の値を設定します。
また、host には privatelink-account-url を指定します。
%sql
CREATE CONNECTION sf_conn_01
TYPE snowflake
OPTIONS (
host '<privatelink-account-url>',
port '443',
sfWarehouse 'WH_01',
user 'DATABRICKS_SERVICE_02',
pem_private_key '<private_key>'
);
外部カタログの作成
作成した接続を利用して外部カタログを作成します。
authorized_paths には Snowflake で作成した Iceberg のデータがある ADLS を指定します。
%sql
CREATE FOREIGN CATALOG sf_catalog_federation_01
USING CONNECTION sf_conn_01
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>/'
);
15. 接続確認
正常に接続できると、Snowflake と同じ階層でカタログ・スキーマ・テーブルが確認できます。
また、テーブルのデータソースが Iceberg となっていることを確認します。
Serverless Compute で Iceberg テーブルを SELECT できることを確認しました。





























