FastAPIの開発環境をDockerで構築してみた

FastAPI

あまりPythonを触ったことのない私ですが、
バックエンドの実務経験を積みたいがために、見切り発車でFastAPIを使ったアプリケーション実装の案件に応募したら、めでたく採用されまして、、
試行錯誤しながらなんとか納品までこぎつけました。

その試行錯誤は結構大変でしたが、とてもいい経験になったので、ブログに書き留めておきたいと思います。

FastAPIとは

PythonでAPIを実装するためのWebフレームワークです。

FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production

最近割と流行っているフレームワークなのではないでしょうか?

開発環境を構築してみる

早速、FastAPIを触っていきましょう。
まずは最小構成で、Hello Worldを返すAPIを実装してみたいと思います。
とはいえ、先を見据えていきなりDockerを使用した形で構築してみたいと思います。

ディレクトリ構成

まず最初のディレクトリ構成です

project_root
├── app
│   └── src
│       └── main.py
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

各ファイルの役割について簡単に触れておきます。

  • Dockerfile: 実行環境となるPythonのimageの内容を記述したファイル
  • docker-compose.yml: コンテナの構成を記述したファイル
  • requirements.txt: Pythonのコンテナ内で pip install するライブラリを記述したファイル
  • app/src/main.py: APIサーバーのメインファイル

Docker側の準備

まずはプロジェクトルートに Dockerfile を作成し、以下の内容を記述します。

FROM python:3.11.1

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

COPY ./app/ .

次に、 docker-compose.yml を作成し、以下の内容を記述します。

version: "3.0"

services:
  api:
    container_name: "api"
    volumes:
      - ./app:/app
    build: .
    ports:
      - 8080:8080
    command: bash -c "cd ./src && uvicorn main:app --reload --host 0.0.0.0 --port 8080"

やっていることの内容は、Dockerの基礎的な話なので、本記事では割愛します。

最後に、 requirements.txt を作成して、以下の内容を記述します。

fastapi
uvicorn

これらはPythonのimageを構築するときに pip install されるライブラリとなります。

mainファイル

app/src/main.py を作成し、以下の内容を記述してください。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def hello_world():
    return {"message": "Hello World"}

この記述がFastAPIにおける最小の形となります。

開発サーバー起動

これで準備が整ったので、早速サーバーを起動してみましょう。
プロジェクトルートにて、 docker-compose コマンドで起動することができます。

$ docker-compose up
Starting api ... done
Attaching to api
api    | INFO:     Will watch for changes in these directories: ['/app/src']
api    | INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
api    | INFO:     Started reloader process [1] using StatReload
api    | INFO:     Started server process [8]
api    | INFO:     Waiting for application startup.
api    | INFO:     Application startup complete.

Application startup complete. と表示されれば、無事サーバーが起動している状態となります。
この状態で、Getリクエストを送ってみましょう。

$ curl http://localhost:8080
{"message":"Hello World"}

無事APIサーバーが応答しました。

FastAPIの嬉しい機能

ここで、開発が楽になるFastAPIの嬉しい機能について触れておきたいと思います。

Swagger UI

なんといっても、これがすごく良い!
サーバーを立ち上げただけで、Swagger UIを提供してくれます。
上記の開発サーバーを起動した状態で、ブラウザにて http://localhost:8080/docs にアクセスしてみてください。
そうすると、さっき実装した Hello Worldを返すAPIをテストするための画面が現れます。

一発試してみると、、、

きちんと動きますね!
開発中に、ちょっとした動作確認を行いたいときなんかにとっても重宝します。
しかも、 openapi.json を自動で生成してくれているということなので、 openapi-generator などと組み合わせると、クライアントサイドでも型安全な開発ができますね、、!
openapi-generator ついては、過去に別のフレームワークで書いたので、参考にしてみてください。

FoalTS + openapi-generatorで型安全なAPI開発
この前はFoalTSについて紹介しました。この記事では実際に開発フローを紹介していきたいと思います。基本的には公式のチュートリアルに沿っていきますが、最後の方で、「型安全」について触れたいと思います。記事執筆時点での環境です$ no...

ReDoc

http://localhost:8080/redoc にアクセスすると、ReDoc形式でのAPI仕様書を閲覧することができます。

私はあまり馴染みがないのですが、ReDocをよく使う方にとっては嬉しい機能なのではないでしょうか。

おわりに

まずはFastAPIでHello Worldをやってみました。

次回は、DB周りまで含めた環境構築について触れていきたいと思います。

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