DatabricksからAzure OpenAIへのアクセスにおけるマネージドIDの活用

以前こちらの記事を書きました。

https://qiita.com/taka_yayoi/items/88ec0e401bf7b2f3057a

この際には、APIキーを用いてAzure OpenAIにアクセスしましたが、今回はマネージドアイデンティティ(MI)を用いてアクセスします。

こちらの記事が非常に参考になりました。

https://medium.com/@manoj__kumar/leveraging-azure-msi-authentication-in-databricks-notebooks-to-connect-with-azure-services-a401ee005375

> 他のAzureサービスに接続する際に、Databricksノートブックにおけるシームレスかつセキュアな認証のために、Azure MSIの認証ではマネージドサービスアイデンティティ(MSI)を活用します。この手法によって、シークレットやキーボルトの管理の必要性を排除し、自動化を促進し、プロセスをシンプルにします。

こちらも参考にしてます。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/managed-identity

:::note warn
**警告**
本記事で説明している手法では、Azure Databricksワークスペースの**すべての**クラスターに対して、Azure OpenAIサービスへのアクセスを許可することになるので、用法に注意してください。
:::

# DatabricksのマネージドIDの特定

Azure Portalで、アクセスを許可するAzure Databricksワークスペースにアクセスします。**管理対象リソースグループ**をクリックします。
![Screenshot 2024-04-02 at 17.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8c299dbb-0704-f683-88b0-7c5556e8f90d.png)

**マネージドID**をクリックします。
![Screenshot 2024-04-02 at 17.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e6f4b579-4bd3-3421-4ffb-3d639b2d1c2d.png)

**リソースグループ**をコピーしておきます。
![Screenshot 2024-04-02 at 17.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0a3d8715-bdb3-5999-7417-9ffa2a4367da.png)


:::note
**注意**
元記事にはクライアントIDコピーしろとありましたが、マネージドIDはリソースグループ名で特定できるので不要でした。
:::


# Azure OpenAIサービスでのアクセス許可

OpenAIサービスにアクセスし、アクセス制御(IAM)で**ロールの割り当ての追加**を選択します。
![Screenshot 2024-04-02 at 17.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b4d65bd7-0d01-9870-e100-d67fd1d4ed97.png)

[こちら](https://logico-jp.io/2024/02/23/unable-to-complete-the-tutorial-of-azure-openai-service-assistants-apis/)を参考に`Cognitive Services OpenAI Contributor`ロールとして追加します。

> Assistants APIを使う場合にはCognitive Services OpenAI Contributorロールを付与しなければならない。

![Screenshot 2024-04-02 at 17.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f623fe14-28b7-26f7-2404-48aa097e0de8.png)

**マネージドID**を選択し、**メンバーを選択する**をクリックします。
![Screenshot 2024-04-02 at 17.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/68da666c-e35b-af31-4f03-23819146eb3f.png)

右のペインで、**マネージドID**で`ユーザー割り当てマネージドID`を選択し、下に表示されるAzure DatabricksワークスペースのリソースグループのマネージドIDを選択します。複数ある場合にはマウスをホバーするとリソースグループ名含めて表示されます。
![Screenshot 2024-04-02 at 17.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6e31aa8c-4d8c-3610-f132-839a5ea93e2c.png)

設定します。反映までに数分のタイムラグがあるようです。
![Screenshot 2024-04-02 at 18.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5c218593-d4ac-f8a4-1a29-023f1b66d4b4.png)

# ノートブックでの動作確認

当該ワークスペースでノートブックを作成して実行します。

```py
%pip install openai --upgrade
%pip install azure-identity
dbutils.library.restartPython()
```

```py
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAI(
    api_version="2024-02-15-preview",
    azure_endpoint="<エンドポイントのURL>",
    azure_ad_token_provider=token_provider
)

response = client.chat.completions.create(
    model="gpt-35", 
    messages=[
        {"role": "system", "content": "あなたは有能なアシスタントです。"},
    ]
)

print(response.choices[0].message.content)
```
```
ありがとうございます！どのようにお手伝いできますか？
```

これでAPIキーをシークレットやノートブックで保持する必要がなくなります。用法に注意の上ご活用ください。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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