NoSQLデータベースを使用して高速APIアプリケーションを設定する方法

はじめに

Pythonアプリケーション開発の際に、FastAPIは高性能のソリューションを構築するための最も良い選択肢である。それは速さ、簡潔さ、非同期プログラミングのサポートを提供しており、 modern、スケーラブルなアプリケーションの開発に理想的です。
このチュートリアルでは、NoSQLデータベースと一緒にFastAPIアプリケーションを設定する手順を説明します。データの保存と管理において、NoSQLデータベースは柔軟性とスケール性を提供しており、多样かつ複雑なデータ構造を処理する必要があるアプリケーションに最適です。

前提条件

開始する前に、以下が必要です。

  • Ubuntuを実行しているサーバーと、sudo権限を持つ非rootユーザー。これを設定する方法については、このリストからお選びくださいし、初期サーバー設定ガイドに従ってください。サポートされているバージョンのUbuntuで作業してください。

  • Linuxのコマンドラインを熟悉していること。コマンドラインの入門または再び学ぶために、このガイドをLinux command line primerに訪れることができます。

  • Ubuntuのターミナルでsudo apt-get updateを実行して、搭載されているリポジトリから提供されるソフトウェアの最新のバージョンとセキュリティ更新を確認します。

これらの指示は、Ubuntuの最新版であるUbuntu 24.04、Ubuntu 22.04、およびUbuntu 20.04に適用されます。Ubuntu 18.04または以下のバージョンを使用している場合は、Ubuntuがこれらのバージョンのサポートをもっていないため、最新のバージョンにアップグレードすることを推奨します。このガイドのコレクションは、Ubuntuのバージョンアップに役立つでしょう。

手順1 – マシン上にPython環境を設定する

このチュートリアルでは、python3パッケージを使用してコマンドを実行します。最新のUbuntuバージョンではPython 3のインストールが行われていますので、そのインストールを確認するには以下のコマンドを実行してください:

python3 --version

このコマンドがエラーを返す場合は、以下のようにパッケージをインストールし直すことができます:

sudo apt-get install python3

次に、Pythonパッケージとその依存関係を安全にインストールするために、pipをインストールする必要があります。

sudo apt-get install python3-pip

手順2 – 仮想環境を作成する

Ubuntu 24.04以下を使用している場合、仮想環境を作成する必要はないが、プロジェクトの依存性を隔離するのが良い慣習です。

Python 3.11およびpip 22.3以降では、新しいPEP 668が存在し、Pythonの基本環境を「外部管理」としてマークすることを规定しています。これ意味すると、仮想環境の中で作業しない限り、pipを使用してパッケージを正常にインストールすることができなくなります。

このステップで、プロジェクトのための仮想環境を作成します。これにより、プロジェクトの依存関係を隔離し、異なるパッケージのバージョン間の潜在的な衝突を避けることができます。ターミナルで以下のコマンドを実行してください。

sudo apt-get install python3-venv

これは、仮想環境を作成するために必要なvenvパッケージをインストールします。

python3 -m venv fastapi-env

このコマンドは、作業ディレクトリの中にfastapi-envという仮想環境を作成します。この環境で作業するためには、それを有効にする必要があります。

source fastapi-env/bin/activate

このコマンドの成功実行後、ターミナルのプレFIXに以下のような表示が表示されます。

(fastapi-env) user@machine:~$

これで、この仮想環境内で必要な依存関係をインストールすることができます。

手順3 – 必要なライブラリやパッケージのインストール

この手順で、このチュートリアルを正常に進めるために必要ないくつかのパッケージとライブラリをインストールします。

fastapiをインストールして、FastAPIアプリケーションの構築に必要なものとして、uvicornをインストールして、FastAPIアプリケーションの実行に必要なものとします。

pip install fastapi uvicorn

このチュートリアルでは、MongoDBをNoSQLデータベースとして使用します。FastAPI内でMongoDBとのやり取りを行うためには、asyncio Python driver for MongoDBのmotorをインストールする必要があります。

pip install motor

手順4 – Ubuntu上でMongoDBをインストールして設定する

Ubuntuマシン上でMongoDBをインストールするには、以下のコマンドをターミナルで実行します。

wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

実行に成功すると、これはecho引数を返します。次に、以下のようにしてください。

sudo apt-get update

これはMongoDBの設定後、最新の更新を入手することを保証します。

次に、MongoDBのインストールに必要なopenssl依存をシステムにインストールする必要があります。

wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb

実行後、サービスの再起動を要求されます。再起動後、以下のコマンドを使用してMongoDBをインストールします。

sudo apt-get install -y mongodb

MongoDBサービスを開始し、有効化します。

sudo systemctl start mongod
sudo systemctl enable mongod

以下のコマンドを実行して、MongoDBサービスの状態を確認し、接続をテストします。

sudo systemctl status mongod
mongo --eval 'db.runCommand({connectionStatus: 1})'

ステップ 5 – FastAPIアプリケーションを作成する

次のステップは、FastAPIアプリケーションを作成することです。あなたの作業ディレクトリーにdatabase.pyファイルを作成してください。

nano database.py

これは空のテキスト编辑器を開きます。データベース接続のロジックをここに記述してください。

database.py
from motor.motor_asyncio import AsyncIOMotorClient

MONGO_DETAILS = "mongodb://localhost:27017"

client = AsyncIOMotorClient(MONGO_DETAILS)

db = client.mydatabase

collection = db.mycollection

mydatabasemycollectionにデータが存在すると仮定して、main.pyを作成してください。このFastAPIアプリで、database.pyを使用してデータベース接続を Establishし、AI予測のルートを定義します。これらのルートを使用して、入力を検証します。

nano main.py

テキスト编辑器で以下のロジックを記述します。

main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from sklearn.linear_model import LinearRegression
import numpy as np
from database import collection

app = FastAPI()

# 簡単なデータ集とモデル
x = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])

model = LinearRegressions()
model.fit(x, y)

# 入力検証用のPydanticモデルを定義する
class InputData(BaseModel):
  feature: float

# 入力特徴に基づいて出力を予測するルート_1
@app.post("/predict/")
async def predict(input_data: InputData):
  try:
    prediction = model.predict([[input_data.feature]])
    return {"prediction": prediction[0]}
  except Exception as ex:
    raise HTTPException(status_code=400, detail=str(ex))

# MongoDBとのやり取りを行うルート_2
@app.get("/items/")
async def get_item():
  items = []
  async for item in collection.find():
    items.append(item)
  return items

# MongoDBに新しいアイテムを追加するルート_3
@app.post("/items/")
async def create_item(item: dict):
  new_item = await collection.insert_one(item)
  created_item = await collection.fine_one({"_id": new_item.inserted_id})
  return created_item

このアプリケーションが行うことの詳細を以下に解説します。

  • sklearnの線形回帰モデル: このモデルは、単一の入力特徴に基づいて出力を予測します。
  • Pydanticモデルからの入力データ: これは予測エンドポイントに期待される入力構造を定義しています。この場合、それはfloatです。
  • MongoDBルーティング: ルーティング/items/POST /items/を使用することで、MongoDBコレクションにアイテムを取得および插入することができます。

ステップ 6 – FastAPIアプリケーションを実行

このアプリケーションを成功して実行するには、アプリケーションに使用されているライブラリやパッケージをインストールする必要があります。

pip install pydantic scikit-learn numpy

現在、このアプリケーションを実行するために以下のコマンドを使用します。

uvicorn main:app --reload

このコマンドの出力は以下の通りになります。

Output
INFO: Will watch for changes in these directories: ['/path/to/your/project'] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [XXXXX] using statreload INFO: Started server process [XXXXX] INFO: Waiting for application startup. INFO: Application startup complete.

FastAPIはSwagger UIを使用して自動的にインタラクティブなAPIドキュメントを生成しました。http://127.0.0.1:8000/docsに移動してアクセスすることができます。

ツールを使用して、curlやPostmanなど、入力に基づいて値を予測するエンドポイントに呼び出します。

curl -X POST "http://127.0.0.1:8000/predict/" -H "Content-type: application/json" -d '{"feature": 3}'

ステップ 7 [オプション] – Docker Composeを使用してアプリケーションを実行

アプリケーションをdocker-composeを使用して実行することができます。アプリケーションのコンテナ化は、デプロイメントプロセスをスムーズ化し、アプリケーションのデプロイ、スケール、および保守の手間を省くことができます。Dockerfileでアプリケーションを定義するには、Docker Composeを使用してFastAPIアプリケーションをデプロイにある手順に従います。

結論

このチュートリアルで、MongoDBを使用してFastAPIアプリケーションを設定する方法、入力予測の保存と取り出しを行うことができるAIベースの簡単なアプリケーションを作成する方法を学びました。

FastAPIとNoSQLデータベースの組み合わせは、AI駆動のアプリケーションの構築とスケールアウトに強力且つ柔軟な環境を提供します。

Source:
https://www.digitalocean.com/community/tutorials/set-up-fastapi-app-with-nosql-db