AzureにセルフホストしたDifyからAzure OpenAI Serviceにプライベート接続する

Azure仮想マシンにセルフホストしたDifyから、Azure内のプライベート接続でAzureOpenAIに接続する構成を実装してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/3c1dd12d-ade3-4c26-84ca-ebe1cc839fc5.png)


# 目次
0. 要件および要点
1. リソースグループとAOAIサービス作成
2. AOAIモデルデプロイ
3. 仮想マシンおよびネットワーク作成
4. Difyインストール
  4.1 Difyインストール
  4.2 Difyログイン
5. AOAIサービスのプライベート化
6. DifyのAOAIモデル追加
7. Difyのチャット応答確認

# 0. 要件および要点
簡単に要件および要点を記載します。

**要件**
・Azureは日本国内のリージョンを使用すること。
・AzureOpenAI(以下AOAI)にはプライベート接続で接続すること。
・Difyはセルフホスト型とし、Azure内に配置すること。

**要点**
・生成AIモデル：日本国内でサポートされている**gpt-4o,2024-11-20**を利用します。
・Difyホスト対象：個人的な習慣で**仮想マシン**を使用します。
・仮想マシン(HW)：Difyシステム要件から**CPU>=2core,RAM>=4GiB**とします。
・仮想マシン(OS)：個人的な習慣で**Ubuntu Server 22.04**を使用します。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions#model-summary-table-and-region-availability

https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/docker-compose



# 1. リソースグループとAOAIサービス作成
以下の範囲を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/4c727fc7-e200-4c2b-9f4f-5d539e297239.png)

<br>

Azureポータルから`Azure Open AI Service`を選択し、`作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/bdc87f9c-b286-4443-983d-6f797ddd5a93.png)

<br>

以下を入力して次へを押下します。
・リソースグループ：`(新規作成するリソースグループ名)`
・リージョン：`Japan East`
・名前：`(Azure OpenAI Serviceの新規リソース名)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/17eb3af9-6aae-4cf1-87e1-11422ce8cadc.png)

:::note info
今回はこちらの画面で新規リソースグループも一括で作成します。
:::

<br>

ネットワーク設定は変更せず、`次へ`を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2d51ddd7-86bb-445c-8570-8276b3f56b51.png)

:::note warn
あとで`無効`(プライベートアクセス用)に変更します。
（VNet/Subnet作成後に実施）
:::

<br>

`作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/e0e1d680-3a1e-4e2a-a382-ece96dbe6721.png)

<br>

作成したリソースが存在していることが確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/9c6be47d-2d20-4451-baae-779a1207d6aa.png)





# 2.AOAIモデルデプロイ

以下の範囲を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/5b7b3c80-c5fc-4c4c-a7b5-1f1f4ceeeb96.png)


Azureポータルから`Azure Open AI Service`を選択し、`作成したリソース`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/9c6be47d-2d20-4451-baae-779a1207d6aa.png)

<br>

`Go to Azure AI Foundry portal`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/96a2485a-b933-4f44-b9d5-42e553b79332.png)

<br>

`モデルデプロイ`画面から`モデルのデプロイ`、`基本モデルをデプロイする`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d8ca2fd3-4bd3-4fb1-9ace-2919e5124c2b.png)

<br>

今回は`gpt-4o`を選択し、`確認`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/5374f3ea-2c73-409f-8531-16e0f3472938.png)

<br>

デプロイ画面にて、`デプロイ`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7dc45ab4-4ebc-4c01-9537-0bae893fa27d.png)

:::note info
デプロイの種類は以下から確認可能です。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/deployment-types

デプロイの種類ごとのサポートモデルは以下から確認可能です。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions#model-summary-table-and-region-availability
:::

<br>

デプロイされたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d48ea940-d77f-4b8d-bed6-81cf61be8095.png)





# 3.仮想マシンおよびネットワーク作成
以下の範囲を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/f1402d41-7db6-4b32-872f-cbdd4a03e448.png)

<br>

Azureポータルから`仮想マシン`を選択し、`作成` - `Azure仮想マシン`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/9a6c623c-0c46-451b-992d-9be2484b9ded.png)

<br>

`仮想マシンの作成`画面にて設定内容を入力します。
基本設定について、要点のみ下記します。

項目 | 設定内容 | 備考
--- | --- | ---
イメージ | Ubuntu Server 22.04 | 24.04でも良い
サイズ | Standard_D4s_v3(CPU4core,RAM16GiB) | Difyセルフホスト要件から

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/5a1df763-ddec-45c3-a78e-ecb686ab8aa4.png)

https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/docker-compose

<br>

ネットワーク設定画面にてVNetおよびSubnetを作成します。
パブリックIPアドレスについてはデフォルトで有効化されているためそのままとしておきます。
また、NICネットワークセキュリティグループについてDify Webアクセス用にHTTP(tcp80)も許可しておきます。

・VNetおよびSubnet作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7e167d9c-70d5-424d-9d34-f2f30a59309e.png)
・NICネットワークセキュリティグループ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/4653f624-b96e-48ac-956a-7b1a3b43d0f8.png)

<br>

その他の設定項目はデフォルトまたは任意設定とし、仮想マシンをデプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/56e7b9b0-49f9-480e-8875-31da8ee1f599.png)

<br>

デプロイが完了し、仮想マシンが表示されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/823cce25-8d7f-40e3-acb2-d259cb27f210.png)





# 4.Difyインストール
ubuntu server 22.04 にDifyをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/73386490-a2f6-4b35-a961-7a253e5cd2fa.png)

<br>

## 4.1 Difyインストール
パブリックIPアドレス経由で仮想サーバにsshログインし、CUIでDifyをインストールしていきます。

:::note warn
以下、root権限でコマンド実行しています。
通常ユーザを利用する場合は適宜 `sudo` を付与してください。
:::

```:時刻設定および初期アップデート
# timedatectl set-timezone Asia/Tokyo
# apt install vim -y
# apt update
# apt upgrade -y
```

```:dockerインストール
# apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# apt-key fingerprint 0EBFCD88
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# apt update
# apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# docker --version
# docker compose version
```

```:Difyダウンロードおよび環境変数配置
# git clone https://github.com/langgenius/dify.git
# cd ~/dify/docker
# cp .env.example .env
```

:::note info
上記 `git` コマンドを実行したディレクトリ配下にDify用のコンテナディレクトリが作成されるため、状況に応じて先にディレクトリを作成・遷移するなどを検討します。
:::

<br>

```:Dify起動
# cd ~/dify/docker
# docker compose up -d

# git pull origin main
# docker compose down
# docker compose pull
# docker compose up -d
# docker compose ps
```

ここまでで、Difyが仮想マシン上で実行される状態になりました。

<br>


:::note info
なお、Difyを停止するには以下コマンドを実行します。

```:Dify停止
# cd ~/dify/docker
# docker compose down
# docker compose up -d
```
:::



## 4.2 Difyログイン
Difyに初回ログインし、ユーザ作成等を行います。

以下URLを作成してブラウザから遷移します。
`http://【仮想マシンのパブリックIPアドレス】/install`

<br>

以下画面が表示されるため、メールアドレス、ユーザ名、パスワードを入力します。

:::note info
Dify試用において、メールアドレスは存在しないものでも問題ありません。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/232deb5e-3f4c-4664-9944-d9d5c4daa6cf.png)

<br>

セットアップ後、以下のURLに遷移するためサインインします。
`http://【仮想マシンのパブリックIPアドレス】/signin`

:::note info
以後は上記の `～/signin`というURLでログインすることができます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/3e634302-d753-49db-8912-bb333eb6edd8.png)

<br>

ログインが完了し、スタジオ画面が表示されることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/5bbc4e9d-6ef1-4c1d-a577-54c184901804.png)





# 5. AOAIサービスのプライベート化
以下の範囲を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d7099027-a5bc-4f06-bcfd-83b33534ea3c.png)

<br>

Azureポータルから`Azure Open AI Service`を選択し、`作成したリソース`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/a39fb76f-fe3a-45ba-a8a3-81df11cf015d.png)

<br>

左ペインの`リソース管理` - `ネットワーク`を選択します。
許可するアクセス元を`無効`として、`save`します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/92e6463f-9e10-4473-bf41-d5e97dc80ebc.png)

<br>

続いて、`プライベートエンドポイント接続`タブから`プライベートエンドポイント`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6070cab8-7ff5-4a86-8f63-93a3fa3e03e2.png)

<br>

プライベートエンドポイントを作成します。
①基本設定はリソースグループ名、エンドポイント名、NIC名、リージョンを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/11d0cbbf-f703-4d43-9069-b1980f8fea28.png)

<br>

②リソース設定は特に変更不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/b2697900-f941-42ca-8383-6b3911db84c0.png)

<br>

③仮想ネットワーク設定も特に変更不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/8363c518-14ef-466d-9263-785658f8223c.png)

<br>

④DNS設定も特に変更不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/a4e99aef-6ea3-4e13-aba6-05e1cd3dc4ef.png)

<br>

内容を確認し、リソースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/c5ea0a7f-9bcd-4496-8836-465e4c6b0908.png)

<br>

AOAIリソース画面にて、プライベートエンドポイント接続が存在していることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/322ca407-3b24-4e37-b350-a4b4ab20815d.png)

<br>

プライベートDNSゾーンについても作成されたことが確認されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/02d6dacd-7ffe-4ee8-ae1e-38040896bb80.png)





# 6. DifyのAOAIモデル追加
DifyのLLMプロバイダとして、プライベートリンク経由のAOAIを設定します。

Dify画面の右上アイコンから`設定`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/48000a89-1c54-469e-90ac-c5aa796f0dd0.png)

<br>

モデルプロバイダーから`Azure OpenAI`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/22d47388-4126-456c-a901-bcc318df59f7.png)

<br>

`インストール`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7c1a66f6-6895-49e0-a31f-384887a13de7.png)

<br>

`モデルを追加`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/5fcf2bdc-1845-4d33-ad4a-fda6ee69c212.png)

<br>

モデル情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/b039d591-7300-4ac3-b1b5-e958a25a2ddf.png)


:::note info
モデル情報はAzure AI Foundaryのデプロイ画面から確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/341fa4f5-860d-4623-8bc2-b9d22b1b9793.png)
:::

<br>

`システムモデル設定`から`システム推論モデル`を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/19a5c3c3-d2fd-42cc-86e8-1b4bf8036951.png)



# 7.Difyのチャット応答確認
動作確認を行います。

Difyのスタジオ画面にて`最初から作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/9dc7b24b-5c21-405d-b613-571232e0e2c3.png)

<br>

チャットボットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ca7708bb-2f5b-4cb6-8e34-6623e3200cbe.png)

<br>

右上で設定したAOAIが有効化されており、そのモデル経由でチャット応答が返ってくることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/12c8abc9-6909-4674-9d6a-e28ba4ff73b2.png)











# 参考

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions#model-summary-table-and-region-availability

https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/docker-compose