FastAPI アプリケーションのデプロイ方法は?
ホスティングプロバイダーはたくさんあるが、PythonホスティングをサポートするCommon Gateway Interface(CGI)やmod_wsgiモジュールを提供しているところはほんのわずかだ。しかし、2023年のStack Overflow Developer Surveyに参加した開発者の間では、Dockerを使ったコンテナ化がアプリケーション開発とデプロイの主導権を握っている。
FastAPI のようなフレームワークを使って開発された Python アプリケーションの場合、CaaS(Container-as-a-Service)経由のデプロイは、コードを GitHub にプッシュするのと同じくらい簡単です。このブログでは、FastAPI アプリケーションを docker 化し、CaaS 経由でデプロイする方法を学びます。
Contents
要点
- DockerとFastAPIは強力なコンビであり、依存関係を含むパッケージ化されたデプロイメントを合理化できる。
- FastAPIは、非同期操作、データ検証、OpenAPIでは優れているが、コミュニティのバックアップと互換性では劣っている。
- Back4appはFastAPIのデプロイを容易にし、GitHubと同期して自動アップデートを行い、クラウドデータベースのセットアップを提供します。
FastAPI とは何ですか?
FastAPIは、RESTful APIを開発するための軽量なオープンソースのPythonウェブフレームワークです。2018年に発表されたこのフレームワークは、PydanticモデルとStarletteをサポートしており、Node.jsやGolangと同じパフォーマンスレベルにあります。このフレームワークはカスタマイズも可能で、コードベースを柔軟に設計することができます。
Pythonバージョン3.6以降のJSONスキーマとタイプヒンティングのサポートにより、PydanticモデルはFastAPIがデータを簡単に解析し、実行時に検証することを可能にします。
Starletteフレームワークは、FastAPIにAsynchronous Server Gateway Interface (ASGI) を導入しています。これにより、Python RESTful APIで非同期操作を実行し、Uvicorn ASGIサーバーでコードを実行することができます。
Node.jsのNodemonのように、UvicornサーバーはAPIルートの変更をリッスンし、更新のたびにランタイムを再イニシエートする。
2023年のStack Overflow Developer Surveyに参加した開発者のうち、FastAPIを使っていると回答したのはわずか7.42%だったが、この記事を書いている時点で、GitHubはFastAPIの総ユーザー数を203kとしている。執筆時点で498人以上の貢献者と190のリリースがあり、FastAPIは一貫したアップデートとパッチを受け取っています。
しかし、FastAPIをGolangやNode.jsと同じパフォーマンス・レベルに置くことは、開発者の間でまだ議論されている 。
Pythonによるウェブ開発には大きな進歩だが、FastAPIはそのパフォーマンスには及ばないという意見もある。
FastAPI の利点
- 非同期操作のサポートPythonのデフォルトの同期操作に加えて、FastAPIはasync/awaitを使った関数宣言もサポートしています。Starletteのおかげで、WebSocketもサポートされます。これにより、プログラムに並行性が追加され、データベースクエリのような遅い処理を待っている間に、アプリケーションが他の処理を実行できるようになります。
- データ検証のサポートPydanticのBaseModelを使用することで、FastAPIはPythonのデータ型ヒントを活用し、データ解析時の厳密性を維持します。これにより、間違ったデータ型がデータベースに入力されることを防ぎます。したがって、余分な検証ライブラリを必要とする動的モデルとは異なり、FastAPIではモデルの検証は簡単ですぐに利用できます。
- 完全に標準化されています:FastAPIは、ウェブ上でHTTP APIを提供するためのOpenAPI仕様に準拠しており、コンシューマーアプリやクライアントが使用したいAPIを簡単に理解することができます。また、FastAPIは、JSONスキーマ宣言を使用して、データベースに送信する前に、テストデータと実際のユーザー送信データが有効であることを確認します。
- 柔軟性:Django と違って、FastAPI は開発者を特定のコードベースのアーキテクチャ標準に制限しません。その代わり、その決定は開発者に委ねられます。したがって、柔軟な命名規則でコードベースを設計し、一般的なアプリ設定とユニットテストスイートを外出先で宣言できます。コードのモジュール化と懸念事項の分離(SOC)も簡単だ。
また、私たちが推奨するオブジェクト指向プログラミング(OOP)を使用すれば、モデルをエンドポイント・クラスに簡単にまとめることができます。ビルドする際、APIエンドポイントをルートに追加するのも簡単です。
- 学習も簡単です:FlaskやDjangoのようなフレームワークよりもユーザーコミュニティが小さいにもかかわらず、FastAPIは広範囲に及ぶ包括的なドキュメントとチュートリアルで際立っています。開発、特にPythonやJavaScriptのバックグラウンドがあれば、簡単に使いこなすことができます。その全体的なシンプルさと柔軟性は、開発プロセスのスピードアップに貢献します。
制限事項
- コミュニティのサポートが低い:FastAPIは、DjangoやFlaskのように多くのユーザーがいるわけではない。まだ比較的新しい。そのため、コミュニティのサポートは低いです。これは、特に新しい開発者にとっては難しいことです。
- バージョンの互換性に制限があります:FastAPI は、Python 3.6 以降のバージョンの Python しかサポートしません。したがって、3.6 より前のバージョンの Python を実行しているマシンまたはサーバーは、FastAPI を正常にインストールして実行するには、アップグレードする必要があります。
FastAPI 展開オプション
Infrastructure-as-a-Service(IaaS)とContainer-as-a-Service(CaaS)は、アプリケーションをデプロイするためのスケーラブルなクラウドインフラです。
仮想プライベートサーバー(VPS)や共有ホスティングでFastAPIアプリケーションをデプロイすることはできますが、IaaSやCaaSほどスケーラブルなものはありません。
IaaS
IaaSは、クラウド上でオンデマンドのコンピューティングリソースを提供するプラットフォームです。アプリケーションのデプロイメント・サーバーのセットアップに必要な仮想化リソースをすべて、通常は従量課金で提供する。
IaaSには、コンピュート・インフラに加えて、ストレージや、ロードバランサー、VPN、ファイアウォール、DNS管理などのネットワーク・リソースが含まれます。お客様はコンピューティング環境の管理に責任を持ち、アプリケーションの要件に合わせてリソースをカスタマイズまたは拡張することができます。
CaaS
CaaSはPlatform-as-a-Service(PaaS)で、アプリケーションをコンテナとしてクラウドにデプロイできる。IaaSとは異なり、CaaSはアプリケーションをホストするために必要なすべての計算ベースラインをボンネットの下で管理します。
これには、コンテナのランタイム環境、オーケストレーション、ストレージ、ロードバランシングなどが含まれる。そのため、インフラ管理に煩わされることなく、アプリケーションの構築に集中することができる。
アプリケーションをコンテナとしてデプロイするため、技術的な設定を気にすることなく、CI/CD統合を簡単に行うことができる。これにより、アプリケーションのリリースとアップデートがより迅速に行える。
FAST API導入プロセス
前提条件からデプロイプロセスを順を追って説明しよう。しかし、Back4Appコンテナを使ってFastAPIアプリケーションをデプロイするので、先に進む前に前提条件を確認しておこう。
Back4appコンテナの概要
Back4App Containersは、Docker化されたアプリケーションをクラウド上で素早くデプロイできるクラウドプラットフォームです。このプラットフォームは GitHub リポジトリと同期し、リリースをプッシュするたびにデプロイを自動的に更新します。これにより、手作業によるコンテナの更新やサーバーのダウンタイムをなくすことができます。
Back4App Containersを使えば、ローカルマシンからコードとその後のリリースをGitHubにプッシュするだけで、プラットフォームがコンテナイメージのオーケストレーションを裏で処理します。Back4Appはまた、リアルタイムのデプロイメント追跡とリアルタイムのログ機能も備えています。
したがって、デプロイのステップをトレースし、障害があればその原因を突き止めることができる。また、Pythonのようなインタプリタ言語では起こりうるが、アプリがランタイムにクラッシュした場合、リアルタイムロギングによってコンソールでエラーをトレースし、素早く修正することができる。
Back4Appの主な特徴は以下の通りです:
- Back4AppアプリとGitHub上のコードベースリポジトリを簡単に同期できます。
- コードとその後の更新を GitHub リポジトリにプッシュすることで、Back4App コンテナ経由でアプリケーションをクラウドにデプロイできます。
- 必要なのはDockerfileだけです。Back4Appは依存関係のインストールを全て行います。
- デプロイ時やその後のリリース時に、環境変数を簡単に暗号化できます。
- デプロイメントをリアルタイムで監視し、ロールバックを管理します。
- リアルタイムのログでアプリケーションの使用履歴を監視します。
- モバイルおよびウェブ・アプリケーションのクラウド展開
Pythonのダウンロードとインストール
このブログではPython 3.10.6を使います。しかし、3.6より前のバージョンでなければ、どのPythonでも使うことができます。python.orgにアクセスして、あなたのOSに対応する最新のPythonバージョンをダウンロードしてインストールしてください。そうでなければ、このセクションは無視してください。
ダウンロードしたら、インストールファイルをクリックし、画面の指示に従ってローカルマシンにPythonをインストールしてください。
Add python.exe to PATHオプションにチェックを入れ、Pythonをシステム変数パスに追加してください。
Macをお使いの場合、デフォルトでPython 2.7がインストールされています。ターミナルからHomebrewを使って最新バージョンにアップデートできます:
brew install python3
ターミナルで以下のコマンドを実行し、Pythonのバージョンを確認してください。
python --version
Python 仮想環境をアクティブにして FastAPI をインストールする
次に、新しいプロジェクト・ディレクトリを作成し、このフォルダにコマンドラインを開く。次に、venvを使ってPython仮想環境をアクティブにする。
このパッケージはPythonに付属しており、インストールは不要です。Pythonの依存関係をグローバルにインストールするのではなく、個別に管理することができます。
ターミナルから以下のコマンドを実行し、env_nameをお好みの環境名に置き換えて仮想環境を作成する。
py -m venv env_name
以下のコマンドを実行して仮想環境をアクティブにする。
.\env_name\Scripts\activate
FastAPIとUvicornをインストールする
次に、FastAPIフレームワークとUvicornサーバーランタイムをアクティブな仮想環境にインストールします。PydanticとStarletteもインストールする。
プロジェクトルートにrequirements.txtファイルを作成し、インストールするパッケージを以下のように入力する。
fastapi
uvicorn
以下はVSCodeでのデモです。必要に応じて、このファイルに依存関係を追加することができます。
ターミナルから以下のコマンドを実行し、リストされた依存関係をインストールします。仮想環境がまだアクティブであることを確認します。
pip install install -r requirements.txt
このコマンドは、以下のように指定されたパッケージをインストールする。
インストールしたら、以下のコマンドを使ってrequirements.txtを更新する:
pip freeze > requirements.txt
上記のコマンドは、インストールされた依存関係(正しいバージョン番号を含む)でrequirements.txtを上書きします。新しい依存関係を仮想環境にインストールするときは、必ずこれを実行してください。
アップデート後のrequirements.txtはこのようになっている:
プロジェクト紹介
シンプルな “Hello World” FastAPI アプリケーションを作成し、無料の Back4App Containers を使ってデプロイします。プロジェクトが複雑でも心配ありません。デプロイは同じステップで完了し、毎月のアップタイムも無料です。
しかし、あなたのアプリが毎日多くのリクエストを処理する場合、ダウンタイムゼロでよりスムーズなユーザーエクスペリエンスを訪問者に提供するために、デプロイ後にアップグレードすることをお勧めします。
アプリコード
プロジェクトのルートフォルダに新しいrouterディレクトリを作成し、その中にmain.pyファイルを作成します。このファイルは、アプリケーションのAPIエンドポイントとルーターを処理します。既にデプロイするプロジェクトがある場合は、次のセクションに進んでください。
これが “Hello World “のコードだ:
from fastapi import FastAPI, APIRouter
import uvicorn
app = FastAPI()
class HelloWorld():
def read_hello(self):
return {"data": "Hello World"}
router = APIRouter()
router.add_api_route('/api/v2/hello-world',
endpoint = HelloWorld().read_hello, methods=["GET"])
app.include_router(router)
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
uvicornサーバーを実行し、hello-worldAPIエンドポイントをテストするには、コマンドラインからmain.pyファイルを実行します:
python main.py
これにより、指定されたポート8000で開発サーバーが起動する。
これはGETリクエストなので、どのウェブ・ブラウザーでも直接テストできる。以下はその結果である。
アプリをDocker化する
次に、プロジェクトのルート・フォルダにDockerfileを作成する。これは、VS Codeで新規ファイルを作成し、Dockerfileという名前を付けることでできる。
作成したら、以下のコマンドを入力してDockerイメージを構築する:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "router.main:app", "--host", "0.0.0.0", "--port", "8000"]
GitHubにプッシュする
GitHubのアカウントにアクセスして、「リポジトリ」に移動します。右上のNew をクリックして、新しいリポジトリを作成します。
GitHubのアカウントにアクセスして、「リポジトリ」に移動します。右上の New をクリックして、新しいリポジトリを作成します。
すでにコードをGitHubにプッシュしている場合は、ローカルマシンのコピーにDockerfileを追加し、リポジトリにプッシュし直します。
リポジトリに名前を付け、右下のCreate repositoryをクリックします。
次に、図のようにinitコマンドを使ってローカルリポジトリを初期化する:
git init
.gitignore を使って venvフォルダと.envファイルを無視し、リポジトリにプッシュしないようにします。そのためには、プロジェクトのルートフォルダに.gitignoreファイルを作成し、以下のように無視したいフォルダとファイルを入力します。
ターミナルから以下のコマンドを次々に実行して、コードをリポジトリにプッシュしてください。
1. git add .
2. git commit -m "commit message"
3. git branch -m main
4. git remote add origin <URL of the created repository>
5. git push -u origin main
Back4Appコンテナでアプリをデプロイする
まだの場合は、Back4Appアカウントを新規作成してください。Google または GitHub からサインインしてください。
サインインしたら、 Build new appwidgetをクリックします。
Containers as a Serviceに移動する。
次のページで、Import GitHub Repo をクリックします。プロンプトが表示されたら、GitHub に Back4App を承認する許可を与えます。
開いたモーダルの[リポジトリへのアクセス]で、[リポジトリの選択]をクリックします。デプロイするプロジェクトを含むリポジトリを選択し、[保存]をクリックします。
Back4Appが選択したリポジトリを自動的に同期します。Back4App にリダイレクトされたら、追加した GitHub リポジトリの右側にあるSelectをクリックします。次に、App Name欄に希望のアプリ名を入力します。
FastAPI アプリケーションが.envファイル内でシークレットをマス クしている場合、[環境変数]をクリックして環境変数を入力します。Add variable] をクリックし、大文字で変数名を入力します。
名前エラーを避けるため、プロジェクトの.envファイルの変数と同じ命名規則を使用するようにしてください。
このステップでは、変数値を暗号化し、ディプロイメントに追加します。最後に、[Create App] をクリックして FastAPI アプリケーションをディプロイします。
FastAPI アプリケーションのデプロイ インスタンスは次のように実行されます。
アプリケーションのライブバージョンを見るには、左サイドバーのURLをクリックしてください。この場合、https://testapp-omisolaidowu.b4a.run/api/v2/hello-world、期待されるレスポンスが返されます。
結論
PythonのFastAPIを使ってアプリケーションを開発するのは一つの仕事です。しかし、それをクライアントにシームレスにデプロイするのは別のことです。
より迅速なデプロイに加え、CaaS は技術的な負担が少ない。FastAPIアプリケーションのデプロイ方法を見ていただきましたが、それだけではありません。
クライアント側アプリケーションを別のコンテナ・インスタンスにデプロイし、生成された URL をベース URL として使用して FastAPI エンドポイントに接続したい場合があります。
この記事が気に入ったら、Flask アプリケーションのデプロイ方法のチュートリアルをご覧ください。
FastAPIとは何ですか?
FastAPIは、PythonでRESTFul APIを開発するための高性能なWebフレームワークです。
FastAPIアプリケーションをデプロイするには?
– Dockerfileを使用してプロジェクトのDockerイメージを作成します。
– コードをGitHubにプッシュします。
– Back4Appアカウントにサインインし、新しいアプリを作成します。
– ターゲットプロジェクトを含むGitHubリポジトリとコンテナインスタンスを接続します。
– FastAPIアプリケーションをデプロイし、リアルタイムのデプロイログを表示します。