はじめに
Azure Databricks を Private Link 構成によるデプロイを試してみました。
構成は以下のようなイメージとなります。
今回は標準デプロイで実施しました。詳細は以下のドキュメントをご確認ください。
仮想ネットワークを作成
Databricksをデプロイするための仮想ネットワークは以下の要件を満たす必要があります。
今回は以下のように仮想ネットワークを作成しました。
仮想ネットワーク① | 仮想ネットワーク② | |
---|---|---|
仮想ネットワーク名 | vnet_hub | vnet_spoke-01 |
アドレス範囲 | 172.16.0.0/16 | 10.1.0.0/16 |
サブネット① | private-endpoint | databricks_host |
サブネット①範囲 | 172.16.0.0/27 | 10.1.0.0/24 |
サブネット①用途 | プライベートエンドポイント用 | Databricks のホストサブネット(パブリックサブネット) |
サブネット② | default | databricks_container |
サブネット②範囲 | 172.16.0.32/29 | 10.1.1.0/24 |
サブネット②用途 | DatabricksへアクセスするためのVM用 | Databricks のコンテナサブネット(プライベートサブネット) |
サブネット③ | - | private-endpoint |
サブネット③範囲 | - | 10.1.2.0/27 |
サブネット③用途 | - | プライベートエンドポイント用 |
Azure Databricks ワークスペースとプライベートエンドポイントを作成
以下のドキュメントの手順を基に作成しました。
ワークスペースの設定値は以下となります。価格レベルは Premium としています。
Nat Gatewayについて
ドキュメントの手順には無かった、Nat Gateway の設定値があります。おそらくですが、Azure の仮想マシンの既定の送信アクセス接続の廃止が予定されているため、クラスター(VM)のアウトバウンド用に Nat Gateway が強制的に作成されるようです。
既定の送信アクセスについてはこちらをご確認ください。
ワークスペースと同時にバックエンド用のプライベートエンドポイントを作成します。
上記以外(暗号化や Security & compliance)の設定値はデフォルトのままで作成しました。
続いてフロントエンド用のプライベートエンドポイントを作成します。設定値は以下の通り。
最後に Web ブラウザー認証用のプライベートエンドポイントを作成します。
Web ブラウザー認証用のプライベートエンドポイントについて
Web ブラウザー認証用のプライベートエンドポイントをホストするためのワークスペースを別途作成することが推奨されていますが、今回はワークスペースを1つにしています。
詳細はこちらをご確認ください。
また、プライベート DNS ゾーンは以下のように設定しています。
- privatelink.azuredatabricks.net は 以下のようにレコードをセットして vnet_spoke-01 にリンク
- azuredatabricks.net は 以下のようにレコードをセットして vnet_hub にリンク
テスト
Databricks ワークスペースへの接続テスト
vnet_hub 内にワークスペースへの接続用VM(vm-connect-check)をデプロイします。これにより、プライベートDNSゾーン(azuredatabricks.net)でフロントエンドとWeb ブラウザー認証用のプライベートエンドポイントへの名前解決が可能となるため、ワークスペースへの接続が可能となります。
リモートデスクトップ接続でVMに入って、ワークスペースに接続すると以下のように接続できます。
クラスターテスト
クラスター(Personal Compute)を作成して JSON を表示すると、プライベート IP とパブリック IP を確認することができます。
プライベート IP はコンテナサブネットの範囲、パブリック IP はホストサブネットの範囲になっていることがわかります。
今回は Vnet インジェクションでデプロイしているため、どちらもプライベート IP となっていますが、既定のデプロイの場合は片方がパブリック IP となるはずです。
また、以下のようにインターネットへ出ていく際のグローバル IP を取得してみると、強制的に作成された Nat Gateway のパブリック IP が表示されます。
グローバル IP を取得するサンプルコード
import requests
def get_public_ip():
response = requests.get('https://api.ipify.org?format=json')
ip = response.json()['ip']
return ip
# グローバルIPアドレスを取得する
public_ip = get_public_ip()
print(public_ip)
おわりに
Databricks の閉域構成について以下の記事がとても参考になりました。
併せてご参照ください。