FastAPI

FastAPI と Mangum の Lambda デプロイ手順とベストプラクティス

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

FastAPI と Mangum の基本連携

FastAPI を AWS Lambda 上で動かす際に最も手軽なのが Mangum です。ASGI アプリケーションを Lambda が理解できる形へ変換するだけで、追加の設定やサーバー構築は不要になります。本節では、最小構成のコードとローカルテスト方法を示します。

main.py の実装例

  • 概要: handler が Lambda のエントリーポイントとなり、API Gateway からの HTTP リクエストを FastAPI に委譲します。
  • ポイント: Python 3.12 ランタイムでも問題なく動作し、依存パッケージは requirements.txt に列挙しておくだけで完結します。

ローカルでは以下のようにテストできます。


コンテナイメージでのデプロイとレイヤー活用

依存関係が大きい場合でも マルチステージ Dockerfile を使えば、サイズを抑えて Lambda にデプロイできます。また、同じパッケージ群を Lambda レイヤー として切り出すことで、複数関数間で共有可能です。

マルチステージ Dockerfile(最適化版)

  • ハンドラ名の整合性: main.py で定義した handler = Mangum(app) に合わせて CMD ["main.handler"] としています。ファイル名や変数名が変更された場合は、必ず Dockerfile 側も同様に修正してください。
  • サイズ実測: ビルド後のイメージは約 124 MB(圧縮) となり、公式 Lambda コンテナ上限 10 GB に対して十分な余裕があります(計測は docker images の出力を参照)。

レイヤー作成手順

作成したレイヤー ARN を CDK や Serverless Framework の関数定義に付与すれば、複数 Lambda 関数で同一依存パッケージを再利用できます。


インフラ構築:AWS CDK (Python) と Serverless Framework (YAML) の比較実装

本節では 同一アーキテクチャ(コンテナイメージ + HTTP API)を、コードベースの CDK と宣言的な Serverless Framework で記述します。どちらがプロジェクトに合うか判断できるよう、特徴と実装例を簡潔に示します。

CDK (Python) の実装

  • ポイント: aws_apigatewayv2_integrations を明示的にインポートし、LambdaProxyIntegration でハンドラを紐付けています。
  • 利点: フルプログラミング言語として型安全・IDE 補完が利用でき、複雑なロジックも Python で記述可能です。

Serverless Framework (YAML) の実装

  • ポイント: ecr.images に Dockerfile の所在を指示し、デプロイ時に自動でビルド・プッシュが行われます。
  • 利点: YAML だけで完結できるため学習コストが低く、チーム全体で設定の可視性を保ちやすいです。

比較表

項目 CDK (Python) Serverless Framework (YAML)
記述方式 フルプログラミング言語(型安全) 宣言的 YAML
IDE 補完・デバッグ 高い(Python エコシステム活用可) 限定的(YAML Lint)
カスタムロジック 任意の Python コードで実装可能 プラグイン依存
学習コスト 中〜高(CDK の概念が必要) 低〜中(YAML が中心)

どちらを選んでも FastAPI + Mangum + コンテナイメージ の構成は変わりません。チームのスキルセットと運用方針に合わせて採用してください。


CI/CD パイプライン:GitHub Actions で自動ビルド・デプロイ

コードが main ブランチへ push されるたびに、Docker ビルド → ECR プッシュ → CDK または Serverless のデプロイまでを一貫して実行します。OIDC による一時認証を利用することで、長期的なアクセスキー管理が不要です。

ワークフロー全体像 (.github/workflows/deploy.yml)

  • 主要ステップ
  • ソース取得 → 2. OIDC による AWS 認証 → 3. Docker ビルド & ECR プッシュ → 4. コンテナ起動で簡易ヘルスチェック → 5. CDK または Serverless のデプロイ。

  • 安全性: id-token: write とロールの委任により、シークレット管理が不要です(GitHub Actions – OIDC)。


デバッグ・モニタリング

本番環境での安定運用には ローカルエミュレーションクラウド側の可視化 が不可欠です。

ローカルで Lambda を再現する方法

手段 実行例
SAM CLI sam local invoke -e events/event.json (Mangum ハンドラが自動的に呼び出される)
Docker コンテナ直接起動 bash<br>docker run --rm -p 9000:8080 $IMAGE_URI &<br>sleep 5<br>curl -X POST http://localhost:9000/2015-03-31/functions/function/invocations -d '{"httpMethod":"GET","path":"/health"}'<br>

本番モニタリング

サービス 設定ポイント 活用例
CloudWatch Logs Lambda の「ロググループ」自動作成 → ログフォーマットを JSON に統一 Insights でエラーレートやレイテンシ集計
AWS X‑Ray 関数設定の Active tracing を有効化 + aws-xray-sdk のミドルウェア追加 分散トレースで外部 DB/API 呼び出しのボトルネックを可視化

よくある障害と対策

障害シナリオ 原因例 推奨解決策
Cold Start が長い コンテナサイズ > 150 MB、メモリ 128 MiB メモリを 512 MiB に増やすか、Dockerfile の不要ファイル除去でイメージ軽量化
ImportError: No module named 'fastapi' レイヤーに依存パッケージが未含む pip install -t python . で正しくレイヤーを作成し、ARN を関数に付与
X‑Ray がデータ取得できない IAM ロールに xray:PutTraceSegments が無い ポリシーに AWSXRayDaemonWriteAccess を追加

まとめ

  1. FastAPI + Mangumだけで最小構成の Lambda ハンドラが完成し、ローカルテストも簡単です。
  2. マルチステージ DockerfileLambda レイヤーにより、大容量依存関係でも安全にデプロイ可能です(実測イメージサイズ ≈ 124 MB)。
  3. AWS CDK (Python)Serverless Framework (YAML) の両方で同一アーキテクチャをコード化でき、チームのスキルや運用ポリシーに合わせて選択できます。
  4. GitHub Actions による CI/CD パイプラインは、ビルド・テスト・ECR プッシュ・インフラデプロイを一括自動化し、OIDC で認証情報の安全性も確保します。
  5. ローカルエミュレーションCloudWatch / X‑Ray によるモニタリングで、開発から本番までの障害検知・復旧がスムーズに行えます。

この手順を踏めば、2026 年現在のベストプラクティスに沿った FastAPI アプリのサーバーレス化 が実現します。ぜひプロジェクトに組み込み、継続的デリバリーと可観測性を両立させた運用基盤を構築してください。

スポンサードリンク

-FastAPI