Skip to content

FastAPI Cloud

FastAPI Cloud は、 FastAPI アプリをコマンド 1 つで公開できるクラウドサービス。 FastAPI チームの方々が展開してる。


FastAPI Cloud でデプロイ

コマンド 1 つだけ。

uv run fastapi deploy

特長と仕組み

主な特長はこんな感じ。

  • Zero config deployments … 設定なし、コマンド 1 つでデプロイできる
  • HTTPS by default … 証明書の準備なしで最初から HTTPS
  • Autoscaling … リクエストに応じて自動でスケールする

fastapi deploy を実行すると、次の流れで進む: cf. How It Works - FastAPI Cloud

  1. アップロード
    • コードとファイルをまとめて FastAPI Cloud に送る。
    • .gitignore を見て仮想環境みたいな不要なものは自動で除外してくれる(.fastapicloudignore を置けばさらに調整できる)。
    • このステップでは手元では何もインストール・ビルドしないので、ローカル環境は汚れない。
    • 同時にアカウント側にデプロイの記録が作られる。
  2. インストールとビルド
    • 送られたファイルをもとに、クラウド側で依存関係のインストールとビルドをする。
    • Python の標準やよくある慣習に沿って処理されるので、特別な設定はいらない。
  3. デプロイ
    • ゼロダウンタイムで公開する。
    • 今動いてるインスタンスがリクエストをさばき続けたまま、新しいインスタンスを少しずつ立ち上げて切り替えるので、サービスは止まらない。
    • リクエスト量に応じた自動スケール(autoscaling)もここで効く。
  4. デプロイの検証
    • 新しいインスタンスがちゃんと動くか確認する。
    • 問題があれば直前の成功したデプロイがそのまま残る(自動でロールバックされる)ので安心。
    • 状況はダッシュボードから確認できる。
    • ローカルで fastapi dev が動くアプリなら、 FastAPI Cloud でもそのまま動くはず。

DB(Neon)と連携する

Neon はサーバーレスの PostgreSQL。 FastAPI Cloud のダッシュボードからつなぐと、接続情報を環境変数としてアプリに自動で渡してくれる: cf. Neon Integration - FastAPI Cloud

Neon アカウントをつなぐ

  1. チーム設定の Integrations を開く。
  2. Neon の connect を押す。
  3. FastAPI Cloud を認可する(プロジェクトと組織への読み取りアクセスを求められる)。
  4. 認可できると FastAPI Cloud に戻ってくる。

アプリにデータベースをひもづける

アカウントをつないだら、アプリごとに使うデータベースを選ぶ。

  1. アプリ詳細の Storage タブを開く。
  2. Neon の連携を選ぶ。
  3. organization → project → branch → database の順に選んでいく。
  4. そのまますぐ再デプロイもできる。

コードから使う

連携すると、 FastAPI Cloud が PostgreSQL の接続文字列を DATABASE_URL 環境変数としてセットしてくれる。値は暗号化されたシークレットとして保存される。

Note

DATABASE_URL をすでに別の用途で使ってるなら、連携のときに NEON_DATABASE_URL みたいな別名にもできる。

あとは データベース でやったように、接続文字列を環境変数から読んで SQLModel の engine を作るだけ。ローカルの SQLite から本番の PostgreSQL に変えても、コードはほぼそのまま。

db.py
import os

from sqlmodel import create_engine

# DATABASE_URL は連携時に環境変数として自動でセットされる
engine = create_engine(os.getenv("DATABASE_URL"))

os.getenv で直接渡してもいいし、 設定管理(pydantic-settings)Settings 経由で読んでもいい。

SQLite との違い

  • データベース で付けてた connect_args={"check_same_thread": False} は SQLite 特有の設定なので、 PostgreSQL ではいらない。
  • PostgreSQL に接続するドライバ(psycopg2-binary など)もインストールしておく(uv add psycopg2-binary)。

接続情報を環境変数で渡す

Neon を FastAPI Cloud と連携させる代わりに、 Neon で先にデータベースを作って、その接続情報を FastAPI Cloud の環境変数として登録しても繋がる。 設定管理(pydantic-settings) のように環境変数から読むようにしておく。

登録はダッシュボードの Environment Variables 画面でやるのが手軽。変数名は自分のアプリが読むものに合わせる。 POSTGRES_* から接続 URL を組み立てる作り(full-stack-fastapi-template 方式)なら、 POSTGRES_SERVER / POSTGRES_PORT / POSTGRES_DB / POSTGRES_USER / POSTGRES_PASSWORD を Neon の接続情報で埋める。

FastAPI Cloud のダッシュボードの Environment Variables 画面

  • パスワードみたいな秘密の値は Secret をオンにする。暗号化されてダッシュボードでは見えなくなる(実行時はアプリから読める)。
  • 入力したら Save and Redeploy で登録と再デプロイ(環境変数の変更は再デプロイで反映される)。
  • 数が多いときは Import .env でローカルの .env をまとめて取り込める。その .env 自体はパスワードを含むのでコミットしない(.gitignore に入れる)。

単一の DATABASE_URL で読む作りなら、 DATABASE_URL を 1 つ登録するだけでいい(Web UI 連携が自動でやってくれるのと同じ変数)。

CLI でも登録できる

ダッシュボードの代わりに fastapi cloud env set でも登録できる: cf. Env Command - FastAPI Cloud

fastapi cloud env set POSTGRES_SERVER ep-cool-darkness-12345678-pooler.ap-southeast-1.aws.neon.tech
fastapi cloud env set POSTGRES_PORT 5432
fastapi cloud env set POSTGRES_DB neondb
fastapi cloud env set POSTGRES_USER neondb_owner
fastapi cloud env set --secret POSTGRES_PASSWORD

--secret を付けると暗号化シークレットになる。値を省くと伏字でプロンプトされるので、パスワードを画面に出さずに登録できる。 CLI で変えても自動では再デプロイされないので、次の fastapi deploy で反映される。