Azure Databricks のネットワーク設定について

## はじめに
Azure Databricks はワークスペース作成時に以下 2 つのネットワーク設定を選択できます。
* **Security Cluster Connectivity (SCC)**
* **VNet Injection**

<img width="600" alt="スクリーンショット 2022-09-23 13.19.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/0de58c92-fc6c-2631-e64c-d60de9996517.png">

今回はそれぞれの設定について説明します。

## Databricks アーキテクチャーの前提知識
Azure Databricks は**コントロール プレーン**と**データ プレーン**から構成されます。
コントロール プレーンにはバックエンド サービスが含まれます。ユーザーがワークスペースに UI アクセスする際はコントロール プレーンにリクエストが送信されます。また、REST API やデータ プレーンからのリクエストに従ってクラスター作成などを行います。
その一方でデータ プレーンではデータが実際に処理され、クラスター ノード VM や [Databricks File System (DBFS)](https://learn.microsoft.com/ja-jp/azure/databricks/dbfs/) で使用するストレージなどが含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/03fdfaef-dbae-aad1-5488-30012ed78071.png)



## Security Cluster Connectivity (SCC)


[Secure Cluster Connectivity (SCC)](https://learn.microsoft.com/ja-jp/azure/databricks/security/secure-cluster-connectivity) はセキュリティを強化するための設定となります。データ プレーンのクラスター ノード VM にはデフォルトでパブリック IP が付与されており、これを利用しインターネットに接続しますが、SCC を有効化すると **VM にパブリック IP が付与されなくなります**。なお、後述しますが、SCC が有効であってもインターネットに接続することは可能です。



## VNet Injection

[VNet Injection](https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/cloud-configurations/azure/vnet-inject) は、**自分で作成した VNet にデータ プレーンの VM をデプロイする**ための設定です。
Azure Storage などに Private Endpoint を経由してアクセスしたい場合に必要となります。

Databricks ワークスペース作成時に VNet Injection を有効化する際、複数の設定項目があります。それぞれについて説明していきます。

![スクリーンショット 2022-09-23 16.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/28310e8a-6132-b78a-7f85-21f99dc1ebb3.png)

### 1. サブネット

VNet には Databricks ワークスペース専用の **2 つのサブネット**を含める必要があります。パブリック サブネットは、クラスター ノードのホスト VM の IP のためのものであり、クラスター外部への接続で利用されます。プライベート サブネットは、ノードにデプロイされる Databricks ランタイム コンテナー の IP のためのものであり、クラスター内通信で利用されます。

クラスターの VM 1 台につき、NIC がそれぞれのサブネットで作成され、パブリック サブネット側の NIC にはパブリック IP が割り当てられます。但し、SCC が有効化されているとパブリック IP が付与されません。後述しますが、パブリック IP が付与されていなくともインターネットへの接続は可能です。

各サブネットは事前に作成する必要がなく、サブネット名や CIDR 範囲を入力しておけば自動で作成されます。

### 2. パブリック アクセス

コントロール プレーンへのパブリック アクセスを許可するかどうかの設定です。無効の場合には、プライベート エンドポイント経由での接続が必要となります。

### 3. NSG ルール

1 で指定したサブネットに自動で付与される NSG のアウトバウンドに、データ プレーンからコントロール プレーンにパブリック アクセスするためのルールを追加するかどうかの設定です。

### 4. プライベート エンドポイント

Databricks には 2 つのサブリソースのプライベート エンドポイントが存在します。これらはワークスペース作成後も追加できますが、ワークスペース作成時の画面で追加できるものは `databricks_ui_api` に限ります。

| サブリソース名 | 用途 | FQDN |
|:-----------|:------------|:--|
| `databricks_ui_api`      | Databricks コントロール プレーンへの接続  |`adb-XXXXXXXXXXXX.XX.azuredatabricks.net`|
| `browser_authentication`   | Azure AD の SSO ログインのコールバック (プライベート エンドポイント経由でワークスペースにブラウザ接続するときのみ通信が発生)    |`<region>.pl-auth.azuredatabricks.net`|

`databricks_ui_api` には大きく分けて 2 種類の使われ方があります。1 つはクラスター VM からバックエンドサービスへの接続、もう 1 つはユーザーのクライアントマシンからのワークスペースブラウザ接続や API 接続になります。それぞれ下図の `Back-end private endpoint`、`Front-end private endpoint` に該当します。`Web authentication private endpoint` は上表における `browser_authentication` であり、リージョン毎に FQDN は共通となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/a166b0a0-0442-485e-c17e-70c4316ed18e.png)
(引用元: [標準デプロイとして Azure Private Link を有効にする - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/security/network/classic/private-link-standard) )

## データ プレーンからインターネットへの接続方式

SCC と VNet Injection の有無によってデータ プレーンからインターネットに接続するときの方式が異なります。これらについて説明していきます。

### SCC 無効 + VNet Injection 無効
VM に付与された Public IP を用いてインターネットにアクセスします。クラスターを停止すると VM および Public IP は削除されるため、IP 固定化は保証されません。

<img width="550" alt="スクリーンショット 2022-09-23 14.00.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/867b981a-f904-2e22-6067-244f23a27b36.png">


### SCC 有効 + VNet Injection 無効

マネージド リソース グループに自動作成される NAT Gateway を用いてインターネットにアクセスします。NAT Gateway のパブリック IP で外部アクセスすることになるため、アクセス元 IP が固定となります。

<img width="550" alt="スクリーンショット 2022-09-23 14.12.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/b44068a7-d3c5-b8d2-7e24-8be4fa632680.png">


### SCC 無効 + VNet Injection 有効

VM に付与された Public IP を用いてインターネットにアクセスします。SCC 無効 + VNet Injection 無効のとき同様、クラスターを停止すると VM および Public IP は削除されるため、IP 固定化は保証されません。

<img width="550" alt="スクリーンショット 2022-09-23 15.24.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/9bab7151-63e5-9485-faf5-007cc9cba58e.png">


### SCC 有効 + VNet Injection 有効

Azure プラットフォーム上で使われていないパブリック IP アドレスを一時的に借りて SNAT を行います。(※)
こちらについても IP 固定化は保証されません。
IP を固定化したい場合には NAT Gateway、Azure Firewall などの利用が推奨されます。

※ この方式は [2025 年 9 月 30 日で廃止される](https://azure.microsoft.com/ja-jp/updates/default-outbound-access-for-vms-in-azure-will-be-retired-transition-to-a-new-method-of-internet-access/)ため、明示的に NAT Gateway 等を連携させる必要があります。


<img width="550" alt="スクリーンショット 2022-09-23 15.24.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/0165dd9a-8e95-7ead-38f7-0462e05a2c88.png">


## データ プレーンおよびユーザーからコントロール プレーンへの接続方式

データ プレーンおよびユーザーからコントロール プレーンへ接続する際の方式を説明します。
なお、SCC の設定に関わらず、データ プレーンからコントロール プレーンへの接続は公共インターネットを経由せず **Microsoft のバックボーン ネットワークを経由する**ため、VNet Injection の有無にだけ着目して説明します。

### VNet Injection 無効

データ プレーンおよびユーザーからコントロール プレーンにパブリック アクセスします。

![databricks-8.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/94c15ac2-6358-df34-2111-227d5c25c70b.png)


### VNet Injection 有効

パブリック アクセスと NSG ルールの設定によって構成が変わります。全ての組み合わせについて説明します。

#### パブリック アクセス有効 + NSG ルール有効

データ プレーンおよびユーザーからコントロール プレーンにパブリック アクセスします。

![databricks-7.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/6482775a-17c3-3c56-9ebe-f37e143678af.png)


#### パブリック アクセス有効 + NSG ルール無効

データ プレーンからコントロール プレーンにパブリック アクセスするための NSG ルールが存在しないため、プライベート エンドポイントが必要になります。


![databricks-6.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/5a5adad8-3975-b583-0abf-84ab8af7fc0a.png)


#### パブリック アクセス無効 + NSG ルール有効

この組み合わせは設定不可です。

#### パブリック アクセス無効 + NSG ルール無効

データ プレーンおよびユーザーから プライベート エンドポイントを経由してコントロール プレーンにアクセスします。
`databricks_ui_api` のプライベート エンドポイントを経由してワークスペースにブラウザ アクセスするときのみ、`<region>.pl-auth.azuredatabricks.net` への通信が発生します。このエンドポイントにパブリック アクセスしてもよいですが、下図では `browser_authentication` のプライベート エンドポイント経由でアクセスしています。

![databricks-5.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/28acc1ba-8643-c9bd-3724-256c106b61b9.png)

## おわりに
Azure Databricks ワークスペース作成時に選択できる 2 つのネットワーク設定について説明しました。
Databricks コントロール プレーンへのパブリック アクセスを許可している場合でも、[IP アクセス リスト](https://learn.microsoft.com/ja-jp/azure/databricks/security/network/ip-access-list)の機能を使用すればアクセス元の IP アドレスで制限をかけることができます。

## 参考
https://learn.microsoft.com/ja-jp/azure/databricks/getting-started/overview

https://learn.microsoft.com/ja-jp/azure/databricks/security/secure-cluster-connectivity

https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/cloud-configurations/azure/private-link