はじめに
お疲れ様です。矢儀 @yuki_ink です。
この記事では、Difyのストレージ領域としてAmazon S3を利用する方法についてご紹介します。
S3を利用したいと思った背景の話になりますが、先日EC2でDifyを構築しました。
EC2のストレージ領域はEBS。
RAG目的でサイズが大きなドキュメントをアップロードすると、ストレージの空き容量がゴリゴリ削られていきます。
EBSは拡張も面倒だし、お値段もそれなりだし、、
あ~~~ S3使いたい~~~!!!
ということで、以下の対応を行いました。
前提
以下の記事で構築した環境で作業を行います。
※Difyの初期構築の手順は以下の記事を参照してください。
EC2(RHEL9)での操作を想定しますが、ローカルPC / Windows など異なる環境でも、対応手順の大きな流れは変わりません。
DifyでS3を使いたいという方には、本記事は何かの参考になると思います。
やったこと
- S3バケットの作成
- IAMユーザ(アクセスキー)の作成
- Difyが稼働するサーバでの環境変数の設定
1. S3バケットの作成
Dify用にS3バケットを用意します。
今回はすべてデフォルト値で作成しました。
自環境のセキュリティ要件などに従って設定してください。
2. IAMユーザ(アクセスキー)の作成
DifyからS3バケットにアクセスするためのIAMユーザを作成し、アクセスキーとシークレットアクセスキーを取得します。
アクセスキーの作成方法は以下の記事を参考にしてください。
IAMポリシーについては、今回は AmazonS3FullAccess
をアタッチしました。
自環境のセキュリティ要件などに従って設定してください。
また、S3を作成する際にKMSの暗号化を有効化した場合、KMSキーの利用に必要な権限もあわせて付与します。
当初、IAMユーザ(アクセスキー)ではなくIAMロールで制御したいと思っていたんですが、現状のDifyの標準機能ではIAMロールは対応しておらず、アクセスキーの利用が必要となるようです。
# IAMロールでやろうとしたときに出たエラー
api-1 | botocore.exceptions.ClientError: An error occurred (AuthorizationHeaderMalformed) when calling the PutObject operation: The authorization header is malformed; a non-empty Access Key (AKID) mustbe provided in the credential.
3. Difyが稼働するサーバでの環境変数の設定
Difyが稼働するサーバに接続し、以下の環境変数を設定します。
環境変数名 | 値 |
---|---|
STORAGE_TYPE | s3 |
STORAGE_LOCAL_PATH | storage |
S3_ENDPOINT | https://s3.(リージョン名).amazonaws.com (例)https://s3.us-west-2.amazonaws.com |
S3_BUCKET_NAME | ※1. S3バケットの作成 で作成したバケットの名前(例)dify-s3-bucket |
S3_ACCESS_KEY | ※2. IAMユーザ(アクセスキー)の作成 で取得したアクセスキーの値 |
S3_SECRET_KEY | ※2. IAMユーザ(アクセスキー)の作成 で取得したシークレットアクセスキーの値 |
S3_REGION | ※S3バケットを作成したリージョン (例)us-west-2 |
各環境変数についての詳細は公式ドキュメント「環境変数の説明」をご確認ください。
Linux環境では、以下のコマンドで設定できます。
ついでに、/etc/profile
にも書いておきましょう。
export STORAGE_TYPE='s3'
export STORAGE_LOCAL_PATH='storage'
export S3_ENDPOINT='https://s3.us-west-2.amazonaws.com'
export S3_BUCKET_NAME='dify-s3-bucket'
export S3_ACCESS_KEY='xxxxxxxxxxxxx'
export S3_SECRET_KEY='yyyyyyyyyyyyyyyyyyyyyyyyyyyy'
export S3_REGION='us-west-2'
ここまで来たら、サービスを再起動します。
cd dify/docker
#-d オプションをつけて、バックグラウンドで起動
docker compose up -d
dify/docker/docker-compose.yaml
の中身を見てみると、以下のような記述があり、ホストの環境変数を利用しているのが分かります。
S3_ENDPOINT: ${S3_ENDPOINT:-}
S3_BUCKET_NAME: ${S3_BUCKET_NAME:-}
S3_ACCESS_KEY: ${S3_ACCESS_KEY:-}
S3_SECRET_KEY: ${S3_SECRET_KEY:-}
S3_REGION: ${S3_REGION:-us-east-1}
動作確認
Difyにログインし、ナレッジの作成
からドキュメントをアップロードします。
今回はQiita CLIの README
を利用します。
簡単なRAGワークフローでテストしてみます。
大丈夫そう!!
S3バケットを確認すると、upload_files/
というフォルダが作成されており、配下にそれらしきファイルが格納されていました。
終わりに
以上、DifyとS3を連携させ、スケーラブルかつ安価なストレージを利用できるようになりました。
これでDifyに大きめのドキュメントをアップロードするときの罪悪感が軽くなりますw
Difyに関しては、AWS公式からもブログが出るほどAWSとの相性もよく、yamlファイルをいじらなくてもある程度のことはできそうです。
今後もDifyとAWSサービスの連携について、色々検証できたらと思います。
最後までお目通しいただき、ありがとうございました。