Difyのナレッジベース構成ファイルをS3に移行してストレージコストを最適化する方法

記事タイトルとURLをコピーする

はじめに

こんにちは、最近は仕事の合間に一息つくタイミングで家で飼っているうさぎ様に癒してもらってます、25卒の山本です。
今回は、前回の記事で触れた「Dify」というRAG環境構成を簡単に実現可能なアプリケーションを触っていく中で、デフォルト設定でのストレージに関する制約事項に気づきましたのでその制約事項の確認と回避術について説明します!

Difyのストレージ事情(セルフホスト版)と新たな企み

前回の記事で紹介したように、DifyはEC2インスタンス上にコンテナを立てることで簡単にナレッジベース(知識ベース)の定義やRAG構成を構築することのできるアプリケーションです。

Difyのインフラ構成

EC2インスタンス上にデプロイすると言うことはアプリケーション上でナレッジベースを構築する際には、デフォルトではEC2のボリュームを使用してナレッジベースを保存することになります。
ナレッジベースは場合によってはかなり大きな容量になってしまうので、EC2インスタンス上でナレッジを保存するのであればEBSが圧迫される結果となってしまうのが見え見えなわけです。

上記のような問題を解決するため、S3バケットにナレッジベースに読み込ませるドキュメント類を保存してDifyに参照させることができないかと企みました。

ナレッジベースをS3で構築してみる

前提条件

前述の企みを実装するにあたって、DifyがすでにEC2インスタンスにデプロイされた状態であることを前提としています。
また、今回はS3にはあくまでDifyがナレッジベースを構築する際の参照フォルダとしての役割を担わせることを目的としています。
ナレッジベースを構築する際のチャンク設定(文章を小さな単位に分割する処理)や、検索時に使用する指標となるベクトル化の重み付けに関してはデフォルトの設定に従いDifyアプリケーション内にて実施します。

構築手順

1.S3バケットの作成

ナレッジベース作成時に使用するテキストファイルをアップロードするためのS3バケットを作成します。

リージョン:Difyをデプロイした EC2と同じリージョン

2.IAMロールの作成と権限設定

稼働中にEC2インスタンスに設定されているIAMロールを更新します。 具体的には、以下のようなポリシーを許可ポリシーとして追加します。

s3:ListBucket
s3:GetObject
s3:PutObject

※今回、ナレッジベース用のファイルアップロードもDifyコンソールからで行う想定なので最小権限の原則に従い必要なポリシーを追加しています。

3.Dify構成ファイルの変更

Difyには設定値を変更・保存しておくための設定ファイルなるものが存在しているので、設定ファイル内からS3に関する記述を気合いで探し出します(Ctrl + Fで「S3」を入力しただけ) すると、S3に関する設定項目が見つかったので以下のような設定値に変更します。

# The type of storage to use for storing user files.
STORAGE_TYPE=s3

# S3 Configuration
#
S3_ENDPOINT=https://s3.ap-northeast-1.amazonaws.com
S3_REGION=ap-northeast-1
S3_BUCKET_NAME=<1.で作成したバケット名>
S3_ACCESS_KEY=
S3_SECRET_KEY=
# Whether to use AWS managed IAM roles for authenticating with the S3 service.
# If set to false, the access key and secret key must be provided.
S3_USE_AWS_MANAGED_IAM=true

※今回はEC2をパブリックサブネットに配置していますが、プライベートサブネットに配置する場合はS3のエンドポイントの設定が別途必要になります。

ここでアクセスキーに関してですが、設定上、DifyはAWSのアクセスキーを設定することでS3へのアクセスを許可することができます。
しかし、セキュリティ上実運用ではアクセスキーを用いたアクセスは避けるべきです。
今回はEC2に適用したIAMロールにS3へのアクセス権限を付与することで、アクセスキーの記載を避けています。

変更が完了したら設定ファイルを保存してコンテナを再起動します。

動作確認

では、コンテナの再起動まで実施し、修正した設定ファイルの適用が完了しているハズなので実際にDifyのコンソール上でナレッジベースを構築した上でS3のバケット内がどのようになっているかを確認しましょう。

まず、Difyコンソールにアクセスしナレッジベース作成画面に遷移します。

Difyのナレッジベース構築画面

ナレッジベースの作成を行い、PDFファイルをアップロードします。 チャンク設定や検索設定が完了し、ナレッジベースの作成が完了したらS3へのアップロードの成功を確認するため、AWSのマネジメントコンソールにて該当S3バケットを確認します

S3バケットのオブジェクト

確認したところ、upload_files/という名前でオブジェクトが作成されているので中身を見てみましょう。

upload_filesオブジェクトの中身

大量の英数字の羅列となっていますが、PDFをダウンロードして確認すると私がアップロードしたPDFと一致していましたので、設定ファイルを修正することによってナレッジベースの材料のアップロード先をS3に変更できることが確認できました。

これでS3をナレッジベースの材料保管場所として扱い、EC2インスタンス上に保存するストレージコストの呪縛から解放されましたね!

終わりに

いかがでしたでしょうか。
個人的にはDifyはEC2にアプリケーションをコンテナとしてデプロイするもしくはSaasでのサービス利用となるので作成できるナレッジベースやRAG構成に制約があるのではないかと思っていました。
しかし、調査をする中で設定ファイルを閲覧したりするうちに管理柔軟なニーズに対して対応できるということがわかりました。
今回の「ナレッジベースの材料保存をS3で行う」こと以外にもAmazon Redshiftを使用してナレッジベースを構築したり、外部のデータベースと連携させてナレッジベースを構築するための設定変数もそれらしいものが発見できたので、皆さんもDifyに触れる際には是非設定ファイルに関しても目を配り、さまざまな活用方法を実践してみてください!

山本 竜也 (記事一覧)

2025年度新入社員です!AWSについてはほぼ未経験なのでたくさんアウトプットできるよう頑張ります✨