たねやつの木

Photographs, Keyboards and Programming

【Dockerを知る:第2回】 PythonとFastAPIで簡単なWeb APIを作成する

こんにちは、たねやつです。

Docker環境の準備が整ったので、次はその上で動かすアプリケーションを作成していきます。 このロードマップでは、AI/MLモデルのサービング(推論結果を返す口)としてAPIサーバーを構築することが一つのゴールになります。そこで今回は、PythonのWebフレームワークであるFastAPIを使って、非常にシンプルなAPIを実装してみます。

前の記事

www.taneyats.com

この記事でできること

  • Pythonの仮想環境の重要性を理解し、作成できる。
  • FastAPIとUvicornをインストールできる。
  • "Hello, World!"を返すだけの簡単なAPIを作成し、ローカルで実行できる。

事前に必要なもの

  • 前回の記事で構築したDocker (WSL2) 環境
  • Python 3.8以上がインストールされていること
  • VS Code

なぜFastAPIなのか?

PythonのWebフレームワークには、Flask、Djangoなど多くの選択肢があります。その中でなぜFastAPIを選ぶのか、簡単に理由を説明します。

  • 高速: その名の通り、非常に高速に動作します。これは、StarletteとPydanticというライブラリの上に構築されているためです。
  • 学習の容易さ: 公式ドキュメントが非常に優れており、Pythonの型ヒントをベースにしているため、直感的で書きやすいです。
  • 自動ドキュメント生成: これが最大の魅力の一つです。コードを書くだけで、Swagger UI (OpenAPI) とReDocの2種類のAPIドキュメントが自動で生成されます。これにより、APIのテストが非常に簡単になります。
  • モダンな機能: 非同期処理(async/await)に標準で対応しており、現代的なWeb API開発の要求に応えられます。

これらの特徴から、特にMLモデルのサービングAPIのような小〜中規模のAPIを効率的に開発するのに非常に適しています。

開発環境の準備

プロジェクトディレクトリの作成

まず、作業用のディレクトリを作成しましょう。WSL2のターミナル(Debianなど)を開いて作業します。調べ物をしていて気づいたのですが、WSL2上でcode .を実行することでWindows上のVSCodeをそのディレクトリで開けるんですね👀

# ホームディレクトリに移動
cd ~
# プロジェクト用のディレクトリを作成
mkdir fastapi-handson
cd fastapi-handson
# VS Codeを起動
code .

Python仮想環境の作成

Pythonで開発を行う際は、プロジェクトごとにパッケージを管理するために仮想環境を作成するのがベストプラクティスです。これにより、「プロジェクトAではライブラリのバージョン1が必要なのに、プロジェクトBではバージョン2が必要」といった依存関係の衝突を防ぐことができます。

# venvモジュールを使って、.venvという名前の仮想環境を作成
python3 -m venv .venv
# 仮想環境を有効化
source .venv/bin/activate

仮想環境を有効化すると、ターミナルのプロンプトの先頭に(.venv)のように表示されます。これで、pipでインストールされるライブラリはこの仮想環境内にのみ保存されます。

FastAPIとUvicornのインストール

次に、FastAPIと、それを動かすためのASGIサーバーであるUvicornをインストールします。

pip install "fastapi[all]"

[all]を付けると、FastAPI本体に加えて、サーバー(Uvicorn)、テンプレート(Jinja2)など、Webアプリケーション開発でよく使われるライブラリが一括でインストールされるので便利です。

"Hello, World" APIの実装

いよいよコーディングです。main.pyという名前のファイルを新規作成し、以下のコードを記述してください。

from fastapi import FastAPI

# FastAPIインスタンスを作成
app = FastAPI()

# ルートエンドポイント ("/") へのGETリクエストを処理する関数を定義
@app.get("/")
def read_root():
    return {"message": "Hello, World"}

コードはたったこれだけです!

  • @app.get("/")の部分はデコレータと呼ばれ、直後のread_root関数が、HTTPのGETメソッドで/というパスにリクエストが来た時に実行される処理であることを示しています。
  • 関数はPythonの辞書を返していますが、FastAPIがこれを自動的にJSON形式に変換してレスポンスしてくれます。

APIの実行と確認

では、作成したAPIを動かしてみましょう。ターミナルで以下のコマンドを実行します。

uvicorn main:app --reload
  • main: main.pyファイル(.pyは不要)
  • app: main.pyの中でapp = FastAPI()として作成したインスタンス
  • --reload: コードが変更されたときにサーバーを自動で再起動してくれる開発時に非常に便利なオプション

実行すると、http://127.0.0.1:8000でサーバーが起動します。

ブラウザで確認

Webブラウザで http://127.0.0.1:8000 にアクセスしてみてください。 {"message":"Hello, World"} と表示されれば成功です!

自動生成ドキュメントの確認

次に、FastAPIの真骨頂である自動ドキュメントを確認します。 ブラウザで http://127.0.0.1:8000/docs にアクセスしてください。

すると、Swagger UIと呼ばれる高機能なAPIドキュメントが表示されます。ここでは、各エンドポイントの情報を確認したり、実際に「Try it out」ボタンからAPIを叩いてテストしたりすることができます。

最後に

お疲れ様でした!今回はFastAPIを使って、非常に簡単にWeb APIを立ち上げることができました。 特に、Swagger UIが自動で生成される便利さを体感いただけたのではないでしょうか。 次回は、このシンプルなAPIアプリケーションを、いよいよDockerコンテナの中で動かしていきます。

次の記事

www.taneyats.com