【OpenAI】AWS Amplifyを使用してChatGPTのAPIをクラウド環境にデプロイする

AWS Amplifyは、フルスタックのアプリケーション開発フレームワークであり、簡単かつ迅速にモダンなウェブアプリケーションを構築することができます。Amplifyを使用してAPIを構築し、FastAPIを使用してAPIを呼び出す方法を学ぶための方法を以下に示します。

1. Amplifyのセットアップ

Amplify CLIを使用するためには、まずローカル環境にCLIツールをインストールする必要があります。以下の手順に従って、Amplify CLIをインストールします。

Amplifyのインストール

https://github.com/aws-amplify/amplify-cli

**Windows:**

  1. PowerShellまたはコマンドプロンプトを開きます。
  2. コマンドプロンプトで以下のコマンドを実行します。
npm install -g @aws-amplify/cli

**macOS/Linux:**

  1. ターミナルを開きます。
  2. ターミナルで以下のコマンドを実行します。
sudo npm install -g @aws-amplify/cli

Amplify CLIが正常にインストールされたかどうかを確認するために、以下のコマンドを実行してバージョンを表示します。

amplify --version

インストールが成功していれば、バージョン情報が表示されます。

amplify --version

12.0.0

Amplifyプロジェクトの初期化

Amplifyプロジェクトを初期化するには、以下の手順に従ってください。

  1. コマンドプロンプトまたはターミナルを開きます。
  2. プロジェクトを作成するディレクトリに移動します。
  3. 以下のコマンドを実行します。
amplify init

初期化プロセスが始まりますので、以下の情報を入力していきます。

  •    プロジェクト名: プロジェクトの一意の名前を入力します。
  •    プロジェクトの場所: プロジェクトを作成するディレクトリのパスを入力します。
  •    デフォルトのエディタ: 使用するテキストエディタの選択肢が表示されますので、適切なエディタを選択します。
  •    AWS プロファイル: AWSのプロファイルを選択します。デフォルトのプロファイルを使用する場合は、`default`を選択します。

入力が完了すると、Amplifyプロジェクトが初期化されます。

AWSアカウントの設定

上記のコマンドを入力すると自動的にAWSアカウントの作成画面に飛びますのでAWSアカウントの設定を行います。

Amplifyを使用するには、AWSアカウントの設定が必要です。以下の手順に従ってAWSアカウントをセットアップします。

AWS Management Consoleにアクセスします。

アカウントを作成するか、既存のアカウントでログインします。

必要な場合は、アカウントの支払い方法を設定します。

AWS Management Consoleの右上隅にある「サービス」メニューから「IAM」を選択します。

「ユーザー」をクリックし、「ユーザーの追加」を選択します。

ユーザー名を入力します。

ユーザーに付与する権限を設定します。Amplifyを使用する場合は、少なくとも以下の権限が必要です。

  • Amplify全般の管理権限(「AdministratorAccess-Amplify」など)
  • インフラストラクチャの管理権限(「AmazonS3FullAccess」など)
  • APIの作成と管理権限(「AmazonAPIGatewayAdministrator」など)
  • 認証と認可の管理権限(「AmazonCognitoPowerUser」など)

上記の権限を持つポリシーを作成し、ユーザーに割り当てます。

ユーザーが作成されたらユーザー名をクリックし、アクセスキーの作成を行います。CLIからログインできるようになります。これらは後でAmplify CLIとの認証に使用するため、安全な場所に保存してください。

上記設定を行い、CLIでのQ&Aに答えると下記が表示されます。

Deployment state saved successfully.

✔ Initialized provider successfully.

✅ Initialized your environment successfully.

Your project has been successfully initialized and connected to the cloud!

これで、Amplifyのセットアップが完了しました。次は、AmplifyでAPIを作成する手順に進みましょう。

2. FastAPIでのAPIの作成

事前準備としてFAST APIでのAPIファイルを作成しておきましょう。

【fastAPI】基礎講座① installとサンプルコードの実行

【FastAPI】FastAPIを用いてchatGPTのAPIをラップする

3.AmplifyとFastAPIの連携

AmplifyとFASTAPIを連携します。

ここで行うことは、AmplifyのREST APIエンドポイントを叩く事で、FAST APIのエンドポイントにアクセス出来るようにすることです。

amplifyでapiリソースを作成する

amplify add api
cd amplify/backend/function/chatAPIFunction

必要な依存関係のインストール

pip install pipenv  

pipenv install fastapi mangum boto3 aws-lambda-powertools openai python-dotenv pydantic

pipenv install --dev uvicorn flake8
vi .env

# 以下内容を追記し、保存

OPENAI_API_KEY="sk-xxxx"

サーバー用ファンクションの作成

fastAPIを呼び出すコードをindex.pyに記入します

import os

from fastapi import FastAPI

from fastapi.middleware.cors import CORSMiddleware

from mangum import Mangum

#from aws_lambda_powertools import Logger

from pydantic import BaseModel

import uuid

import openai

from dotenv import load_dotenv





# 環境変数取得

load_dotenv()

api_key = os.getenv('OPENAI_API_KEY')

openai.api_key = api_key




## FastAPI 初期化

app = FastAPI()




# ロガー初期化

#app.logger = Logger(level="INFO", service=__name__)




# CORS設定

allow_origins = ['http://localhost:8080']

if 'ALLOW_ORIGIN' in os.environ.keys():

    allow_origins.append(os.environ['ALLOW_ORIGIN'])




app.add_middleware(

    CORSMiddleware,

    allow_origins=allow_origins,

    allow_credentials=True,

    allow_methods=["*"],

    allow_headers=["*"],

)





class ChatInput(BaseModel):

    message: str




@app.post("/chat")

async def chat_api(input: ChatInput):

    user_message = {'role': 'user', 'content': input.message}

    messages = [user_message]




    response = openai.ChatCompletion.create(

        model='gpt-3.5-turbo',

        messages=messages,

        temperature=0.0

    )

    return response['choices'][0]['message']['content']





handler = Mangum(app)

このコードはFastAPIを使用してChat APIを作成し、Amplifyと連携するためのコードです。

鍵となるのはMangumのライブラリです。これを使うことでAWSでLambdaでFAST APIを使えるようになります。

1. 必要なモジュールのインポート:
– `os`: 環境変数の取得や操作を行うためのモジュール
– `FastAPI`: FastAPIフレームワークを使用するためのモジュール
– `CORSMiddleware`: FastAPIのミドルウェアとしてCORS (Cross-Origin Resource Sharing) を設定するためのモジュール
– `Mangum`: FastAPIアプリケーションをAWS Lambda関数として実行するためのモジュール
– `BaseModel`: Pydanticを使用してデータモデルを作成するためのモジュール
– `openai`: OpenAI APIとの通信を行うためのモジュール
– `load_dotenv`: .env ファイルから環境変数を読み込むためのモジュール

2. 環境変数の取得とOpenAI APIの設定:
– `load_dotenv()`により、`.env` ファイルから環境変数を読み込みます。
– `os.getenv(‘OPENAI_API_KEY’)`により、環境変数からOpenAIのAPIキーを取得し、`openai.api_key` に設定します。

3. FastAPIアプリケーションの初期化:
– `app = FastAPI()`により、FastAPIアプリケーションを初期化します。

4. CORSの設定:
– `allow_origins`に許可するオリジンのリストを指定します。デフォルトでは`http://localhost:8080`が設定されています。
– 環境変数に`ALLOW_ORIGIN`が指定されている場合は、その値も`allow_origins`に追加します。
– `app.add_middleware()`を使用して、CORSミドルウェアをアプリケーションに追加します。

5. データモデルの定義:
– `ChatInput`クラスは、APIのリクエストボディで受け取るデータモデルを定義しています。`message`という属性があり、文字列を受け取ります。

6. `/chat`エンドポイントの作成:
– `@app.post(“/chat”)`デコレータを使用して、`/chat`エンドポイントに対するPOSTリクエストの処理を定義します。
– 受け取ったリクエストボディの`input.message`を用いて指定されたメッセージでChat APIを呼び出し、OpenAI GPT-3.5 Turboモデルを使用して応答を生成します。具体的には、以下の処理が行われます:

– `user_message`という辞書を作成し、その中に`role`と`content`の2つのキーを持つ情報を格納します。`role`には”user”、`content`には受け取ったメッセージ(`input.message`)が設定されます。
– `messages`というリストを作成し、先ほど作成した`user_message`を要素として追加します。
– OpenAIの`ChatCompletion.create()`メソッドを呼び出し、GPT-3.5 Turboモデルを使用してチャットの応答を生成します。`model`にはモデルの名前、`messages`にはチャットの履歴、`temperature`には応答の多様性を制御する温度を指定します。
– 応答の中から最初の選択肢を取得し、その中の`message`の`content`を返します。

最後に、`Mangum(app)`を使用してFastAPIアプリケーションをAWS Lambda関数として実行できるようにします。

このコードを使用すると、FastAPIを介して受け取ったメッセージに対してOpenAIのGPT-3.5 Turboモデルを使用して応答を生成するChat APIを作成することができます。

作成したAPIのAWSへのデプロイを行います

 amplify push -y

amplify status

amplify push -yコマンドを使用して、Amplifyにデプロイを行います。このコマンドはAmplify CLIを使用してAWSリソースを作成し、アプリケーションをデプロイします。-yフラグを付けることで、プロンプトでの確認をスキップし、自動的にデプロイを進めます。

デプロイが完了したら、amplify statusコマンドを使用してアプリケーションの状態とAPIのエンドポイントを確認します。このコマンドはAmplifyアプリケーションの現在の状態を表示し、デプロイされたAWSリソースやエンドポイントの情報を提供します。

Amplify CLIはバックエンドのインフラストラクチャを自動的に構築し、Amplifyアプリケーションをデプロイするための便利なツールです。pushコマンドを使用することで、指定したAWSリソースやバックエンドのコード変更を自動的にデプロイし、アプリケーションを最新の状態に保つことができます。

クライアントでテスト

クライアントからリクエストを送り実際に動作することを確認します。

import requests
import json


#url ="http://0.0.0.0:8000/chat"


url ="https://XXXX.execute-api.us-east-1.amazonaws.com/dev/chat"


data = {
"message": "AIの定義を教えて"
}

response = requests.post(url, json=data)
print(response.json())

urlは適宜置き換えてください。

クライアントから実行してメッセージが帰ってくれば成功です!!

エラー対応

エラーが出た場合は下記で対応します。

Amplifyでデプロイしたアプリケーションのログは、AWS CloudWatchで確認することができます。

以下の手順でAmplifyのログを確認できます:

  1. AWS Management Consoleにログインし、AWSサービスの一覧から「CloudWatch」を選択します。
  2. CloudWatchのメニューで「Logs」を選択します。
  3. 「Log Groups」のセクションで、ロググループの一覧が表示されます。
  4. ロググループの一覧から、Amplifyアプリケーションに関連するロググループを選択します。通常、ロググループの名前には「/aws/amplify/アプリケーション名」という形式があります。
  5. 選択したロググループには、Amplifyアプリケーションのログが含まれています。ログエントリを選択すると、ログの内容や詳細を表示することができます。

CloudWatchログは、Amplifyアプリケーションの実行ログやエラーメッセージ、デプロイのステータスなど、さまざまな情報を提供しています。特に、エラーが発生した場合やアプリケーションの動作に問題がある場合は、CloudWatchログを確認することで問題の特定やトラブルシューティングが行えます。

なお、Amplify CLIコマンドやデプロイ時にも一部のログ情報が表示される場合があります。CLIのログはコマンドライン上に表示されますが、詳細なログ情報はCloudWatchログに保存されます。

CloudWatchログの確認を通じて、Amplifyアプリケーションのログを取得し、問題の解決に役立ててください。

参考

https://blog.serverworks.co.jp/amplify-fastapi

コメント

タイトルとURLをコピーしました