Azure DatabricksでサービスプリンシパルからDatabricks REST APIを使う

ちょっとハマったのでメモ。

# サービスプリンシパルとは

APIアクセスのみが可能なアイデンティティです。ユーザーと違って、GUIへのアクセスには使用できません。自動化ツールやジョブで使用することを推奨しています。

https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/users-groups/service-principals

# サービスプリンシパルの作成

1. **Azure Portal > Azure Active Direcotry > アプリの登録**に移動します。
1. サービスプリンシパルの名前を入力して、**サポートされているアカウントの種類**では、`この組織ディレクトリのみに含まれるアカウント (Default Directory のみ - シングル テナント)`を選択し、**登録**をクリックします。
![Screenshot 2023-06-08 at 8.49.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe083854-fc7d-2401-cbf0-6ce2dd36bdfe.png)
1. 以下の値をコピーしておきます。
    - アプリケーション (クライアント) ID
    - ディレクトリ (テナント) ID
1. サイドメニューの**証明書とシークレット**をクリックします。
1. **新しいクライアントシークレット**をクリックします。
1. 説明文を入力し、有効期限を選択して**追加**をクリックします。
![Screenshot 2023-06-08 at 8.52.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/37be5f8c-6390-7349-2069-7d36e40abdd8.png)

    :::note warn
    **重要！**
    運用設計に基づいて、適切に有効期限を管理するようにしてください。
   :::

1. クライアントシークレットの**値**をコピーしておきます。これはサービスプリンシパルのパスワードに相当します。
![Screenshot 2023-06-08 at 8.52.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/01c1df7d-ee1e-a792-7fc7-768b5d205455.png)

# Databricksアカウントにサービスプリンシパルを追加

1. Databricksワークスペースの右上のユーザー名をクリックし**Manage Account**を選択して、Databricksアカウントコンソールにアクセスします。
![Screenshot 2023-06-08 at 8.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/43acbe80-522f-0572-4413-ac901ea31e75.png)
1. サイドメニューから**User management**を選択します。
1. **Service principals**タブをクリックします。
![Screenshot 2023-06-08 at 8.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/dbdaeabb-ce25-4f71-ec97-697d6d0cb455.png)
1. **Add service principal**をクリックします。
1. **Name**にはわかりやすい名前、**UUID**には、[上でメモ](#サービスプリンシパルの作成)した**アプリケーション (クライアント) ID**を入力します。**Add**をクリックします。
![Screenshot 2023-06-08 at 8.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d7d2bdcd-7fc4-3e42-0f7d-f4ed936fc03b.png)

# ワークスペースにサービスプリンシパルを割り当てる

1. アカウントコンソールのサイドメニューで**Workspaces**を選択します。
1. REST APIを使用するワークスペースを選択します。
1. **Permissions**タブを選択します。
![Screenshot 2023-06-08 at 9.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/241f034f-5ecb-2f99-9ac6-0e83f1136724.png)
1. **Add permissions**をクリックします。
1. User, group or service principalで上で作成したサービスプリンシパルを選択し、必要な権限をPermissionで選択します。**Save**をクリックします。
![Screenshot 2023-06-08 at 9.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3415bc1a-9624-a4cb-b574-d9cb6612fd85.png)
![Screenshot 2023-06-08 at 9.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/18a03b76-980a-74d9-515e-d0fbeab031a6.png)

# サービスプリンシパルのトークンを取得する

サービスプリンシパルからREST APIを使用するためには、トークンが必要となります。

https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/users-groups/service-principals#--manage-personal-access-tokens-for-a-service-principal

トークンの取得にもREST APIの呼び出しが必要です。`curl`などを使っても良いですが、ここでは[Postman](https://www.postman.com/)を使います。

- エンドポイント: `https://login.microsoftonline.com/<テナントID>/oauth2/v2.0/token`
    - テナントID: 作成したサービスプリンシパルの**ディレクトリ (テナント) ID**
- メソッド: POST
- Body:
    - x-www-form-urlencoded
        - client_id: サービスプリンシパルの**アプリケーション (クライアント) ID**
        - grant_type: `client_credentials`
        - scope: `2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default`
        - client_secret: サービスプリンシパルのクライアントシークレットの値

レスポンスの`access_token`の値をコピーします。このトークンには1時間の有効期限があるので注意してください。
![Screenshot 2023-06-08 at 9.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b4c15108-fef7-57ff-c629-e1dab0e7c3e5.png)

# REST APIを呼び出す

これでREST APIを呼び出す準備ができました。

APIのリファレンスはこちらです。

https://docs.databricks.com/api/azure/workspace/introduction

ここでは、ワークスペースのクラスター一覧を取得します。

- エンドポイント: `https://<Databricksワークスペースのホスト名>/api/2.0/clusters/list`
- メソッド: GET
- Authorization: 
    - Type: Bearer
    - Token: [上で取得](#サービスプリンシパルのトークンを取得する)したサービスプリンシパルのトークン

動きました！
![Screenshot 2023-06-08 at 9.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/85ab882b-f011-3fc1-5d20-ba8e82d9ac53.png)

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)