【NCCディープダイブ】Azure Databricksのサーバーレスのネットワークセキュリティ

# はじめに
本記事では、Azure Databricksのサーバーレスのネットワーク接続を管理するための機能「**ネットワーク接続構成（略称NCC）**」の概要とともに、アカウントコンソールやAzureポータルの設定画面のキャプチャを交えながら具体的な挙動について紹介していきます。

まずは、Azure Databricksのサーバーレス機能のリリース状況とメリットについて軽く振り返った後、サーバーレスコンピューティングのネットワーク面の概要について触れたいと思います。それから本題であるNCCにディープダイブしていきましょう。

:::note warn
**本記事のカバー範囲について**

本記事ではAzure DatabricksのNCCにフォーカスして記載します。Databricks on AWSおよびDatabricks on Google Cloudについては本記事ではカバーしません。両クラウド向けにNCC相当の機能の開発が進んでおり、そちらがリリースされたタイミングで別記事にまとめたいと思います。
:::

# 主な更新情報
本記事の内容に関連する主な更新情報をお知らせします。

## NCCファイアウォールが対応するサーバーレスの種類が拡大（2024年5月）
2024年5月31日のリリースノートで、NCCファイアウォールが、SQLに加えて以下のサーバーレスコンピュートタイプをサポートすることが発表されました。

- SQL（従前からサポート）
- ノートブック
- ジョブ
- Delta Live Tables (DLT)
- モデルサービング

https://learn.microsoft.com/ja-jp/azure/databricks/release-notes/product/2024/may#serverless-firewall-configuration-now-supports-more-compute-types

## NCCプライベートリンクが対応するAzureサービスの種類が拡大（2024年11月）
2024年11月21日に、NCCプライベートリンクのアップデートが発表され、以下のサーバーレスコンピュートから、Azure Private Linkに対応する60以上のAzureの1stパーティサービスへの接続が可能になりました。

- SQL
- ノートブック
- ジョブ
- Delta Live Tables (DLT)
- モデルサービング

https://www.databricks.com/blog/announcing-comprehensive-azure-private-link-coverage-outbound-access-your-managed-azure

## サーバーレスのリリース状況
2023年から、Azure Databricksのサーバーレス機能がどんどん強化されています。本記事を執筆している2024年4月時点で、**Databricks SQLサーバーレス**（略して**DBSQLサーバーレス**）と、**ノートブックおよびワークフロー向けのサーバーレス**の2つがリリースされています。

DBSQLサーバーレスは既に一般提供済みで、東日本リージョンにおいて2023年11月より利用可能になっています。ノートブック & ワークフローのサーバーレスは米国などの一部のリージョンでパブリックプレビュー機能として利用できます。東日本リージョンでも今後利用可能になる見通しです。

各リージョンへの最新の展開状況は、以下のページをご覧ください（日本語版に反映されるのに若干のタイムラグがあるため英語版をご覧頂くのがおすすめです）。

https://learn.microsoft.com/en-us/azure/databricks/resources/supported-regions

## サーバーレスのメリット
DBSQLサーバーレスのメリットについて、以下のデータブリックス新井さんの記事に分かりやすくまとまっています。端的には、圧倒的な起動時間の短さ、性能およびコストパフォーマンスの高さが、DBSQLサーバーレスのメリットです。これらは、ノートブックやワークフローのサーバーレスにも共通するメリットと言えるでしょう。

https://qiita.com/kohei-arai/items/7b4e15a4cf79aa827957

## サーバーレスはAzure Databricksがコンピューティングを完全に管理
サーバーレスの特徴の一つとして、クラスターやウェアハウスといった「コンピュート（計算資源）」の実行される場所が従来とは異なる点が挙げられます。従来型（クラシックコンピューティングプレーン）では、ユーザーのAzureサブスクリプションのVNet内でコンピュートが実行されます。一方サーバーレスは、Azure Databricksによって管理される**サーバーレスコンピューティングプレーン**でコンピュートが実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/7b7ec352-8786-7433-816c-e170b43da43e.png)

*出典：[サーバーレス コンピューティング プレーン ネットワーキング - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/en-us/azure/databricks/security/network/serverless-network-security/)*

上記の図の2番：サーバーレスコンピュートとAzure Storageなどのユーザーリソース間のネットワークセキュリティを管理するために使用するのが、**ネットワーク接続構成**です。Network Connectivity Configurationの頭文字をとって**NCC**と略します。

なお、上記の図の1番：ユーザー & アプリとコントロールプレーン間のネットワークセキュリティは、IPアクセスリストやPrivate Linkで保護できます。本記事では詳しく触れませんが、以下のDatabricksブログや私が以前作成したスライドに詳細がまとまっていますので、ご興味ある方はご覧ください。

https://www.databricks.com/jp/blog/data-exfiltration-protection-with-azure-databricks

https://speakerdeck.com/nakazax/azure-databricks-learning-series-number-3-network-design

## Databricksセキュリティ & トラストセンター
サーバーレス全般のセキュリティについてご興味がある方は以下のDatabricksセキュリティ & トラストセンターをご覧ください。サーバーレスのページについて日本語でサマリーしたスライドも合わせてご覧頂くと良いと思います。

https://www.databricks.com/trust/security-features/serverless-security

https://speakerdeck.com/databricksjapan/databricks-no-sekiyuritei-databricks-sabaresu

# NCCの概要
ここからNCCの深掘りをしていきます。まずは、NCCの概要について見ていきましょう。正確な定義については以下のドキュメントに譲るとして、本記事では誤解を恐れずに分かりやすさを優先して記載します。

https://learn.microsoft.com/ja-jp/azure/databricks/security/network/serverless-network-security/#--what-is-a-network-connectivity-configuration-ncc

:::note warn
**本記事の情報は古くなる可能性があります**

なるべく最新化に努めたいとは思っていますが、本記事の情報が公式よりも古くなる可能性があります。特に制限周りの各種の数字について変更されるかもしれません。NCCを利用の際には必ず公式のドキュメントも合わせてチェックしてください。
:::

## NCCとは？
ネットワーク接続構成（NCC）は、複数のAzure DatabricksワークスペースのサーバーレスコンピュートからユーザーのAzureサブスクリプションにあるAzure Storageなどのリソースへのネットワークセキュリティをアカウントレベルで一元的に管理するための機能です。

## NCCで何ができる？
NCCを用いることでユーザーが管理するAzureリソースに以下2つのネットワークセキュリティを適用できます。

### 1. ストレージアカウントのファイアウォール
サーバーレスコンピュートが経由する[仮想ネットワークサービスエンドポイント](https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-service-endpoints-overview)の静的なサブネットID群をストレージアカウントのファイアウォールで許可し、接続元を制限します。以下のサーバーレスコンピュートタイプをサポートしています。

- SQL
- ワークフロー
- ノートブック
- Delta Live Tables (DLT)
- モデルサービング

### 2. プライベートリンク
以下のサーバーレスコンピュートから、[Azure Private Link](https://learn.microsoft.com/ja-jp/azure/private-link/private-link-overview)に対応する60以上のAzureサービスに接続できます。

- SQL
- ジョブ
- ノートブック
- Delta Live Tables (DLT)
- モデルサービング

主な接続先サービスには以下が含まれます。

- Azure Storage（Blob Storage、ADLS Gen2）
- Azure SQL Database
- Azure OpenAI
- Azure Key Vault
- Azure Event Hubs
- Azure Service Bus
- その他のAzure Private Link対応サービス

両者の違いについては以下の図をご覧ください。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/6af48e4a-cd1f-3fa1-5e66-afea8d4dad10.jpeg)
*NCCの概念図（本記事のために作成）*

## 以前から何が変わったの？
プライベートリンクのサポートは2024年4月に新しく始まったものです。ストレージアカウントのファイアウォールについては「静的な」サブネットID群になったのがポイントです。

2023年10月以前は、DBSQLサーバーレスが経由するサービスエンドポイントのサブネットID群をドキュメントで公開しており、それらのサブネットID群をストレージアカウントのファイアウォールに追加する方式でした。ただ、この方式だと、将来的にサブネットIDの追加や変更が発生した場合に、ユーザーがドキュメントを見て、ストレージアカウントのファイアウォールに反映するという作業が必要になってしまいます（そもそもどうやってユーザーが変更に気付くのかという問題もあります）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/05daf56d-4ea0-dc86-4d51-75ca6fab6745.png)
*以前のドキュメントで公開していたサブネットID群（以下の永田さんのQiita記事より）*

https://qiita.com/ryoma-nagata/items/5cc56db7aa355ffe5ff5

現在は、NCC作成時に、そのNCCにサーバーレスコンピューティングが経由するサービスエンドポイントの「静的な」サブネットID群が設定されます。サーバーレスコンピューティングは、その中の一つのサブネットIDのサービスエンドポイントを経由してストレージアカウントにアクセスします。ユーザーは、それらのサブネットID群を一度だけストレージアカウントのファイアウォールに追加すれば良くなり、ユーザーの利便性が向上しています。

## NCCへのアクセス方法
GUIとREST APIによるアクセスが可能です。今後Databricks CLIや各種SDK、Terraformなどもサポートされるはずです。

### GUIアクセス
Azure Databricksのアカウントコンソール (https://accounts.azuredatabricks.net) の[**クラウドリソース**] > [**ネットワーク接続構成**]でNCCの編集・閲覧ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/b2ad0c9f-0171-34ec-4468-e950d51698f4.png)

### REST APIアクセス
以下のAPIリファレンスを参照ください。

https://docs.databricks.com/api/azure/account/networkconnectivity

## NCCに必要な権限
NCCに関する操作を行うユーザーは以下の権限を持っている必要があります。

- Azure Databricksアカウントのアカウント管理者ロール
    - NCCはアカウントレベルのリソースのため、ユーザーはアカウント管理者ロールを持っている必要があります
- 対象のストレージアカウントのファイアウォールの編集権限
    - NCCファイアウォールの編集を行う場合に必要です
    - Azure RBACの組み込みのロールの場合、[ストレージアカウント共同作成者](https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles/storage#storage-account-contributor)や[共同作成者](https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles/general#contributor)などのロールに必要な権限が含まれます
- 対象のAzureリソースのプライベートエンドポイントの編集権限
    - NCCプライベートエンドポイントの編集を行う場合に必要です

Azure Databricksのアカウントコンソールを有効化しておらず、アカウント管理者ロールが存在しない場合は、以下のドキュメントを参考に設定してください。

https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/#--establish-your-first-account-admin

## NCCの制限
NCCの制限は以下の通りです。

- NCCをアタッチするワークスペースはPremiumプランの必要があります
- 1つのNCCは最大で50個のワークスペースにアタッチできます
- 1つのAzure Databricksアカウントはリージョンごとに最大で10個のNCCを持つことができます
- 1つのAzure Databricksアカウントはリージョンごとに最大で100個のプライベートエンドポイントを作成でき、必要に応じて1から10個のNCCに分散できます

https://learn.microsoft.com/ja-jp/azure/databricks/security/network/serverless-network-security/serverless-private-link#requirements

## NCCの料金
NCCの料金体系は2024年12月4日に変更されました。

### 2024年12月4日以前
NCCは無料でご利用頂けました。ストレージアカウントのファイアウォール、プライベートリンクどちらのオプションを利用する場合も追加料金は発生しませんでした。

https://www.databricks.com/jp/blog/announcing-general-availability-azure-private-link-and-azure-storage-firewall-support

### 2024年12月4日以降
外部リソースに接続するサーバーレスワークロードのネットワークコストの課金が開始されます。以下の点に注意が必要です：

- 課金は段階的に実施され、2024年12月4日以降も一定期間は課金されない場合があります
- 課金が有効になる前の使用量に対して、さかのぼっての課金は発生しません
- 課金が有効になった後は、以下の料金が発生する可能性があります：

1. **Private Link経由でのリソースへのプライベート接続**
   - データ処理料金は無期限に免除
   - 時間単位の料金が適用

2. **NATゲートウェイ経由のリソースへのパブリック接続**
   - 接続時の料金が発生

3. **リージョン間データ転送料金**
   - サーバーレスコンピューティングとターゲットリソースが異なるリージョンにある場合など

# NCCの設定の流れ：ストレージアカウントのファイアウォール
ここから実際にGUIを使ったNCCの設定の流れをウォークスルーしていきます。まずはストレージアカウントのファイアウォールから見ていきましょう。

https://learn.microsoft.com/ja-jp/azure/databricks/security/network/serverless-network-security/serverless-firewall

## 1. NCCを追加（アカウントコンソール）
アカウントコンソール (https://accounts.azuredatabricks.net/) にアクセスし、左サイドバーの [**クラウドリソース**] > [**ネットワーク接続構成**] をクリックします。すると以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/d637e26c-47be-8344-7867-16b2db90f9d5.png)

画面右上にある [**ネットワーク接続構成を追加**] ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/e2e99a2b-2a16-8fbe-7eb2-18a72269d4ca.png)

任意の名前を入力、アタッチしたいワークスペースが存在するリージョンを選択し、[**追加**] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/428cb1b5-9dc4-0e11-eb41-b32c38af5d43.png)

指定した名前でNCCが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/ab5ef581-83a8-4657-6c64-b4646f1208df.png)

## 2. NCCの静的サブネットID群をコピー（アカウントコンソール）
作成したNCCをクリック、[**デフォルトルール**] タブにアクセスし [**すべて表示**]　リンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/2da288b6-513f-ffc6-b76c-a07d5e40e10f.png)

静的なサブネットIDの一覧が表示されるので [**サブネットをコピー**] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f9a0537f-2103-eeae-9bb4-7cbe03d58054.png)

以下がクリップボードにコピーされたサブネットIDの一覧の例です（あくまで例であり、NCCによってサブネットIDは異なる可能性があります）。各サブネットIDがカンマと半角スペースで区切られています。

この後、このサブネットID群をストレージアカウントのファイアウォールにスクリプトで追加していくのですが、その際にカンマがあるとエラーになりますので、テキストエディタなどに貼り付けてカンマを除去した上で、適当な名前で手元のPCに保存しておきましょう。

```text:クリップボードにコピーされたサブネットIDの一覧の例（カンマと半角スペース区切り）
/subscriptions/23a8c420-c354-43f9-91f5-59d08c6b3dff/resourceGroups/prod-japaneast-snp-1-compute-4/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-4/subnets/worker-subnet, /subscriptions/31ef391b-7908-48ec-8c74-e432113b607b/resourceGroups/prod-japaneast-snp-1-compute-2/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-2/subnets/worker-subnet, /subscriptions/56beece1-dbc8-40ca-8520-e1d514fb2ccc/resourceGroups/prod-japaneast-snp-1-compute-8/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-8/subnets/worker-subnet, /subscriptions/653c13e3-a85b-449b-9d14-e3e9c4b0d391/resourceGroups/prod-japaneast-snp-1-compute-6/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-6/subnets/worker-subnet, /subscriptions/6c0d042c-6733-4420-a3cc-4175d0439b29/resourceGroups/prod-japaneast-snp-1-compute-3/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-3/subnets/worker-subnet, /subscriptions/8453a5d5-9e9e-40c7-87a4-0ab4cc197f48/resourceGroups/prod-japaneast-snp-1-compute-1/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-1/subnets/worker-subnet, /subscriptions/9d5fffc7-7640-44a1-ba2b-f77ada7731d4/resourceGroups/prod-japaneast-snp-1-compute-5/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-5/subnets/worker-subnet, /subscriptions/b4f59749-ad17-4573-95ef-cc4c63a45bdf/resourceGroups/prod-japaneast-snp-1-compute-10/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-10/subnets/worker-subnet, /subscriptions/b96a1dc5-559f-4249-a30c-5b5a98023c45/resourceGroups/prod-japaneast-snp-1-compute-7/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-7/subnets/worker-subnet, /subscriptions/d31d7397-093d-4cc4-abd6-28b426c0c882/resourceGroups/prod-japaneast-snp-1-compute-9/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-9/subnets/worker-subnet
```

## 3. NCCをワークスペースにアタッチ（アカウントコンソール）
アカウントコンソールの左サイドバーの [**ワークスペース**] をクリックし、NCCをアタッチするワークスペースの名前をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/7a7a4334-13b4-f5e5-5eab-0408f5c84081.png)

[**構成**] タブが表示されるので右上の [**ワークスペースを更新**] ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/3d4c7ee4-34f0-8228-166c-906eedb4b47b.png)

[**ネットワーク接続構成**] 欄に作成したNCCを設定し [**更新**] ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/4ddab440-d054-2558-db1d-8f90a36a22cd.png)

以上でNCCのワークスペースへのアタッチは完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/be0d742a-8429-aa93-d7c6-fbfb890c30c6.png)

（[ドキュメント](https://learn.microsoft.com/ja-jp/azure/databricks/security/network/serverless-network-security/serverless-firewall#--step-2-attach-an-ncc-to-workspaces)に以下の記述がありますので、念のため本記事にも転記しておきます）

> - 変更が有効になるまで10分待ちます
> - ワークスペースで実行中のサーバーレスのSQLウェアハウスをすべて再起動します

## 4. ストレージアカウントのファイアウォールを有効化（Azureポータル）
- Azureポータル (https://portal.azure.com) にアクセスし、対象ストレージアカウントを選択し、[**ネットワーク**] をクリックします
- [**ファイアウォールと仮想ネットワーク**] > [**パブリックネットワーク アクセス**]について [**選択した仮想ネットワークとIPアドレスから有効**] にチェックし [**保存**] をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/45f5e9c2-ce02-ffa1-cd67-c5d201e6a388.png)

:::note warn
**非サーバーレスのクラスターやSQLウェアハウスからのアクセス許可について**

対象のストレージアカウントのファイアウォールについて、「すべてのネットワークから有効」から「選択した仮想ネットワークとIPアドレスから有効」に変更する場合、上記画面の「仮想ネットワーク」のセクションにAzure Databricksワークスペースの2つのサブネット（通称 *public-subnet* と *private-subnet*）のIDを追加してサービスエンドポイントを有効化してください。

上記を行わないと、非サーバーレスのクラスターやSQLウェアハウスから対象のストレージアカウントにアクセスできなくなります。

なお、サービスエンドポイントが利用できるのは[VNetインジェクションされたAzure Databricksワークスペース](https://learn.microsoft.com/ja-jp/azure/databricks/security/network/classic/vnet-inject)である点に留意ください。
:::

## 5. ストレージアカウントのファイアウォールにNCCのサブネットID群を追加（Azure CLIなど）
Azure CLIやPowerShell、Terraform、または他のツールを使って、ストレージアカウントのファイアウォールにNCCのサブネットID群を追加します。

以下はAzure CLIを使って複数のサブネットID群をループして追加するスクリプトです。スクリプトを実行する前に以下の文字列を置き換える必要があります。

- `SUBNETS`の値をカンマを除去したサブネットID群で置き換えます
- `--subscription`の値を自身のAzureサブスクリプションIDに置き換えます
- `--resource-group`の値を対象のストレージアカウントが存在するリソースグループ名に置き換えます
- `--account-name`の値を対象のストレージアカウント名に置き換えます

```bash:スクリプト例
#!/bin/bash
SUBNETS=(/subscriptions/8453a5d5-9e9e-40c7-87a4-0ab4cc197f48/resourceGroups/prod-azure-eastusc3-nephos2/providers/Microsoft.Network/virtualNetworks/kaas-vnet/subnets/worker-subnet /subscriptions/8453a5d5-9e9e-40c7-87a4-0ab4cc197f48/resourceGroups/prod-azure-eastusc3-nephos3/providers/Microsoft.Network/virtualNetworks/kaas-vnet/subnets/worker-subnet)
for SUBNET in ${SUBNETS[@]}
do
  az storage account network-rule add --subscription 9999999-1ff3-43f4-b91e-d0ceb97111111 --resource-group mystorage-rg --account-name myaccount --subnet ${SUBNET}
done
```

:::note warn
**カンマを含むサブネットID群で上記スクリプトを実行した場合**
以下のようなエラーメッセージが表示され、サブネットIDの追加に失敗します。

```text:エラーメッセージ例
(NetworkAclsValidationFailure) Validation of network acls failure: SubnetsDoNotExist:Virtual network /subscriptions/23a8c420-c354-43f9-91f5-59d08c6b3dff/resourceGroups/prod-japaneast-snp-1-compute-4/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-4 does not have subnets with names worker-subnet,..
Code: NetworkAclsValidationFailure
Message: Validation of network acls failure: SubnetsDoNotExist:Virtual network /subscriptions/23a8c420-c354-43f9-91f5-59d08c6b3dff/resourceGroups/prod-japaneast-snp-1-compute-4/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-4 does not have subnets with names worker-subnet,..
(NetworkAclsValidationFailure) Validation of network acls failure: SubnetsDoNotExist:Virtual network /subscriptions/31ef391b-7908-48ec-8c74-e432113b607b/resourceGroups/prod-japaneast-snp-1-compute-2/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-2 does not have subnets with names worker-subnet,..
Code: NetworkAclsValidationFailure
Message: Validation of network acls failure: SubnetsDoNotExist:Virtual network /subscriptions/31ef391b-7908-48ec-8c74-e432113b607b/resourceGroups/prod-japaneast-snp-1-compute-2/providers/Microsoft.Network/virtualNetworks/prod-japaneast-snp-1-compute-2 does not have subnets with names worker-subnet,..
```
:::

Azure CLIが手元のPCにインストールされていない場合は、AzureポータルからCloudShellを使うのがお手軽です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/2077b703-7f3d-df03-4267-8feb001572cd.png)

コマンドの実行が完了したら、Azureポータルから対象のストレージアカウントの [**ネットワーク**] > [**仮想ネットワーク**] を確認します。以下のようにサブネットID群が追加されていればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/44b5b096-878d-5eb9-6d0f-f794100d3155.png)

なお、エンドポイント状態列の「アクセス許可が不十分です」という表示や、ネットワーク一覧の下の警告は無視してOKです。これらは、ユーザーがNCCのサブネットID群の読み取りアクセス許可を持っていないことを示しているだけであり、サーバーレスコンピュートからストレージアカウントへの接続を妨げるものではありません。

## 6. DBSQLサーバーレスからストレージアカウントへの接続確認（ワークスペース）
NCCをアタッチしたワークスペースにアクセスします。

タイプが`サーバーレス`のSQLウェアハウスがない場合、左サイドメニューの [**SQLウェアハウス**] > [**SQLウェアハウスを作成**]をクリックして作成します。接続確認が目的なので、クラスターサイズは`XXS`などの小さなサイズでOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/8c364087-e1a4-6a3c-426b-c8d3806bda5a.png)

左サイドメニューの [**SQLエディタ**] にアクセスし、対象のストレージアカウントにデータがあるテーブルに対してSELECTをクエリを実行します。結果が表示されれば接続確認は問題ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/32511ca5-70fc-1846-de00-b25dd8ae8c12.png)

ストレージアカウント側のネットワーク設定が上手く行えていない場合、以下のエラーメッセージが出力されます。その場合は前の手順に戻って見落としやミスがないかを確認してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/8ae5df15-d967-1f01-6d1b-c515dd41720e.png)

```text:エラーメッセージ例
This Azure storage request is not authorized. The storage account's 'Firewalls and virtual networks' settings may be blocking access to storage services. Please verify your Azure storage credentials or firewall exception settings.
```

# NCCの設定の流れ：プライベートリンク
続いてNCCのプライベートリンクの設定手順をウォークスルーしていきます。ストレージアカウントのファイアウォールと手順的に被る部分についてはキャプチャを省略してサクサクいきたいと思います。

## 1. NCCを追加（アカウントコンソール）
- アカウントコンソール (https://accounts.azuredatabricks.net/) にアクセスし、左サイドバーの [**クラウドリソース**] > [**ネットワーク接続構成**] をクリックします
- 画面右上にある [**ネットワーク接続構成を追加**] ボタンをクリックします
- 任意の名前を入力、アタッチしたいワークスペースが存在するリージョンを選択し、[**追加**] をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/7a1b80d8-4915-1923-59c1-c51b3d4f3a8e.png)

## 2. NCCをワークスペースにアタッチ（アカウントコンソール）
- アカウントコンソールの左サイドバーの [**ワークスペース**] をクリックし、NCCをアタッチするワークスペースの名前をクリックします
- [**構成**] タブが表示されるので右上の [**ワークスペースを更新**] ボタンをクリックします
- [**ネットワーク接続構成**] 欄に作成したNCCを設定し [**更新**] ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/62f45e06-68ba-0b93-2584-dcd80edb5ecd.png)

（[ドキュメント](https://learn.microsoft.com/ja-jp/azure/databricks/security/network/serverless-network-security/serverless-private-link#--step-2-attach-an-ncc-to-a-workspace)に以下の記述がありますので、念のため本記事にも転記しておきます）

> - 変更が有効になるまで10分待ちます
> - ワークスペースで実行中のサーバーレスのSQLウェアハウスをすべて再起動します

## 3. 対象のストレージアカウントのリソースIDをコピー（Azureポータル）
Azureポータル (https://portal.azure.com) にアクセスし、対象ストレージアカウントの [**概要**] ページの右上にある [**JSONビュー**] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/7343f1f0-b3ab-4b17-1954-c7cac8447f93.png)

上部にリソースIDが表示されるので、枠で囲んだアイコンをクリックしてリソースIDをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/44fd23c4-a184-a5b1-2447-357ff5060ed1.png)

## 4. プライベートエンドポイントルールを追加（アカウントコンソール）
- アカウントコンソールの左サイドバーの [**クラウドリソース**] > [**ネットワーク接続構成**] にアクセスし、追加したNCCをクリックします
- [**プライベートエンドポイントルール**] タブを開き、[**プライベートエンドポイントルールを追加**] ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f638bacb-d622-36c1-cc3f-3adf8f674aa0.png)

[**適用先AzureリソースのID**] に先ほどコピーしたストレージアカウントのリソースIDを貼り付けます。Azureサブリソース名については、以下の表を参考に、対象のストレージアカウントの種類に応じて `blob` か `dfs` を入力します。

対象のストレージアカウント | 使用するサブリソース名
--- | ---
Blob Storage (= 階層型名前空間が有効でないストレージアカウント) | `blob`
ADLS Gen2 (= 階層型名前空間が有効なストレージアカウント) | `dfs`
ワークスペースルートストレージ（ルートDBFS） | 1つのリソースIDに対して `blob` と `dfs` の2つのプライベートエンドポイントルールを作成する必要がある

ここではADLS Gen2を対象にしています。入力が完了したら [**追加**] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/9afee82e-839f-49f5-0e73-338e6b50f6b8.png)

[**追加**] ボタンが処理中を表す表示に変わるので、しばらく待ちます。（数十秒〜1分程度）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/41c7f1a4-fcc8-a781-e1ad-3ebc17f7053b.png)

自動的に表示が切り替わり、プライベートエンドポイントルールが1件追加されます。ステータスが `PENDING` になっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/49f36bd8-88d8-a01d-401a-ec960cc63304.png)

### 補足: Azureのサブリソース名
上記以外のAzureサービスのサブリソース名については、[Azure Private Linkのドキュメント](https://learn.microsoft.com/ja-jp/azure/private-link/private-endpoint-overview#private-link-resource)をご確認ください。

## 5. プライベートエンドポイント接続を承認（Azureポータル）
Azureポータルで対象のストレージアカウントにアクセスし、[**ネットワーク**] > [**プライベート エンドポイント接続**] タブを開きます。接続状態が `保留中` のプライベートエンドポイント接続が1件表示されるので、チェックボックスにチェックを入れて [**承認**] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/dca515c9-f32b-5b86-88fc-627e53fb48b3.png)

必要に応じて説明を入力し（ブランクでもOK）、[**はい**] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/e0354528-f5ed-e262-ec59-68e4c088ec82.png)

しばらく待機し、接続状態が `承認済み` になることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/733bab2a-8477-5b15-5ab7-3e5e232d1c20.png)

アカウントコンソールのプライベートエンドポイントルールのステータスが `ESTABLISHED` になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f0808641-1fc0-5d82-9254-4e447a82ca87.png)

## 6. （オプション）ストレージアカウントのパブリックネットワークアクセスを無効化（Azureポータル）
省略可能な手順です。対象のストレージアカウントへのアクセスについてプライベートエンドポイントに限定したい場合は、パブリックネットワークを `無効` に変更して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/825182b8-c75a-339d-ed87-1a5e7342df9e.png)

## 7. DBSQLサーバーレスからストレージアカウントへの接続確認（ワークスペース）
- NCCをアタッチしたワークスペースにアクセスします
- タイプが`サーバーレス`のSQLウェアハウスがない場合、左サイドメニューの [**SQLウェアハウス**] > [**SQLウェアハウスを作成**]をクリックして作成します。接続確認が目的なので、クラスターサイズは`XXS`などの小さなサイズでOKです
- 左サイドメニューの [**SQLエディタ**] にアクセスし、対象のストレージアカウントにデータがあるテーブルに対してSELECTをクエリを実行します。結果が表示されれば接続確認は問題ありません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/0fef339b-9107-df2d-2b0b-8e92d6c7b112.png)

NCCのウォークスルーは以上です。

# Appendix
ここからは付録的な内容です。

## NCCの分け方
NCCをどのように分けるかについて、[ドキュメント](https://learn.microsoft.com/ja-jp/azure/databricks/security/network/serverless-network-security/serverless-private-link#--step-1-create-a-network-connectivity-configuration
)では以下のようにガイドされています。少なくとも、ストレージアカウントのファイアウォールに使うNCCと、プライベートリンクを使うNCCを分けるところから始めるのが良さそうです。

> Databricks では、同じ部署内で同じリージョン接続プロパティを共有するワークスペース間では、NCC を共有することを推奨しています。 たとえば、一部のワークスペースが Private Link を使い、他のワークスペースはファイアウォールの有効化を使う場合、それらのユース ケースには個別の NCC を使います。

上記のガイドでは、複数のパラメーター（ビジネスユニットの数、ワークスペースの数とリージョン、ストレージアカウントの数と接続方式）が言及されています。大規模にAzure Databricksを活用している組織では、前述の[NCCの制限](https://qiita.com/nakazax/items/745d1cc01ad1dfaa418c#ncc%E3%81%AE%E5%88%B6%E9%99%90)を念頭に置きつつ、組織の実情に合わせてしっかりと設計するのが良いでしょう。

## NCCアタッチ、未アタッチのワークスペース間での動作の違い
NCCをアタッチしていないワークスペースのサーバーレスコンピュートも、サービスエンドポイントを経由してストレージアカウントにアクセスします。NCCアタッチ、未アタッチのワークスペース間での動作の違いは以下の通りです。

1. NCCをアタッチしたワークスペース
   * サービスエンドポイントのサブネットID群が静的になります
   * このサブネットID群は、ファイアウォールのルールに追加することができます

2. NCCをアタッチしていないワークスペース
   * サービスエンドポイントのサブネットID群は静的ではありません
   * ただし、NCCをアタッチしたワークスペースと同一のサブネットのサービスエンドポイントを利用する可能性があります

つまり、NCCをアタッチしたワークスペースのサブネットID群をファイアウォールのルールに追加したストレージアカウントに対して、NCCをアタッチしていないワークスペースのサーバーレスコンピュートからの接続が成功する場合があります。これは、両方のワークスペースが同一のサブネットのサービスエンドポイントを利用する可能性があるためです。

NCCがアタッチされているかどうかを問わず、サーバーレスコンピュートからストレージアカウントへの通信は、認証や1時間の短命なトークンを使ったアクセス、暗号化などによって安全に保護されています。NCCをアタッチすることで、静的なVNetサブネットID群をストレージアカウントのファイアウォールに設定し、接続元を限定することができます。

特定のNCCがアタッチされたワークスペースのサーバーレスコンピュートからのネットワークアクセスのみを許可する必要がある場合には、NCCのプライベートリンクの利用を検討する必要があります。

# まとめ
本記事では、Azure Databricksのサーバーレスコンピュートと、Azure StorageやAzure SQL Databaseなどの各種Azureサービス間のセキュアなネットワーク接続を管理するための機能である「ネットワーク接続構成（NCC）」について、概要と設定手順を紹介しました。

NCCを用いることで、以下の2つの方法でサーバーレスコンピュートからAzureサービスへのネットワークアクセスを制御できます：

1. ストレージアカウントのファイアウォールを使って、NCCに設定された静的なサブネットID群からの接続のみを許可する
2. NCCのプライベートエンドポイントルールを使って、プライベートリンク経由でAzureサービスに接続する

NCCはアカウントレベルのリソースであり、複数のワークスペースに対して一元的にネットワーク設定を管理できるメリットがあります。NCCの制限事項を理解した上で、組織の要件に合わせて適切に設計、活用していきましょう。