0
0

LambdaとAPI Gatewayを用いて, S3にpdfファイルをアップロード& BedRock ナレッジベースを同期

Posted at

LambdとAPI Gatewayを用いて、S3にファイルをアップロードし、Amazon BedRockのナレッジベースの同期を行ったので、備忘録としてまとめます。クライアントがファイルをアップロードして、それを基にRAGできるようになります。

ナレッジベースの作成

  1. S3 > バケットを作成

  2. AmazonBedRock > ナレッジベース > ナレッジベースを作成

  3. Choose data sourceでAmazon S3を選択
    image.png

  4. 「s3を参照」から先ほど作成したS3をデータソースとして選択
    image.png

    68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333837393337342f62346430366363392d383238302d616163372d396661622d3831663633343236643462302e706e.png

  5. 適当な埋め込みモデルとベクトル次元を選択
    image.png

  6. ナレッジベースを作成
    ナレッジベースに戻って、作成できたことをチェック

Lambdaを作成

  1. Lambda > 関数作成
    • 適当な関数名
    • ランタイム:Python 3.8
    • 実行ロール:新しいロール作成
      image.png
  2. ロールが自動で作成されるの、権限を付与します

ロールに権限を付与

  1. IAM > ロール > 先ほど作成したロールを選択
  2. 許可を追加 > ポリシーをアタッチ
  3. AmazonBedrockFullAccessとAmazonS3FullAccessを付与したロールを作成
    image.png
    image.png

API Gatewayを作成

  1. Lambda > 関数 > 作成した関数
  2. トリガーを追加
  3. トリガー設定
    • APIタイプ:REST API
    • セキュリティ:開く
    • バイナリメディアタイプ:multipart/formd-data
      image.png

API Gatewayを作成

  1. API Gateway > API > APIを作成
  2. REST APIを選択
  3. 任意のAPI名を入力
  4. APIを作成
  5. メソッドを作成
    • メソッドタイプ:POST
    • Lmabda関数:作成したLambda関数
  6. メソッドを作成

コードを編集

  1. Lambda > 関数 > 作成した関数
  2. コードは以下のものを使用します
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の設定

    1. API Gateway > API >作成したAPI
  1. APIの設定
    image.png

  2. バイナリメディアタイプを管理からmultipart/form-dataを追加
    image.png
    このままだとCORSエラーになるのでCORSの設定をします

  3. CORSを有効にする

  4. Access-Control-Allow-MethodsでPOSTを選択
    image.png

  5. 保存

  6. リソースからOPTIONを選択

  7. 統合レスポンスを編集

  8. マッピングテンプレート

    • コンテンツタイプ:multipart/form-data
    • テンプレートを作成からメソッドリクエストのパススルーを選択
      image.png
  9. 保存

  10. メソッドレスポンス

    • レスポンス本文:multipart/formdata

    image.png

  11. 保存

  12. リソースからPOSTを選択

  13. 同様に同号レスポンスを編集からmultipart/formを追加

  14. 保存したらAPIをデプロイ

あとがき

CORSのエラーに手を焼きました。

参考サイト

0
0
0

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
0
0