😻

Azure Databricksをインフラ視点で使う(2)【ストレージの追加設定編】

2025/01/27に公開

はじめに

前回の記事ではAzure DatabricksをTerraformを使って基本的な構成を行いました。

https://zenn.dev/yotan/articles/7da1f3b7271830

Databricksを仮想ネットワーク指定で作成することで、今後様々な外部データをプライベートネットワーク経由でつなげられることが期待できます。

また、続編の記事も以下で公開しています。

https://zenn.dev/yotan/articles/998c5eafa335f7

なぜストレージアカウントを作るのか

Azure Databricksを作成すると、追加で専用のリソースグループが作成され、その配下にはデフォルトのカタログ用ストレージとDatabricksから認証を行うためのAccess Connectorが作成されます。

他にもこのリソースグループにはコンピュートインスタンスを起動させるとVMSSなどもデプロイされます。

img

ここにあるストレージアカウントはdefaultというスキーマを入れる領域として自動で用意されます。

img

この場所をそのまま使っても良いかとは思いますが、噂ではAWS版のDatabricksでは初期構築時にこのような領域は作成されず、またDatabricksの人からもあまりこちらを使うのはおすすめしないとの事でした(あくまで非公式な情報)。

また、この専用のリソースグループは完全にAzure Databricksが管理しているため、個別にリソースのプロパティ変更などが行えません。

  • ストレージアカウントがpublicアクセスになっている
  • 特にプライベートリンクされていない
  • ストレージアカウントにロールが付与できないのでコンテナ内のファイルにAzureポータルなどからアクセスできない

ちょっと厳しいかなと。

Databricksのポータルから操作する分には困らないと思いますが、できればボリューム内のファイルのやり取りは直接ストレージにアクセスしてAzure的な操作で行いたいですよね(きっと)。

なので、自分で作成したストレージアカウントをDatabricksから使えるようにします。

今回やったこと

今回は以下の追加を行いました。

  • Databricks Access Connector作成
  • 新規のストレージアカウント(Gen2)作成
    • パブリックアクセスはなし
    • 既存の仮想ネットワークにプライベートリンク
    • スキーマ用、ボリューム用のコンテナ作成
  • 作成したストレージアカウントのIAMにDatabricks Access Connectorのロールを付与

https://github.com/katakura/azure-databricks-private-network/tree/zenn02

その後はDatabricksポータルから設定を行っていきます。

使い方

クライアントPCにはAzure CLIとterraformはインストールしておきましょう。

https://learn.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=AZ-MVP-5002499

https://learn.microsoft.com/azure/developer/terraform/quickstart-configure?WT.mc_id=AZ-MVP-5002499

まずリポジトリをclone後、terraform.tfvars.sampleterraform.tfvars にコピーして、内容を適度に書き換えます。

続いて、以下のコマンドイメージを参考にデプロイしましょう。

export ARM_SUBSCRIPTION_ID="your subscription id"
az login -t <your tenant id>
az account set -s $ARM_SUBSCRIPTION_ID
terraform plan
terraform apply

はいできました。

img

デプロイ後、outputsにてAccess ConnectorのリソースIDと、ストレージのURLが出力されるので、こちらは控えておきます。

azurerm_databricks_access_connector_id = "/subscriptions/????????-????-????-????-????????????/resourceGroups/rg-databricks01/providers/Microsoft.Databricks/accessConnectors/access-connector-ktkrdbws"
azurerm_storage_account_url = "https://stktkrdbws????????.dfs.core.windows.net/"

少しTerraformの説明

ストレージ関連

ストレージアカウントを作成しているメインの部分は以下です。

https://github.com/katakura/azure-databricks-private-network/blob/zenn02/src/storage.tf#L1-L15

ストレージアカウントのコンテナもスキーマ用と、ボリューム用に二つ作成します。

https://github.com/katakura/azure-databricks-private-network/blob/zenn02/src/variables.tf#L55-L59

https://github.com/katakura/azure-databricks-private-network/blob/zenn02/src/storage.tf#L53-L58

その後プライベートリンクを張ります。

https://github.com/katakura/azure-databricks-private-network/blob/zenn02/src/storage.tf#L17-L29

プライベートIPアドレスにて、Databricksから名前解決できるようにPrivate DNS zoneを作成しています。

https://github.com/katakura/azure-databricks-private-network/blob/zenn02/src/storage.tf#L31-L51

Databricks Access Connector

Databricksの資格情報に設定するためのAccess Connectorを作成します。

https://github.com/katakura/azure-databricks-private-network/blob/zenn02/src/main.tf#L51-L60

IAM

また、作成したAccess Connectorからストレージアカウントに「ストレージBLOBデータ共同作成者」のロールを付与しています。

https://github.com/katakura/azure-databricks-private-network/blob/zenn02/src/main.tf#L62-L66

ロールID「ba92f5b4-2d11-453d-a403-e96b0029c9fe」は固定です。

こちらのサイトにAzure組み込みロールの一覧があります。

https://learn.microsoft.com/azure/role-based-access-control/built-in-roles?WT.mc_id=AZ-MVP-5002499

Databricks側の追加設定

資格情報

カタログエクスプローラから外部データ内の「資格情報」を開き、「資格情報を作成」をクリックします。

img

資格情報のタイプは「AzureマネージドID」、資格情報名は適当に。

アクセスコネクターIDに先ほどterraform apply時に最後に表示されたazurerm_databricks_access_connector_idの内容を入力します。

img

最後に「作成」を押して完了です。

外部ロケーション

カタログエクスプローラから外部データ内の「外部ロケーション」を開き、「外部ロケーションを作成」をクリックします。

img

ボリューム用、スキーマ用の二種類作成します。

まずは、ボリューム用。

外部ロケーション名は適当に。URLは「abfss://コンテナ名@ストレージアカウント名.dfs.core.windows.net/」の形式です。

ストレージアカウント名がstktkrdbws12345678の場合、ボリューム用のコンテナ名を含めて以下のように指定します。

abfss://volume@stktkrdbws12345678.dfs.core.windows.net/

ストレージ資格情報は、先ほど作成したものを選択して設定します。最後に「作成」をクリックします。

img

同様に、スキーマ用の外部ロケーションも作成します。

img

新規カタログ

新規のカタログを作成しましょう。

カタログエクスプローラの「+」ボタンから「カタログを追加」を選びます。

カタログ名は適当に、ストレージの場所に先ほど作ったスキーマ用の外部ロケーションを選択しました。

また、なんとなくですが1階層ディレクトリの奥に作ってみたく、パスに「catalog」と入れました。

このあたりは、実際にDatabricksでカタログを使いまくっている人たちがベストプラクティスを知っていると思いますが、私はこのへんはまだ判らないです。

img

とりあえずカタログ一覧に追加されたようです。

img

このカタログ配下でテーブルを作ると、それは今回追加したストレージアカウントの「schema」コンテナ内の「catalog」ディレクトリ配下に格納されていく事でしょう。

新規ボリューム

先ほど作成したカタログ配下にボリュームを追加します。

カタログエクスプローラのツリーから先ほど作ったカタログ内の「default」を選択して、「作成」プルダウンから「ボリュームの作成」を選択します。

img

ボリューム名は適当に。ボリュームタイプは「外部ボリューム」を選択して、外部ロケーションに先に作成したボリューム用のものを選択します。

パスは自動で入力されますが、末尾に「/volume01」と付与してみました。こうすると、Azureストレージアカウントのvolumeコンテナ内に自動で「volume01」ディレクトリも作成されます。

img

作成したボリュームにクライアントPCからファイルのアップロードも行えます。

img

とりあえず確認

では確認しましょう。

まずは、手元にある適当なcsvファイルをdefaultスキーマ内にテーブルとして登録します。

この際に使うコンピュートがサーバレスなものではない、別途追加したもので実行してください(サーバレスを選ぶとテーブル作成ができません)。

img

SQLエディタでちゃんとクエリが実行されましたね。

img

ノートブックからも確認します。

img

うまく行きましたね。

今後やること

  • サーバレスのSQL Warehouse等をプライベートリンクで接続(公開済)

https://zenn.dev/yotan/articles/998c5eafa335f7

  • Databricksワークスペース自体をプライベートネットワーク経由のみでアクセスさせるように構成してみる
  • もう少しDatabricksそのものの知見を深める

おわりに

とにかく先が長そうな試用なので、記事を分割して少しずつ取り込んでいきたいと思います。

今回の記事で、Azure Databricksに管理されていないストレージアカウントをプライベートネットワーク経由でカタログに登録して色々操作することはできるようになりました。

次回はいよいよ、Databricks管轄のサーバレス用コンピュートから、今回の仮想ネットワークにプライベート接続させて、より完全なものに仕上げていきたいと思います。

Discussion