Azure Databricks にて Unity Catalog volumes 利用時の Azure Storage にファイヤーウォールを設定した際の動作検証

## 概要

Databricks Unity Catalog の一機能である volumes 利用時に Azure Storage にファイヤーウォールを設定した際には次のような制約がある旨が記載されており、どういった制約となるかの検証結果を共有します。検証結果から、Data Explorer のVolume UI にて、GUI によりアップロードとダウンロードができないという制約があることを確認できました。クラスターから Azure Storage のファイルの読み込みや書き込みは想定通りに実施できました。

> You cannot upload or download files for volumes backed by Azure storage accounts configured with Azure Firewall or Private Link.

引用元：[Create volumes - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/create-volumes#limitations)

> Azure Firewall や Private Link で構成された Azure ストレージ アカウントでバックアップされたボリュームに対しては、ファイルのアップロードやダウンロードはできません。

上記の翻訳

## 事前準備

### 1. Azure Storage にファイヤーウォールを設定

Azure Storage にて次のファイヤーウォール設定を有効にします。

1. Databricks アクセスコネクターからのアクセス（下記画像のリソース インスタンスの箇所）
1. VNet インジェクション先仮想ネットワークのサブネットからのアクセス（下記画像の仮想ネットワークの箇所）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e2dbf003-dfbc-24ec-7c25-f5dc23774d8c.png)

### 2. 外部ロケーションの作成

Data Explorer にて、ファイヤーウォールを設定したストレージの外部ロケーションを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0efb28bd-af86-456d-7060-b571832cf1a3.png)

### 3. 検証用カタログ、スキーマ、および、 Volume を作成

検証に利用するカタログ、スキーマ、および、 Volume を作成します。


```python
%sql
CREATE CATALOG IF NOT EXISTS upload_ui;
CREATE SCHEMA IF NOT EXISTS upload_ui.schema_01;

DROP VOLUME IF EXISTS upload_ui.schema_01.volumes_01;
CREATE EXTERNAL VOLUME upload_ui.schema_01.volumes_01
LOCATION 'abfss://external@dbuce.dfs.core.windows.net/volumes';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9eb7e40f-cf6c-f5de-1b35-f6176d972484.png)

## 動作検証

### 1. Azure Storage へファイルの書き込み

次のコードの実行結果から、ファイルの書き込みが実施できることを確認できました。

```python
dbutils.fs.mkdirs('/Volumes/upload_ui/schema_01/volumes_01/tpch')

# dbfs 上のファイルをストレージにコピー
dbutils.fs.cp(
    "dbfs:/databricks-datasets/tpch/README.md",
    "/Volumes/upload_ui/schema_01/volumes_01/tpch/README.md",
)

# ファイルを表示
print(dbutils.fs.head("/Volumes/upload_ui/schema_01/volumes_01/tpch/README.md"))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f18bb8b6-253c-46cc-c462-7e35a40f52cf.png)


### 2. Azure Storage からファイルの取得

次のコードの実行結果から、ファイルの取得が実施できることを確認できました。

```python
# ストレージ上のファイルから dbfs をにコピー
dbutils.fs.cp(
    "/Volumes/upload_ui/schema_01/volumes_01/tpch/README.md",
    "dbfs:/FileStore/test/README.md",
    True,
)

# ファイルを表示
print(dbutils.fs.head("dbfs:/FileStore/test/README.md"))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e2a6b100-c7a4-df22-c571-74dba0d888d8.png)


### 3.Volume UI の検証

次の記事に記載されている Volume UI にて、アップロードとダウンロードの動作を確認しましたが、いずれも想定通りに動作しませんでした。

- [Upload files to a Unity Catalog volume - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/ingestion/add-data/upload-to-volume)

Data Exlorer にて、volume にファイルをアップロードしようとすると、次のようなエラーが発生しました。

> An error occurred while uploading. Please try again

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c88a9851-aad1-04f2-5855-62e46105c7e8.png)


Data Exlorer にて、volume にファイルをダウンロードロードしようとすると、ブラウザーにて次のようなエラーが発生しました。

> ダウンロードできませんでした - 問題が発生しました。もう一度お試しになるか、お客様の組織に問い合わせてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/088df1a8-a24f-8631-2971-c8643c88c5bc.png)