本記事はプロモーションを含みます
本記事では、PythonのWebフレームワークの中でも注目されている「FastAPI」について解説します。FastAPIは、高速なAPIを簡単に開発するためのモダンなフレームワークです。この記事を読むことで、FastAPIの基本的な使い方や魅力を理解できるでしょう。
デプロイ先はUbuntu Linuxを想定しており、NginxをリバースプロキシにしてFastAPIアプリに転送する構成とします。本記事は以下の前提条件をもとに解説しています。
- root権限が使えるUbuntu Linuxにアクセスできる
- グローバルIPアドレスが付与されているサーバーを使っている
- ドメイン取得とDNS登録が完了している
Contents
FastAPIとは?
FastAPIはPython 3.6以上で動作する、非常に高速に動作するAPIを構築するためのWebフレームワークです。FastAPIには以下の特徴があります。
- 高速: StarletteとPydanticを基盤としているため、非常に高速です。
- 型ヒント: Pythonの型ヒントを使用してAPIのパラメータやリクエストボディを定義します。
- 自動ドキュメント生成: Swagger UIやReDocを使用して、APIのドキュメントを自動生成します。
VPSを購入する:VPSプランの選び方に注意!
すでにVPSを利用中の方は読み飛ばしてください。
VPSにインストールするOSはLinuxを想定しています。VPSの最安値プランはメモリーサイズが512MBであることが多いのですが、最近のLinuxディストリビューションは512MBのメモリーサイズでは起動しない場合があるので、最低でも1GBは必要です。
VPSプランを決める場合はどのようにしてVPSを使うかによって変わります。アクセス数は多いのか、少ないのか、複数のアプリを動かすのか、複数のドメインを使うのか、など。CPUやメモリーサイズ、ストレージサイズもそれよって変わります。
わたしはカゴヤVPSのCPU2コア、メモリーサイズ2GB、ストレージサイズ200GBの1カ月プランを880円で利用しています。これはカゴヤVPSの大容量プランというストレージサイズを増やしたプランですが、このスペックだと複数サイトを運営していても十分処理できます。
FastAPIをインストールする
FastAPIを使用するには、まず以下のコマンドでインストールします。
pip install fastapi[all]
また、ASGIサーバーとしてuvicorn
もインストールする必要があります。
pip install uvicorn
FastAPIアプリケーションを作成する
例として次のようなシンプルなAPIを作成してデプロイします。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
このコードをmain.pyというファイル名で保存し以下のコマンドを実行してみます。
uvicorn main:app --reload
正常に実行されたらWEBブラウザで http://127.0.0.1:8000 にアクセスすると {"Hello": "World"}
が表示されるはずです。
FastAPIアプリケーションをデーモン化する
FastAPIアプリケーションを永続的に実行するためには、systemdを使用してuvicornをサービスとして登録する方法があります。systemdは多くのLinuxディストリビューションでデフォルトのinitシステムとして使用されており、サービスの管理と自動起動を簡単に行える便利なツールです。
最初にsystemdサービスファイルを作成します。ファイル名は何でも良いのですが分かりやすい名前にしておく方がいいでしょう。わたしは慣例的にfqdnをファイル名にしているので「api.iphack.net.service」というファイル名にしています。
以下の「your_app.service」の箇所をご自身で決めたファイルに置き換えてコマンドを実行してください。
sudo vi /etc/systemd/system/your_app.service
ファイルは次のような内容にします。
[Unit]
Description=Your FastAPI Application
After=network.target
[Service]
User=your_username # FastAPIアプリを実行するユーザー名に置き換えてください
Group=your_group # FastAPIアプリを実行するグループ名に置き換えてください
WorkingDirectory=/path/to/your/app # FastAPIアプリのディレクトリパスに置き換えてください
ExecStart=/path/to/your/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 4 # ポート番号は8000番から変更できます
Restart=always
[Install]
WantedBy=multi-user.target
重要なのは3点です。まずはアプリの実行ユーザーと実行グループである「User」「Group」です。ここはアプリが正常に動作するために必要な権限を付ける必要があります。特別な権限が必要なければ、セキュリティの観点でいうとnobodyやwww-dataあたりにした方が良いでしょう。
また、アプリを起動するポートを8000番にしていますが、ここは適宜変更してください。複数のアプリを動かす場合はポート番号が重複しないように配慮する必要があります。
ファイルを作成したらsystemdにサービスを登録して有効化します。
sudo systemctl daemon-reload
sudo systemctl enable your_app
your_app
の箇所は、先ほど作成したsystemdサービスファイルの名前に合わせます。つまり、/etc/systemd/system/your_app.service
というファイル名で作成していればサービス名はyour_app
となります。
登録が完了したらFastAPIアプリを起動しましょう。
sudo systemctl start your_app
先ほどと同じで、your_app
の箇所は適宜変更してください。コマンド実行時にエラーメッセージが表示されていなければ、無事にFastAPIアプリが起動しています。
アプリの再起動と停止、開始は次のコマンドで実行します。
アプリを再起動する
sudo systemctl restart your_app
アプリを停止する
sudo systemctl stop your_app
アプリを起動する
sudo systemctl start your_app
また、アプリの起動状態を確認するには次のコマンドを実行します。
sudo systemctl status your_app
NginxでリバースプロキシしてFastAPIにアクセスさせる
本記事ではNginxでインターネットからアクセスを受けてFastAPIのアプリに転送するという、いわゆるリバースプロキシ構成を採用します。
そのため、FastAPIアプリをデーモン化した際に意図的に127.0.0.1で起動させました。これでインターネットから直接FastAPIアプリにアクセスできなくなります。
Nginxをインストールしてリバースプロキシの設定をおこなう
まだNginxをインストールしていない場合はaptコマンドでインストールしておきます(Ubuntu Linuxを想定しています)。
sudo apt install nginx
インストールできたら自動起動を有効化してNginxを起動しておきます。
sudo systemctl start nginx
sudo systemctl enable nginx
Nginxが起動したら/etc/nginx/sites-available/
ディレクトリ配下に設定ファイルを作成します。ファイル名は何でも良いのですが分かりやすいものにしてください。
server_name
は実際にアクセスされるFQDNとなります。たとえば本サイトならばvpscafe.net
となります。また、ポート番号は先ほどFastAPIアプリケーションをデーモン化した際に用意したsystemdサービスファイルに記載したポート番号に合わせます。
server {
listen 80;
server_name example.com; # アクセスしてくるFQDNに変更する
location / {
proxy_pass http://127.0.0.1:8000; # FastAPIアプリのホストとポートに合わせて変更する
proxy_set_header Host $host;
}
}
ファイルの作成が完了したシンボリックリンクを作成してNginxの設定ファイルをsites-enabled
ディレクトリに追加し、Nginxを再起動します。
sudo ln -s /etc/nginx/sites-available/your_app_config_file /etc/nginx/sites-enabled/
sudo service nginx restart
これでサーバー側の設定は一通り完了です。
HTTPSでアクセスできるようにする
現在のWEBはHTTPS化は必須です。HTTPSでアクセスできるようにする方法はいくつかあるのですが、わたしはCloudflareを使っています。
Cloudflareとは?
CloudflareはCDN(Content Delivery Network)サービスのひとつです。
CDNはWEBコンテンツをユーザーへ高速に配信するためのネットワークシステムです。これは、世界中に分散配置されたサーバ群から成るネットワークで、ユーザーの近くのサーバからコンテンツを提供することで、ウェブページのロード時間を大幅に短縮します。
どのようにしてHTTPS化するのか?
Cloudflareを使うと誰でも簡単に無料でHTTPS化できます。方法は難しくないですが詳しく解説すると長くなるので、別の記事で解説しています。
詳細は以下の記事を参考にしてみてください。
無料でHTTPS化!初心者のためのCloudflare入門:手順別にわかりやすく解説!