📌

Dify オンプレミス版に Amazon Bedrock/Nova Cross-Region 推論を組み込む方法(多分クラウド版も同じ)

2025/04/02に公開

最近Difyに大きい可能性を感じている今日この頃です。気の合う仲間たちと名古屋や福岡でこんなイベントをやる予定です。

https://jawsug-nagoya.connpass.com/event/348603/
https://serverless.connpass.com/event/348712/
リレー形式でAWS→Dify→TiDB→Postman→LINEと講師が入れ替わり一つの環境を作り上げる駅伝形式のハンズオンです。

この記事ではタイトルの通り、Difyパートの手順ですが、それ単独でも成立するように作っています。
RAGの構築方法などが知りたい方は以下の記事を参考にしてください。
https://zenn.dev/kameoncloud/articles/41df5e7efbfb86
https://zenn.dev/kameoncloud/articles/7835a7f5c894ba
https://zenn.dev/kameoncloud/articles/eb7ad91024941c

RAG と オンプレミスベクトルストア

Difyオンプレミス版を使うことで、RAGにおけるベクトル検索データベースに様々なデータソースを利用可能です。実はこれは意外と需要が高いと思っています。そもそもRAGとはインターネットに出せないものを生成AIが取り扱えるようにする技術です。Difyはクラウド版でももちろんRAGを構築可能ですが、例えばサポートチームが持つお客様とのメールのやり取りや大量の個人情報など、クラウドサービスに出したくない情報もあるのではないかと思います。Difyクラウド版ではベクトルストアは抽象化されますが、オンプレミス版を使うことで管理を独立させ、独自のセキュリティを施したデータベースを使うことが可能になります。

さっそくやってみる

この記事では、Dify オンプレミス版をEC2で起動し、Bedrock/Novaでチャットができるまで、です。

0.環境構築

まずはVPC/Public SubnetにEC2をインストールしインターネット経由でアクセスできるようにします。
手順は割愛しますが、デフォルトVPCに起動すればOKです。(特殊環境じゃない限りデフォルトVPCのサブネットはすべてPublicです)

t2.medium 以上、EBSは20GBを指定しておきます。OSはAmazon Linux 2023を使います。

SecurityGroupのインバウンドは0.0.0.0/0 から22,80,443を許可します。
リージョンはオレゴンを使います 後ほど解説しますが、Dify オンプレミス版が現在Novaのapac cross-region推論に対応していないためです。

1. Docker関連インストール

EC2が起動したらまずはDocker関連コンポーネントをインストールします。Difyオンプレミス版はDockerイメージが提供され起動もとても簡単です。

sudo dnf install git -y
sudo dnf install docker -y
sudo systemctl start docker
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2. Dify オンプレミス版のインストールと起動

git clone https://github.com/langgenius/dify.git
cd dify/docker
sudo docker-compose up -d

起動が完了したらsudo docker psで起動しているコンテナ一覧が表示されれば完了です。コンテナの数はバージョンで異なるようですのであまり気にしなくて大丈夫です。

CONTAINER ID   IMAGE                                       COMMAND                  CREATED          STATUS                    PORTS                                                                      NAMES
dd338feff96d   nginx:latest                                "sh -c 'cp /docker-e…"   56 seconds ago   Up 51 seconds             0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   docker-nginx-1
686a393af33a   langgenius/dify-plugin-daemon:0.0.6-local   "/bin/bash -c /app/e…"   56 seconds ago   Up 49 seconds             0.0.0.0:5003->5003/tcp, :::5003->5003/tcp                                  docker-plugin_daemon-1
d1405d5d029c   langgenius/dify-api:1.1.3                   "/bin/bash /entrypoi…"   56 seconds ago   Up 52 seconds             5001/tcp                                                                   docker-api-1
5ab2b7c17040   langgenius/dify-api:1.1.3                   "/bin/bash /entrypoi…"   56 seconds ago   Up 53 seconds             5001/tcp                                                                   docker-worker-1
6c0773be68f5   redis:6-alpine                              "docker-entrypoint.s…"   58 seconds ago   Up 55 seconds (healthy)   6379/tcp                                                                   docker-redis-1
788056f4a660   langgenius/dify-web:1.1.3                   "/bin/sh ./entrypoin…"   58 seconds ago   Up 55 seconds             3000/tcp                                                                   docker-web-1
eb784e6d0684   ubuntu/squid:latest                         "sh -c 'cp /docker-e…"   58 seconds ago   Up 55 seconds             3128/tcp                                                                   docker-ssrf_proxy-1
14d0a7a520de   langgenius/dify-sandbox:0.2.11              "/main"                  58 seconds ago   Up 55 seconds (healthy)                                                                              docker-sandbox-1
8c7b15e3735f   semitechnologies/weaviate:1.19.0            "/bin/weaviate --hos…"   58 seconds ago   Up 54 seconds                                                                                        docker-weaviate-1
ba3a177dc365   postgres:15-alpine                          "docker-entrypoint.s…"   58 seconds ago   Up 54 seconds (healthy)   5432/tcp                                                                   docker-db-1

3. Dify へログインと初期化

EC2のPublicIPにアクセスを行い、初期のアカウント登録を行います。

以下の画面が出ればログイン完了です。

4. Amazon Bedrock へ Amazon Nova Liteの組み込み

オレゴンンですので気を付けて下さい
Bedrockマネージメントコンソール左ペインからモデルアクセスをクリックします。

モデルアクセスを変更をクリックします。

Nova Liteをクリックします。どうも一度有効化するとこの画面からは外せないようなので、私のスクショは少し異なっていますが気にせずクリック!して次へ送信を押します。

NovaはAmazon純正モデルなので一瞬で利用可能となるはずです。

5. Amazon Nova Cross-Region推論 プロファイルIDの入手

DifyからAmazon NovaをBedrock経由で呼び出す場合、Cross-Region推論が必須です。これはおそらくDifyクラウド版自体もAWS上で動作しており別リージョンからの呼び出しが想定されるので、そういう仕様となっているようです。

ちなみにDifyクラウド版はAWS+TiDB+Cloudflareで構成されています。まぁ、私が好きになるのも当たり前といえば当たり前かもしれません。

ではBedrockマネージメントコンソールからCross-region Inferenceをクリックします。

以下のInference profile IDをコピーしておきます。

(全員同じ値になるのですが一応、Cross-region Inferenceへの理解を深めるために一応)

6.IAMユーザーの作成

Bedrockに組み込むIAMのクレデンシャルを作成します。IAMユーザーの作成自体はこの手順からは割愛しますが、以下のポリシーをアタッチしておきます。

セキュリティ認証情報タブからアクセスキーを作成してメモっておきます。

これでAWS側の準備が完了です。

7.Difyでモデルプロバイダーの設定(Bedrock組み込み)

次にDifyにAWS環境を組み込みます。プロファイルから設定をクリックします。

モデルプロバイダーをクリックします。

Bedrockを見つけてインストールをクリックします。


セットアップをクリックします。

IAMクレデンシャルを入力したあと以下の値を入力します。

AWS Region:Oregon
Bedrock Endpoint URL:bedrock.us-west-2.amazonaws.com
Available Model Name:us.amazon.nova-lite-v1:0

保存をクリックします。
緑色になればOKです!

8.ChatBotの起動

いよいよテストです!
スタジオチャットボット最初から作成をクリックします。

チャットボットに適当な名前を入れて作成します。

起動したら正しいモデルを選択します。
以下のモデルだと動作しません。(Cross-region Inference用ではないため)

以下が正しいモデルです。

情報が古いけどちゃんと動いています!!!

Discussion