FastAPIでつくったアプリをVPSにデプロイする手順

本記事はプロモーションを含みます

本記事では、PythonのWebフレームワークの中でも注目されている「FastAPI」について解説します。FastAPIは、高速なAPIを簡単に開発するためのモダンなフレームワークです。この記事を読むことで、FastAPIの基本的な使い方や魅力を理解できるでしょう。

デプロイ先はUbuntu Linuxを想定しており、NginxをリバースプロキシにしてFastAPIアプリに転送する構成とします。本記事は以下の前提条件をもとに解説しています。

  • root権限が使えるUbuntu Linuxにアクセスできる
  • グローバルIPアドレスが付与されているサーバーを使っている
  • ドメイン取得とDNS登録が完了している

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を作成してデプロイします。

main.py
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

ファイルは次のような内容にします。

/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サービスファイルに記載したポート番号に合わせます。

/etc/nginx/sites-available/your_app_config_file
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入門:手順別にわかりやすく解説!