Azure Databricks Unity Catalog の Databricks アクセスコネクタによる認証時における Azure Storage のファイヤーウォール設定による挙動の確認

## 概要

Azure Databricks Unity Catalog の Databricks アクセスコネクタによる認証時における Azure Storage のファイヤーウォール設定による挙動の確認結果を共有します。検証結果から、Azure Stoarge のファイヤーウォールを設定する際には、リソース インスタンス、および、仮想ネットワークを登録することがよさそうです。本記事では、検証結果と検証方法を記述します。

Data Explorer のVolume UI にて、GUI によりアップロードとダウンロード不可であることは次の記事で検証しております。

- [Azure Databricks にて Unity Catalog volumes 利用時の Azure Storage にファイヤーウォールを設定した際の動作検証 - Qiita](https://qiita.com/manabian/items/926f76549b5bbf85351b)

## 検証結果概要

検証結果から、Azure Databricks Unity Catalog の Databricks アクセスコネクタによる Azure Storage への認証を行うには、仮想ネットワークとリソース インスタンスが必要となるようです。

| #    | 設定値                | 要否 | 挙動からの推測                         |
| ---- | --------------------- | ---- | -------------------------------------- |
| 1    | 仮想ネットワーク      | 〇   | ストレージのファイルを参照する際に必要 |
| 2    | リソース インスタンス | 〇   | ストレージのリストを取得する際に必要   |

Databricks Unity にて、Databricks アクセスコネクタ経由での挙動を確認するために、ストレージから接続できることを確認するために次のような検証を行いました。

| #    | 検証項目                 | 目的                                                       |
| ---- | ------------------------ | ---------------------------------------------------------- |
| 1    | Data Explorer での表示可否 | ストレージのリストを取得可能であるかを確認。               |
| 2    | list の実行可否          | ストレージのリストを取得可能であるかを確認。               |
| 3    | dbutils.fs.ls の実行可否 | dbutils にて、ストレージのリストを取得可能であるかを確認。 |
| 4    | SELECT の実行可否        | ストレージのファイルをよむことができるかを確認。           |

Azure Storage のファイヤーウォールにて次の機能の設定有無のパターンを検証しました。

| #    | 設定値                | 概要                                              |
| ---- | --------------------- | ------------------------------------------------- |
| 1    | 仮想ネットワーク      | Vnet インジェクション先の仮想ネットワークを登録。 |
| 2    | リソース インスタンス | Databricks アクセスコネクタを登録。               |

設定値に応じた検証項目の結果は次のようになりました。仮想ネットワークとリソース インスタンスのいずれの設定も必要となるという解釈をしました。

| #    | 検証設定値                                                  | Data Explorer での表示可否 | list の実行可否 | dbutils.fs.ls の実行可否 | SELECT の実行可否 |
| ---- | ------------------------------------------------------- | -------------------------- | --------------- | ------------------------ | ----------------- |
| 1    | 仮想ネットワーク設定あり、リソース インスタンス設定あり | 〇                         | 〇              | 〇                       | 〇                |
| 2    | 仮想ネットワーク設定あり、リソース インスタンス設定なし | ×                          | ×               | ×                        | ×                 |
| 3    | 仮想ネットワーク設定なし、リソース インスタンス設定あり | 〇                         | 〇              | ×                        | ×                 |


## 検証方法とその結果

### 事前準備

#### ファイヤーウォールを設定した 3 つのストレージを作成と設定

検証設定値に応じた３つストレージを作成するために次の手順を実行しました。`ファイヤーウォールの設定`の検証設定値に応じた設定を行いました。

1. ストレージアカウント
1. `external`というコンテナーを作成
1. `test`というフォルダを作成して、`data_file__1.csv`というファイルを配置
1. ファイヤーウォールの設定
    1. `仮想ネットワーク`に Databricks をインジェクションしている仮想ネットワークの`public-subnet`サブネットを設定
    1. `リソース インスタンス`に Databricks アクセスコネクタを設定
    1. `信頼されたサービスの一覧にある Azure サービスがこのストレージ アカウントにアクセスすることを許可します。`のチェックを外す



**パターン1（仮想ネットワーク設定あり、リソース インスタンス設定あり）の設定値**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3b749564-14ec-f7be-6f08-6b74e06be5c6.png)

**パターン2（仮想ネットワーク設定あり、リソース インスタンス設定なし）の設定値**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b5cf7771-4480-7e96-38d5-3a3b74e82690.png)

**パターン3（仮想ネットワーク設定なし、リソース インスタンス設定あり）の設定値**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/01b98982-507c-00e8-6b5b-3456c61af992.png)

**`data_file__1.csv`のデータ**

```csv
str_col,int_col,date_col
"abc",1,2000-12-31
"def",2,2001-01-01
"ghi",3,2001-01-02
"jkl",4,2001-01-03
"mno",5,2001-01-04
"pqr",6,2001-01-05
"stu",7,2001-01-06
"vwx",8,2001-01-07
"yz_",9,2001-01-08
"abc",10,2001-01-09
```

#### Databricks にて 3 つのストレージを外部ストレージとして登録

次の画像で示すように、外部ロケーションとして３つのストレージを登録しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7135e845-c094-66c4-3505-0921d3af5ebe.png)

### 検証結果

#### パターン1（仮想ネットワーク設定あり、リソース インスタンス設定あり）の検証結果

**Data Explorer での表示可否**

表示できることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/abc7eb09-de20-0327-b89d-1e3cc9cd6cf7.png)

**list の実行可否**

表示できることを確認。

```python
%sql
list 'abfss://external@dbucexternal123pattern1.dfs.core.windows.net/'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fd76b70f-5170-a486-7d69-8ec8a4860ae5.png)

**dbutils.fs.ls の実行可否**

表示できることを確認。

```python
dbutils.fs.ls('abfss://external@dbucexternal123pattern1.dfs.core.windows.net/')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d3ff04bb-df6f-c95e-86fd-1b450520686c.png)

**SELECT の実行可否**

ファイルを参照できることを確認。

```python
%sql
SELECT
  *
  FROM
    csv.`abfss://external@dbucexternal123pattern1.dfs.core.windows.net/test/data_file__1.csv`
Table
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f5d677fb-2803-8ecc-f9fe-4476c3f0d36b.png)

#### パターン2（仮想ネットワーク設定あり、リソース インスタンス設定なし）の検証結果

**Data Explorer での表示可否**

表示できないことを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/509562af-6827-61d0-9bdf-1de59b2af987.png)

**list の実行可否**

表示できないことを確認。

```python
%sql
list 'abfss://external@dbucexternal123pattern2.dfs.core.windows.net/'
```

```text
AnalysisException: [RequestId=ad1cb8d5-fb51-4a65-8a26-0a1c7a2227bd ErrorClass=INVALID_STATE.UC_CLOUD_STORAGE_ACCESS_FAILURE] Failed to access cloud storage: AbfsRestOperationException exceptionTraceId=018566c0-73db-45f6-b037-489561f19f2c
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d22e369b-1e03-7a6b-8dbd-8a1ebbd451cb.png)

**dbutils.fs.ls の実行可否**

表示できないことを確認。

```python
%sql
list 'abfss://external@dbucexternal123pattern2.dfs.core.windows.net/'
```

```text
Failed to acquire a SAS token for list on / due to java.util.concurrent.ExecutionException: com.databricks.sql.managedcatalog.acl.UnauthorizedAccessException: PERMISSION_DENIED: request not authorized
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4b77d19f-03f1-73da-00eb-f655f4cc1b41.png)


**SELECT の実行可否**

ファイルを参照できないことを確認。

```python
%sql
SELECT
  *
  FROM
    csv.`abfss://external@dbucexternal123pattern2.dfs.core.windows.net/test/data_file__1.csv`
```

```text
AnalysisException: Failed to acquire a SAS token for get-status on /test/data_file__1.csv due to java.util.concurrent.ExecutionException: com.databricks.sql.managedcatalog.acl.UnauthorizedAccessException: PERMISSION_DENIED: request not authorized; line 4 pos 4
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3363d5cd-f17a-f746-9a67-5356976227af.png)

#### パターン3（仮想ネットワーク設定なし、リソース インスタンス設定あり）の検証結果

**Data Explorer での表示可否**

表示できることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/46fdc437-6448-53c4-cf90-07d7ba104c75.png)

**list の実行可否**

表示できることを確認。

```python
%sql
list 'abfss://external@dbucexternal123pattern3.dfs.core.windows.net/'
Table
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4478a48b-4b06-ee12-b54a-656eff547c56.png)

**dbutils.fs.ls の実行可否**

表示できないことを確認。

```python
dbutils.fs.ls('abfss://external@dbucexternal123pattern3.dfs.core.windows.net/')
```

```text
Operation failed: "This request is not authorized to perform this operation.", 403, GET, https://dbucexternal123pattern3.dfs.core.windows.net/external?upn=false&resource=filesystem&maxResults=5000&timeout=90&recursive=false&st=2023-08-24T05:07:10Z&sv=2020-02-10&ske=2023-08-24T07:07:10Z&sig=XXXXX&sktid=095ca098-c723-478f-9bb6-c764031b159e&se=2023-08-24T06:30:27Z&sdd=0&skoid=3af96b21-fc7f-4bfeXXXXXXXXXXXXXXXXXX&spr=https&sks=b&skt=2023-08-24T05:07:10Z&sp=rl&skv=2020-02-10&sr=c, AuthorizationFailure, "This request is not authorized to perform this operation. RequestId:2fe458dd-201f-008b-6a4c-d64f6a000000 Time:2023-08-24T05:30:29.5802436Z"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3228e1e0-682f-acac-5832-3b587cb785fa.png)


**SELECT の実行可否**

ファイルを参照できないことを確認。

```python
%sql
SELECT
  *
  FROM
    csv.`abfss://external@dbucexternal123pattern3.dfs.core.windows.net/test/data_file__1.csv`
```

```text
AnalysisException: Operation failed: "This request is not authorized to perform this operation.", 403, HEAD, https://dbucexternal123pattern3.dfs.core.windows.net/external/test/data_file__1.csv?upn=false&action=getStatus&timeout=90&st=2023-08-24T05:07:10Z&sv=2020-02-10&ske=2023-08-24T07:07:10Z&sig=XXXXX&sktid=095ca098-c723-478f-9bb6-c764031b159e&se=2023-08-24T06:30:32Z&sdd=2&skoid=3af96b21-fc7f-4bfeXXXXXXXXXXXXXXXXXX&spr=https&sks=b&skt=2023-08-24T05:07:10Z&sp=rl&skv=2020-02-10&sr=d; line 4 pos 4
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/21e9815d-9944-e865-d90e-1951c9646d8e.png)