LambdとAPI Gatewayを用いて、S3にファイルをアップロードし、Amazon BedRockのナレッジベースの同期を行ったので、備忘録としてまとめます。クライアントがファイルをアップロードして、それを基にRAGできるようになります。
ナレッジベースの作成
-
S3 > バケットを作成
-
AmazonBedRock > ナレッジベース > ナレッジベースを作成
-
ナレッジベースを作成
ナレッジベースに戻って、作成できたことをチェック
Lambdaを作成
ロールに権限を付与
API Gatewayを作成
API Gatewayを作成
- API Gateway > API > APIを作成
- REST APIを選択
- 任意のAPI名を入力
- APIを作成
- メソッドを作成
- メソッドタイプ:POST
- Lmabda関数:作成したLambda関数
- メソッドを作成
コードを編集
- Lambda > 関数 > 作成した関数
- コードは以下のものを使用します
import json
import boto3
import base64
import io
from datetime import datetime
import cgi
BUCKET_NAME = 'バケット名'
DIRECTORY = 'uploadedfiles/'
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket(BUCKET_NAME)
body = base64.b64decode(event['body-json'])
fp = io.BytesIO(body)
environ = {'REQUEST_METHOD': 'POST'}
headers = {
'content-type': event['params']['header']['content-type'],
'content-length': str(len(body))
}
fs = cgi.FieldStorage(fp=fp, environ=environ, headers=headers)
for f in fs.list:
print("filename=" + f.filename)
bucket.put_object(Body=f.value, Key=DIRECTORY + f.filename)
client = boto3.client('bedrock-agent')
response = client.start_ingestion_job(
dataSourceId='データソースID',
knowledgeBaseId='ナレッジベースID'
)
return {
"Access-Control-Allow-Headers": "Content-Type",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST",
"Content-Type": "multipart/form-data",
'statusCode': 200,
'body': json.dumps('アップロード完了')
}
バケット名とナレッジベース
コードにS3のバケット名とナレッジベースのデータソースID, ナレッジベースIDを入力します
APIの設定
-
- API Gateway > API >作成したAPI
-
バイナリメディアタイプを管理からmultipart/form-dataを追加
このままだとCORSエラーになるのでCORSの設定をします -
CORSを有効にする
-
保存
-
リソースからOPTIONを選択
-
統合レスポンスを編集
-
マッピングテンプレート
-
保存
-
メソッドレスポンス
- レスポンス本文:multipart/formdata
-
保存
-
リソースからPOSTを選択
-
同様に同号レスポンスを編集からmultipart/formを追加
-
保存したらAPIをデプロイ
あとがき
CORSのエラーに手を焼きました。
参考サイト