13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【簡単】Amazon S3を利用して、Difyでスケーラブルなストレージを実現する

Last updated at Posted at 2024-10-05

はじめに

お疲れ様です。矢儀 @yuki_ink です。

この記事では、Difyのストレージ領域としてAmazon S3を利用する方法についてご紹介します。

S3を利用したいと思った背景の話になりますが、先日EC2でDifyを構築しました。

EC2のストレージ領域はEBS。
RAG目的でサイズが大きなドキュメントをアップロードすると、ストレージの空き容量がゴリゴリ削られていきます。

EBSは拡張も面倒だし、お値段もそれなりだし、、
あ~~~ S3使いたい~~~!!!

ということで、以下の対応を行いました。

前提

以下の記事で構築した環境で作業を行います。
※Difyの初期構築の手順は以下の記事を参照してください。

EC2(RHEL9)での操作を想定しますが、ローカルPC / Windows など異なる環境でも、対応手順の大きな流れは変わりません。
DifyでS3を使いたいという方には、本記事は何かの参考になると思います。

やったこと

  1. S3バケットの作成
  2. IAMユーザ(アクセスキー)の作成
  3. Difyが稼働するサーバでの環境変数の設定

1. S3バケットの作成

Dify用にS3バケットを用意します。
今回はすべてデフォルト値で作成しました。
自環境のセキュリティ要件などに従って設定してください。
image.png

EC2-S3間の通信をVPCエンドポイント経由にしたい!という方は、VPCエンドポイントを作っておきましょう。
※Gatewayタイプの場合、ルートテーブルの設定もお忘れなく。
image.png

2. IAMユーザ(アクセスキー)の作成

DifyからS3バケットにアクセスするためのIAMユーザを作成し、アクセスキーとシークレットアクセスキーを取得します。
アクセスキーの作成方法は以下の記事を参考にしてください。

IAMポリシーについては、今回は AmazonS3FullAccess をアタッチしました。
自環境のセキュリティ要件などに従って設定してください。
また、S3を作成する際にKMSの暗号化を有効化した場合、KMSキーの利用に必要な権限もあわせて付与します。
image.png

当初、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 を利用します。
image.png

問題なくナレッジを作成することができました。
image.png

簡単なRAGワークフローでテストしてみます。
image.png
大丈夫そう!!

S3バケットを確認すると、upload_files/ というフォルダが作成されており、配下にそれらしきファイルが格納されていました。
image.png

終わりに

以上、DifyとS3を連携させ、スケーラブルかつ安価なストレージを利用できるようになりました。
これでDifyに大きめのドキュメントをアップロードするときの罪悪感が軽くなりますw

Difyに関しては、AWS公式からもブログが出るほどAWSとの相性もよく、yamlファイルをいじらなくてもある程度のことはできそうです。
今後もDifyとAWSサービスの連携について、色々検証できたらと思います。

最後までお目通しいただき、ありがとうございました。

13
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?