こんにちは!今日は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環境で動作確認しました。
メインファイルを作成
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関数を作成したら、次はコードをアップロードします:
- 作成した関数の詳細画面で
コード
タブを選択 -
コードソース
セクションのアップロード元
をクリック -
.zip ファイル
を選択 -
アップロード
ボタンをクリックして、先ほど作成したapp.zip
を選択 -
保存
をクリック
動作確認してみよう
生成されたURLにアクセスしてみてください:
BASE_URL="https://xxxxxxxxxx-xxx.lambda-url.ap-northeast-1.on.aws"
curl $BASE_URL/
素敵なレスポンスが返ってくるはずです。
エンドポイントを充実させよう
FastAPIの魅力は、簡単に多様なエンドポイントが作れることです。こんな風にどんどん機能を追加できちゃいます:
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倍高速な処理が可能になり、同時に開発者にとって使いやすい環境を提供してくれます。
何か誤りがございましたら、いつでもお気軽にご指摘ください!