Contents
FastAPI と Next.js フルスタック連携ガイド:プロジェクト構成からデプロイまでをステップバイステップで解説
FastAPI と Next.js の連携は、フロントエンドとバックエンドの統合性を高めるための強力なアプローチです。しかし、CORS エラーの対応や複数プロジェクトのデプロイなど、多くのエンジニアが抱える課題があります。本記事では、FastAPI と Next.js フルスタック連携ガイドとして、最新技術スタックを含む実践的な手順をステップバイステップで解説します。
FastAPI と Next.js のプロジェクト構成設計
FastAPI と Next.js を統合する際のプロジェクト構成は、アプリケーションのスケーラビリティや保守性に直結します。モノリシック型とマイクロサービス型の選択を含め、適切なアーキテクチャ設計が不可欠です。
モノリシック型とマイクロサービス型の比較
| 項目 | モノリシック型 | マイクロサービス型 |
|---|---|---|
| 特徴 | 単一のアプリケーションとして構築 | 独立したコンポーネントで構成 |
| 開発効率 | 初期段階ではシンプルだが、規模が大きくなると可読性が低下 | 各サービスを独立して開発・デプロイ可能 |
| 適切な用途 | 小規模アプリケーションや初期開発に最適 | 大規模プロジェクトやチーム間協業で推奨 |
技術選択の柔軟性と将来的な拡張性を考慮することで、プロジェクトライフサイクルに合った設計が可能になります。
ファイル構造のベストプラクティス
プロジェクトのディレクトリ構成は以下のように設計するのが一般的です:
|
1 2 3 4 5 6 7 8 9 |
my-app/ ├── backend/ # FastAPI バックエンド │ ├── main.py # FastAPI サーバー設定ファイル │ └── models/ # Pydantic モデルやデータベース定義 ├── frontend/ # Next.js フロントエンド │ ├── pages/ # ページコンポーネント │ └── services/ # API クライアントの実装 └── docker-compose.yml # ローカル環境構築用設定ファイル(Docker 対応時) |
この構成では、ディレクトリ間の依存関係を明確にし、デプロイや CI/CD での管理が容易になります。
CORS 設定とクロスドメイン通信
FastAPI と Next.js の連携には、ブラウザーセキュリティポリシーによる CORS(Cross-Origin Resource Sharing)制限を回避する必要があります。適切な設定により、開発環境での問題やデプロイ時のエラーを防ぎます。
FastAPI / Next.js における統合的な CORS 対応方法
- FastAPI 側:
CORSMiddlewareを用いてリクエスト元の制限を柔軟に設定 - Next.js 側: プロキシ設定や環境変数でホスティングサービスと同期
FastAPI での CORSMiddleware の実装手順
- FastAPI アプリケーションにミドルウェアを追加
python
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # Next.js の開発サーバーのURL
allow_methods=[""],
allow_headers=[""],
)
- 環境変数による柔軟な設定
デプロイ時にはallow_originsを Vercel や他のホスティングサービスに合わせて更新します。
Next.js でのプロキシ設定と CORS 避免手順
-
next.config.jsでプロキシの設定
javascript
module.exports = {
async rewrites() {
return [
{
source: '/api/:path*',
destination: 'http://localhost:8000/api/:path*', // FastAPI の URL
},
];
},
}; -
開発環境での CORS 問題回避
プロキシ経由で API を呼び出すことで、ブラウザのセキュリティ制限を自動的に回避できます。
TypeScript での API クライアント作成
FastAPI は OpenAPI スペックを自動生成し、そのインターフェースを活用することで型安全なフロントエンド構築が可能です。SWR や Axios を組み合わせた設計が効率的です。
OpenAPI 仕様からの型定義自動生成手順
- Swagger Codegen の使用
-
コマンドで TypeScript 型定義ファイルを生成できます:
bash
npx @openapitools/openapi-generator-cli generate -i http://localhost:8000/openapi.json -g typescript-fetch -o ./services/api-types/ -
型定義の統合
生成された.tsファイルをservices/内に配置し、API クライアントで利用します。
Axios と SWR の統合設計
API クライアントの例:
|
1 2 3 4 5 6 7 8 9 |
import axios from 'axios'; import { useSWR } from 'swr'; const fetcher = (url: string) => axios.get(url).then(res => res.data); export const useUserData = () => { return useSWR('/api/user', fetcher); }; |
このようにすることで、データフェッチの効率と再利用性を高められます。
Vercel 上での FastAPI と Next.js の統合デプロイ手順
Next.js は Vercel 上で即座にデプロイ可能ですが、FastAPI バックエンドも一緒に配置するには環境変数や CI/CD のカスタマイズが必要です。
環境変数管理と Secrets 設定
- Vercel での環境変数設定
- Vercel ウェブダッシュボードから
NEXT_PUBLIC_API_URLやDATABASE_URLを設定します(NEXT_PUBLIC_で公開可能な値)。 - FastAPI の Secret 設定ファイル
- バックエンド側では
.envファイルに環境変数を管理し、Vercel 上でのデプロイ時に自動読み込みされます。
CI/CD パイプラインのカスタマイズ手順
vercel.jsonの設定-
builds内に FastAPI 用の構築コマンドを追加:
json
{
"builds": [
{ "src": "frontend/", "use": "@vercel/next" },
{ "src": "backend/main.py", "use": "@vercel/python" }
]
} -
Python バージョン指定と依存関係管理
pyproject.tomlで使用する Python 版を明示し、依存関係の管理を確実にします。
Docker によるローカル環境構築
Docker を利用することで、開発・テスト環境の一貫性を保ちます。以下は基本的な Dockerfile と docker-compose.yml の例です。
多段階ビルドで構成された Dockerfile
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# FastAPI バックエンドの Dockerfile FROM python:3.9-slim as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt FROM python:3.9-slim WORKDIR /app COPY --from=builder /root/.local /root/.local ENV PATH=/root/.local/bin:$PATH COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] |
Dockerfile は、アプリケーションの依存関係や実行環境を一貫して管理するためのファイルです。
ローカル環境構築用 docker-compose.yml の詳細設定
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '3' services: frontend: build: ./frontend ports: - "3000:3000" depends_on: - backend backend: build: ./backend ports: - "8000:8000" environment: - DATABASE_URL=sqlite:///./test.db |
docker-compose.ymlを用いることで、Next.js と FastAPI のコンテナを連携させたローカル環境を構築できます。
プロジェクト初期設定と今後の拡張性
プロジェクト立ち上げ時は、エラーハンドリングやモジュール分割の設計が将来的な保守性に影響します。
エラーハンドリングの共通設計
- FastAPI 側:
HTTPExceptionを用いて一貫したエラー応答を実装する
python
from fastapi import HTTPException
@app.get("/data")
def get_data():
if some_condition:
raise HTTPException(status_code=404, detail="Data not found")
- Next.js 側:SWR の
errorプロパティでエラーハンドリングを統一
typescript
const { data, error } = useSWR('/api/data', fetcher);
if (error) return <div>エラーが発生しました</div>;
モジュール分割のベストプラクティス
- FastAPI の
routes/内で API をモジュールごとに分ける - Next.js の
components/とservices/を分離し、再利用性を高める
結論:FastAPI × Next.js フルスタック構築の要点
- プロジェクト構成:マイクロサービス型がスケーラビリティに適している
- CORS 対策:FastAPI の
CORSMiddlewareと Next.js のプロキシ設定を併用する - OpenAPI スペック活用:自動生成された TypeScript 型で API クライアントを構築すると効率的
- Vercel 上のデプロイ:
vercel.jsonをカスタマイズし、FastAPI と Next.js の同時デプロイを実現 - Docker 利用:ローカル環境の一貫性と開発効率を高める
記事に記載されたサンプルコードを元に、あなたのプロジェクトの初期設定を始めてみましょう。