0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Databricks Serverless から Private Link Service Direct Connect を利用して Snowflake へ接続する方法

0
Last updated at Posted at 2026-07-06

はじめに

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 を利用します。

image.png

引用元:https://learn.microsoft.com/ja-jp/azure/private-link/create-private-link-service-portal?tabs=dynamic-ip

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 の値を入力します。

image.png

作成直後は、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>

image.png

azure-access-token の取得

Azure CLI で Azure access token を取得します。

az account get-access-token \
  --subscription <subscription-id>

出力例:

{
  "accessToken": "eyJ...",
  "expiresOn": "...",
  "subscription": "...",
  "tenant": "...",
  "tokenType": "Bearer"
}

image.png

承認状態の確認

承認されると、Azure Portal 側の Private Endpoint の接続状態が Approved になります。

image.png

4. Private Link Service Direct Connect を作成

作成する前に

本機能は 2026/07/03 時点でパブリックプレビュー段階であり、Azure Portal から作成するには以下のリンクを介して利用します。
本記事では Azure Portal での作成手順を示します。

image.png

設定値

Private Link Service を作成し、接続方法は 宛先 IP アドレス を選択します。
(宛先)IP アドレスには手順2で作成した Snowflake の Private Endpoint IP を指定します。
NAT IP は 2つ以上静的 に割り当てる必要があります。また、NAT IP から宛先 IP アドレスに到達できる必要があります。

image.png

5. Databricks で NCC を作成

Account Console から NCC を作成します。

対象の Databricks ワークスペースと同じリージョンで作成します。

image.png

6. NCC にプライベートエンドポイントルールを追加

作成した NCC にプライベートエンドポイントルールを追加します。

AzureリソースID には、手順4で作成した Private Link Service のリソース ID を指定します。
ドメインには、手順1で取得した Snowflake の Privatelink 情報を指定します。

image.png

7. NCC で作成した Private Endpoint を承認

Databricks NCC でプライベートエンドポイントルールを作成すると、Private Link Service に接続要求が作成されます。

Azure Portal で Private Link Service のプライベートエンドポイント接続を確認し、Databricks からの接続要求を承認します。

image.png

承認後、Databricks 側のプライベートエンドポイントルールが ESTABLISHED になることを確認します。

image.png

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 を承認します。

image.png

承認後、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;

image.png

外部ボリュームの作成

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;

image.png

作成した外部ボリュームは UI でも確認できます。

image.png

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';

image.png

AZURE_CONSENT_URL にアクセスし、Microsoft の許可リクエストページで 承諾 をクリックします。

image.png

Azure Storage Account に IAM ロールを付与する

Azure Portal で対象の Storage Account を開き、Snowflake のサービスプリンシパル( AZURE_MULTI_TENANT_APP_NAME )にロールを付与します。

本記事では ストレージ BLOB データ共同作成者 (Storage Blob Data Contributor) を付与しています。

image.png

外部ボリュームを検証する

Snowflake で以下を実行し、正常に検証できれば、Snowflake から ADLS へのアクセスが Private Link 経由で行える状態です。

SELECT PARSE_JSON(SYSTEM$VERIFY_EXTERNAL_VOLUME('EXVOL_ADLS_DFS'));

image.png

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;

image.png

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;

image.png

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;

image.png

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>'
);

image.png

外部カタログの作成

作成した接続を利用して外部カタログを作成します。

%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>/'
);

image.png

接続確認

この時点ではまだエラーとなります。

image.png

エラー内容
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
  → 対象ワークスペース
  → ワークスペースを更新
  → ネットワーク接続構成

image.png

NCC のプライベートエンドポイント規則への追加

必要に応じて、Snowflake の外部ボリュームに設定した ADLS のプライベートエンドポイントルールを追加してください。
追加した後は、ADLS で承認が必要です。

image.png

image.png

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))

image.png

カタログエクスプローラーから Iceberg テーブルを確認することができました。

image.png

SELECT も可能でした。

image.png

Load Balancer を利用した構成について

Private Link Service Direct Connect ではなく、Load Balancer を利用した構成も試したのですが、以下のポイントでつまづきました。

1. Load Balancer で IP ベースのバックエンドプールを設定しても Private Link Service を作成できない

Load Balancer のバックエンドプールに Snowflake のプライベートエンドポイント IP を設定しても、 Private Link Service への紐づけで以下のエラーが発生しました。

IP ベースのバックエンド プールがあるロード バランサーは使用できません。

image.png

image.png

通常の Private Link Service を使う場合は、NIC ベースのバックエンドプールが必要になります。

2. Load Balancer のバックエンドプールに Snowflake Private Endpoint の NIC は追加できない

Load Balancer のバックエンドプールに Snowflake Private Endpoint の NIC を追加できないか試しましたが、選択することができませんでした。

仮想マシンと仮想マシン スケール セットに関連付けられている IP 構成は、
ロード バランサーと同じ場所にあり、同じ仮想ネットワーク内にある必要があります。

上記の条件に一致する IP 構成が見つかりません。

image.png

上記を踏まえると、Load Balancer を利用する構成を選択する場合は、バックエンドプールに VM を配置し、その VM をプロキシとして利用して、Snowflake のプライベートエンドポイント IP へ通信を中継する構成になる可能性があります。

注意事項

ドキュメントに記載されている制限との挙動差異

公式ドキュメントでは、Private Link Service Direct Connect の制限事項として、宛先に Private Endpoint を指定することはサポートされない旨が記載されています。

image.png

また、Private Link Service Direct Connect の対象リージョンに japaneast の記載は無いですが、利用できている状況です。

image.png

※プライベートリンクサービスの作成時に以下のような注釈出てきます。

image.png

上記の注意事項を踏まえると、本番利用の際はサポートに確認することを推奨します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?