Azure Key Vaultに格納されたシークレットを利用してAzure DatabricksからBlob Storageへアクセス

# 概要
Storageのアクセス情報をAzureDatabricksのNotebooks上に記載してアクセスするのではなく、AzureKeyVaultを利用してアクセスしてみたいと思います。

# 必要なリソース
- StorageAccountとBlobコンテナー
- AzureDatabricks
- AzureKeyVault

#手順

## blobコンテナーの作成
- 作成したStorageAccountの画面に移動し、[データストレージ]欄の[コンテナー]を選択します。[+コンテナー]を選択し、コンテナー名を入力します。
![スクリーンショット 2022-01-25 10.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/ea88ec69-65f4-64f6-c50c-f4bcd1e93614.png)

- コンテナー内にテスト用のテキストファイルをアップロードしておきます。
![スクリーンショット 2022-01-25 10.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/0021259f-ff6c-4607-802d-784f8fd0f7d4.png)

- [セキュリティとネットワーク]の下にある[アクセスキー]を選択します。[StorageAccount名]と[key1のキー]情報をメモしておきます。
※キーの情報は、[キーの表示]をクリックすると表示されます。
![スクリーンショット 2022-01-25 10.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/3b71edde-2c12-8289-eaa9-9725bda58878.png)

## AzureKeyVaultにシークレットを追加
- 作成したキーコンテナーの画面に移動し、[設定]欄から[シークレット]を選択します。[+生成/インポート]を選択します。
![スクリーンショット 2022-01-25 10.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/6635840f-1c45-6ef3-d0eb-a37c9d6af51c.png)

- [シークレットの作成]画面で、以下の情報を指定します。残りの値はデフォルトのまま使用します。
※　対象StorageAccountキーのフレンドリ名はメモしておきます。
    - アップロードオプション：手動
    - 名前：対象StorageAccountキーのフレンドリ名
    - 値：先程コピーした対象StorageAccountのKey1の値
![スクリーンショット 2022-01-25 10.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/63fe5fe6-01cf-9b24-f876-58992c0d6dc1.png)

- [設定]欄から[プロパティ]を選択します。[コンテナーの URI]と[リソース ID]をメモしておきます。
![スクリーンショット 2022-01-25 10.30.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/28f94d85-7461-ede5-0943-c5d55e8b4f81.png)


## AzureDatabricksにシークレットスコープを作成
- 作成したAzureDatabricksのワークスペースを起動します。ワークスペースが別ウィンドウで開かれたら、URLの末尾に[#secrets/createScope]を追加します。

- [Scope Name]を入力し、メモしておいた[コンテナーの URI]と[リソース ID]を入力します。
※ Scope Nameはメモしておきます。
![スクリーンショット 2022-01-25 10.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/cbe655b4-9555-8f4d-3ccc-a9bd24897595.png)

- AzureDatabricksワークスペースのホームページで[New Cluster]を選択します。[Cluster Name]を入力し、クラスターを作成します。
![スクリーンショット 2022-01-25 10.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/4600c92a-c9a0-63ed-8400-0246cf329c08.png)

- AzureDatabricksワークスペースのホームページで[New Notebook]を選択します。
![スクリーンショット 2022-01-25 10.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/c4b8b1ca-0213-e1ec-dd73-7ec6f7ec6ab7.png)

- Notebook名を入力し、言語をpythonに設定します。加えて、先ほど作成したクラスターを設定します。
![スクリーンショット 2022-01-25 10.32.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/445d5689-d224-6c94-a90d-ec5f450e0a1d.png)

- 次のコマンドを実行して、コンテナーにマウントします。以下の値は変更してください。
    - your-container-name
        - StorageAccountに作成したコンテナ名
    - your-storage-account-name
        - 作成したStorageAccount名
    - mount-name
        - 任意で指定したmount-nameを使用してディレクトリが作成されます。
    - config-key
        - fs.azure.account.key.[your-storage-account-name].blob.core.windows.net" または、"fs.azure.sas.[your-container-name].[your-storage-account-name].blob.core.windows.net"を選択します。
    - scope-name
        - Databricksで作成したシークレットスコープの名前
    - key-name
        - AzureKeyVault内のStorageAccountキー用に作成したシークレットの名前

```
dbutils.fs.mount(
source = "wasbs://<your-container-name>@<your-storage-account-name>.blob.core.windows.net",
mount_point = "/mnt/<mount-name>",
extra_configs = {"<conf-key>":dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>")})
```
![スクリーンショット 2022-01-25 10.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/4b17ce12-5eae-3467-7b5b-976278eb41fc.png)

- BlobStorageコンテナー内のテキストファイルをデータフレームに読み込みます。

```
df = spark.read.text("/mnt/<指定のmount-name>/<コンテナ内のfile-name>")
```
![スクリーンショット 2022-01-25 10.32.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/493abcea-451d-2925-a445-477c37398602.png)

- ファイルの内容を表示します。

```
df.show()
```
![スクリーンショット 2022-01-25 10.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/8331f27c-320f-8561-9680-be83f7ea7918.png)

- マウントを解除します。

```
dbutils.fs.unmount("/mnt/<指定のmount-name>")
```
![スクリーンショット 2022-01-25 10.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514023/b2cdc196-2ccd-df43-8bcc-1a0585b87cd7.png)