Azure Data Factory から Databricks シークレットを取得する Databricks ノートブックを実行した際のエラー対応：IllegalArgumentException

## 概要

Azure Data Factory から Databricks シークレットを取得する Databricks ノートブックを実行した際に発生した下記エラーに対する対応方法を共有します。一時的にエラーとなっているだけかもしれませんが、念のため記事にしました。

```text
IllegalArgumentException: No enum constant com.databricks.api.proto.databricks.ErrorCodeEnum.ErrorCode.401
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c062c3b8-140b-3b5c-a09a-ce13e90660c1.png)


対応方法としては、`Unity カタログ アクセス モード`を`割り当て済み`に変更する方法です。試しておりませんが、`共有`に設定しても動作する可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b4fba876-7b65-d32b-f9f1-25003dadccdb.png)

[以前に投稿した記事](https://qiita.com/manabian/items/d0a9673793af2a5c1976)にて、Unity Catalog が有効なワークスペースではアクセスモードが`シングルユーザー`となり今回のエラーは発生しませんが、Unity Catalog が有効でないワークスペースでは今回のエラーが発生する可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f11b59a4-e6db-2e24-66da-fc6673cdcba2.png)

引用元：[Azure Data Factory から Databricks Jobs computing を作成した際の挙動確認 #AzureDataFactory - Qiita](https://qiita.com/manabian/items/d0a9673793af2a5c1976)

## エラーの発生方法と

### 事前準備

#### Databricks シークレットの登録

```python
%pip install databricks-sdk --upgrade -q
dbutils.library.restartPython()
```

```python
from databricks.sdk import WorkspaceClient
from databricks.sdk.core import DatabricksError
 
w = WorkspaceClient()

scope_name = 'qiita'

try:
    w.secrets.create_scope(scope=scope_name)
except DatabricksError:
    print(f"Scope `{scope_name}` already exists!")

# シークレットの項目名と値をセット
scope_key_and_values = {
    "value_01": "qiita_article_01",
    "value_02": "qiita_article_02",
}

# シークレットを登録
for key,value in scope_key_and_values.items():
    w.secrets.put_secret(
        scope=scope_name,
        key=key,
        string_value=value,
    )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e111001e-1f1a-8038-b717-e8ef35f594e3.png)

#### シークレットを取得するノートブックを作成

```python
# シークレットを取得できることを確認
scope_name = 'qiita'

print(dbutils.secrets.get(scope_name,"value_01"))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f5268b63-c169-e5e4-90a4-a35b33921259.png)

### エラーの再現

#### デフォルトの状態（`Unity カタログ アクセス モード`が空）の状態の Databricks のリンクサービスを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d74b1061-40c5-f616-7f17-fad9d75582fa.png)

#### シークレットを取得するノートブックをパイプラインから実行し、エラー終了となることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c5516e37-645b-d09a-b475-5be48d17cc58.png)

```text
IllegalArgumentException: No enum constant com.databricks.api.proto.databricks.ErrorCodeEnum.ErrorCode.401
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e7581e90-3ef0-8a3e-6ab6-f638f5b95f72.png)

### 対応方法

#### Databricks のリンクサービスの`Unity カタログ アクセス モード`を`割り当て済み`に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b2b77468-8fcd-55c8-b412-60c11f6cadc8.png)

### パイプラインを実行し正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/98132369-1274-4436-5b05-8bccf89ea153.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/802e687d-ae62-72c8-1b19-68f308a328d9.png)