💡

AWS Lambda + FastAPI + MangumでサーバーレスAPIを楽々構築!

に公開

こんにちは!今日はAWS LambdaでFastAPIを動かす方法をご紹介しますね。サーバーレスでAPIを構築できるので、運用コストを抑えながらスケーラブルなアプリケーションが作れちゃいます。

この記事では、最新の技術を使って効率よく開発する方法をお教えします。きっと「こんなに簡単だったの?」って驚いてもらえると思います!

開発環境の準備

プロジェクトディレクトリを作成

mkdir my-fastapi-lambda
cd my-fastapi-lambda

ライブラリインストール

今回はFastAPI 0.99.0とMangumを使います。

依存関係をプロジェクトフォルダにインストール

--targetでパッケージを特定のディレクトリに
--no-compile-bytecodeで.pycファイルの生成をスキップ

uv pip install \
  --target packages \
  --no-installer-metadata \
  --no-compile-bytecode \
  fastapi==0.99.0 mangum

重要なポイント!
FastAPI==0.99.0のバージョン固定が大切です。この組み合わせでLambda環境で動作確認しました。

メインファイルを作成

lambda_function.py
from fastapi import FastAPI
from mangum import Mangum

app = FastAPI(
    title="My Serverless API",
    description="AWS Lambda + FastAPIで作った素敵なAPI",
    version="1.0.0"
)

@app.get("/")
def hello():
    return {
        "message": "Hello World!", 
        "platform": "AWS Lambda + FastAPI"
    }

# MangumでLambda用のハンドラーを作成
# lifespan="off"でスタートアップイベントを無効化(Lambda環境では不要)
lambda_handler = Mangum(app, lifespan="off")

デプロイ用パッケージの作成

# メインファイルをパッケージディレクトリにコピー
cp lambda_function.py packages/

# ZIP形式で圧縮
pushd packages && zip -r ../app.zip . && popd

AWS Lambdaでの設定

Lambda関数を作成しよう

項目
関数名 my-fastapi-api
ランタイム Python 3.13 (最新版)

関数の作成をクリックして作成完了!

関数URLで簡単アクセス設定

従来のAPI Gatewayよりもシンプルな「関数URL」を使いましょう:

  • 作成した関数の設定タブを選択
  • 関数 URLをクリック
  • 関数 URL を作成をクリック
  • 認証タイプ: NONEを選択
  • 保存をクリック
  • 関数 URLに表示されているURLをコピーする

これで、あなたのAPIにインターネット経由でアクセスできるようになります!

zipファイルをアップロードしよう

Lambda関数を作成したら、次はコードをアップロードします:

  1. 作成した関数の詳細画面でコードタブを選択
  2. コードソースセクションのアップロード元をクリック
  3. .zip ファイルを選択
  4. アップロードボタンをクリックして、先ほど作成したapp.zipを選択
  5. 保存をクリック

動作確認してみよう

生成されたURLにアクセスしてみてください:

BASE_URL="https://xxxxxxxxxx-xxx.lambda-url.ap-northeast-1.on.aws"
curl $BASE_URL/

素敵なレスポンスが返ってくるはずです。

エンドポイントを充実させよう

FastAPIの魅力は、簡単に多様なエンドポイントが作れることです。こんな風にどんどん機能を追加できちゃいます:

lambda_function.py
from fastapi import FastAPI, Body, Request
from mangum import Mangum
from pydantic import BaseModel

app = FastAPI(
    title="My Awesome Serverless API",
    description="様々な機能を持つサーバーレスAPI",
    version="1.0.0"
)

# データモデルを定義
class MessageData(BaseModel):
    message: str
    user_name: str = "匿名さん"

@app.get("/")
def home():
    return {
        "message": "Hello World!", 
        "platform": "AWS Lambda + FastAPI",
        "status": "ready"
    }

@app.get("/about")
def about():
    return {
        "app_name": "My Serverless API",
        "description": "FastAPIとAWS Lambdaで作った高性能API",
        "features": ["高速", "スケーラブル", "コスト効率抜群"]
    }

# パスパラメータを使った動的なエンドポイント
@app.get("/user/{user_id}")
def get_user(user_id: int):
    return {
        "user_id": user_id, 
        "message": f"こんにちは、ユーザー{user_id}さん!",
        "timestamp": "2025-09-04"
    }

# クエリパラメータを受け取る
@app.get("/greet")
def greet(name: str = "素敵なあなた"):
    return {
        "message": f"こんにちは、{name}さん!",
        "greeting_type": "friendly"
    }

# ヘルスチェック用エンドポイント
@app.get("/api/health")
def health_check():
    return {
        "status": "healthy", 
        "message": "APIは正常に動作中です",
        "service": "FastAPI on Lambda"
    }

# シンプルなPOSTエンドポイント
@app.post("/create")
def create_something():
    return {
        "message": "リソースを作成しました!", 
        "status": "success",
        "action": "create"
    }

# JSON データを受け取る
@app.post("/submit")
def submit_data(data: dict):
    return {
        "message": "データを受信しました!", 
        "received_data": data,
        "status": "processed"
    }

# Pydanticモデルを使った型安全なエンドポイント
@app.post("/message")
def post_message(message_data: MessageData):
    return {
        "echo": f"{message_data.user_name}さんからのメッセージ: {message_data.message}",
        "character_count": len(message_data.message),
        "status": "delivered"
    }

# Request オブジェクトを直接使用
@app.post("/message-advanced")
async def post_message_advanced(request: Request):
    data = await request.json()
    return {
        "echo": f"受信メッセージ: {data}",
        "data_type": str(type(data)),
        "processing_method": "Request object"
    }

# AWS Lambda用のハンドラー
lambda_handler = Mangum(app, lifespan="off")

コードを再アップロードしよう

新しいコードをアップロードするときは、先ほどと同様に…

  • ZIPファイル作成
  • ZIPファイルアップロード

でOK。

動作を再確認しよう

curl $BASE_URL/
curl $BASE_URL/about
curl $BASE_URL/user/42
curl $BASE_URL/greet?name=Mike
curl $BASE_URL/api/health
curl -X POST $BASE_URL/create
curl -X POST -H "Content-Type: application/json" \
  -d '{"test": "data"}' \
  $BASE_URL/submit
curl -X POST "$BASE_URL/message" \
  -H "Content-Type: application/json" \
  -d '{
    "user_name": "田中さん",
    "message": "こんにちは、FastAPI!"
  }'

まとめ

いかがでしたか?AWS Lambda + FastAPI + Mangumの組み合わせなら:

高速: 最新のPython 3.13とFastAPIの高性能を活用できます
経済的: サーバーレスなので、リクエストがない時間は料金がかかりません
スケーラブル: トラフィックの増加に合わせて自動でスケールします
開発体験が良好: FastAPIの自動ドキュメント生成や型ヒントで、開発効率(DX: Developer Experience)が大幅に向上します

特に注目すべきは、最新のPython 3.13とFastAPIを組み合わせることで、パフォーマンスと開発体験の両方で大きなメリットが得られる点です。従来のフレームワークと比べて3倍高速な処理が可能になり、同時に開発者にとって使いやすい環境を提供してくれます。

何か誤りがございましたら、いつでもお気軽にご指摘ください!

Discussion