0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-09-04

こんにちは!今日は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倍高速な処理が可能になり、同時に開発者にとって使いやすい環境を提供してくれます。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?