DifyをEC2上に構築して、IAMロールでBedrockを呼び出す

:::note

2024/6/23更新

DifyがIAMロールに対応しましたので、更新版の投稿を行いました。

[DifyをEC2上に構築してBedrockと接続する手順（IAMロール対応版）
](https://qiita.com/moritalous/items/ecc21c1a5a58f8f0fa9c)

LiteLLMを使用する構成は参考になると思いますので、本投稿もぜひ御覧ください。
:::

---

話題のDifyをEC2上に構築してみました。Amazon Linux 2023（t3.medium）で試しました。

## 環境準備

### Gitインストール

```bash
sudo dnf install -y git
```

### Dockerインストール

```bash
sudo dnf install -y docker

sudo usermod -aG docker $USER
```

一度ログアウトして再度ログイン

```bash
sudo systemctl start docker
docker version
```
```
Client:
 Version:           25.0.3
 API version:       1.44
 Go version:        go1.20.12
 Git commit:        4debf41
 Built:             Mon Feb 12 00:00:00 2024
 OS/Arch:           linux/amd64
 Context:           default

Server:
 Engine:
  Version:          25.0.3
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.20.12
  Git commit:       f417435
  Built:            Mon Feb 12 00:00:00 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.11
  GitCommit:        64b8a811b07ba6288238eefc14d898ee0b5b99ba
 runc:
  Version:          1.1.11
  GitCommit:        4bccb38cc9cf198d52bebf2b3a90cd14e7af8c06
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

### Docker Composeインストール

```bash
mkdir $HOME/.docker
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins

curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```

```console
docker compose version
```
```
Docker Compose version v2.27.0
```

## 構築

docker-composeが用意されてます。

```bash
git clone https://github.com/langgenius/dify.git
cd dify/docker
```

```bash
docker compose up
```

コンテナイメージをPULLしたあとで起動。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/00d52d9e-6bff-3f75-3eef-57813e031829.png)

簡単ですね！

## 使ってみる

ログインしてみましょう。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/b069e393-0ef7-bb6b-92e2-fb91ba119ca7.png)

Bedrockを設定します。右上のメニューから`設定`をクリックします。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/2337fa7d-4fd7-9b09-7d57-d8b996c3ac14.png)

`モデルプロバイダー`を選択すると、`Bedrock`がいます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/9827d833-31ff-eb53-eced-ff7b361dda11.png)

しかし、この画面、`アクセスキー`と`シークレットアクセスキー`が必須入力です。

![54.152.11.196_install(1280x720) (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/041b185c-bd7b-3e44-54ef-c5dfaec4a594.png)

せっかくEC2上で起動しているので、 **権限管理はIAMロールでしたい** 

2024/5/7時点で、Issueが上がっていますが、まだOpen状態です。

https://github.com/langgenius/dify/issues/3471


ということで、無理やりIAMロールでBedrockを呼び出す形式に変更します。

## 追加するもの

以前こちらで紹介した`LiteLLM`を使います。

https://qiita.com/moritalous/items/005a5a2fa3783ba5df54

### 手順

一度、`Docker Compose`を停止します。（`trl + C`）

まず、LiteLLMの設定ファイルを作成します。

```dify/docker/litellm/config.yaml
model_list:
  - model_name: bedrock/claude-3-haiku
    litellm_params:
      model: bedrock/anthropic.claude-3-haiku-20240307-v1:0
```

つづいて、`docker-compose.yaml`にLiteLLMを追加します。末尾に以下の記述を追加します。


```yaml:dify/docker/docker-compose.yaml
  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    volumes:
      - ./litellm/config.yaml:/app/config.yaml
    environment:
      AWS_REGION: us-east-1
    expose:
      - 4000
    command: [ "--config", "/app/config.yaml" ]
```

以上です。

```shell
docker compose up
```

モデルプロバイダーの画面で`OpenAI-API-compatible`を選択します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e5be2a61-51f5-0925-399a-ff7550dbc9dd.png)

以下の値で設定します。

| 項目 | 値 |
| --- | --- |
| Model Name | bedrock/claude-3-haiku |
| API Key | sk-********** <br />※必須項目ではないですが、入力が必要です |
| API endpoint URL | http://litellm:4000 |

これでめでたく、**アクセスキーとシークレットキー無しでBedrockが呼び出せます**

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/693ad3dd-2854-5e3e-4e6e-94aac0f03622.png)

こういう用途にもLiteLLMいいですね！