コンテンツにスキップ

クイックスタート

lambapi を使って最初の API を構築しましょう。このガイドでは、5 分で動作する API を作成できます。

前提条件

  • Python 3.7 以上
  • AWS Lambda の基本的な知識(任意)

インストール

pip install lambapi

最初の API

1. 基本的な Hello World API

app.py
from lambapi import API, create_lambda_handler

def create_app(event, context):
    app = API(event, context)

    @app.get("/")
    def hello():
        return {"message": "Hello, lambapi!"}

    return app

# Lambda エントリーポイント
lambda_handler = create_lambda_handler(create_app)

2. パスパラメータの使用

app.py
@app.get("/hello/{name}")
def hello_name(name: str):
    return {"message": f"Hello, {name}!"}

3. クエリパラメータとデフォルト値

app.py
@app.get("/search")
def search(q: str = "", limit: int = 10, sort: str = "name"):
    return {
        "query": q,
        "limit": limit,
        "sort": sort,
        "results": [f"item-{i}" for i in range(1, limit + 1)]
    }

4. 複数の HTTP メソッド

app.py
@app.post("/users")
def create_user(request):
    user_data = request.json()
    return {
        "message": "User created",
        "user": user_data
    }

@app.put("/users/{user_id}")
def update_user(user_id: str, request):
    user_data = request.json()
    return {
        "message": f"User {user_id} updated",
        "user": user_data
    }

@app.delete("/users/{user_id}")
def delete_user(user_id: str):
    return {"message": f"User {user_id} deleted"}

完全な例

complete_app.py
from lambapi import API, Response, create_lambda_handler

def create_app(event, context):
    app = API(event, context)

    # ルートエンドポイント
    @app.get("/")
    def root():
        return {
            "name": "My API",
            "version": "1.0.0",
            "endpoints": [
                "GET /",
                "GET /hello/{name}",
                "GET /users",
                "POST /users",
                "GET /users/{id}"
            ]
        }

    # 挨拶エンドポイント
    @app.get("/hello/{name}")
    def hello(name: str, lang: str = "ja"):
        greetings = {
            "ja": f"こんにちは、{name}さん!",
            "en": f"Hello, {name}!",
            "es": f"¡Hola, {name}!"
        }
        return {
            "message": greetings.get(lang, greetings["en"]),
            "language": lang
        }

    # ユーザー一覧
    @app.get("/users")
    def get_users(limit: int = 10, offset: int = 0):
        users = [
            {"id": i, "name": f"User {i}"}
            for i in range(offset + 1, offset + limit + 1)
        ]
        return {
            "users": users,
            "pagination": {
                "limit": limit,
                "offset": offset,
                "total": 100
            }
        }

    # ユーザー作成
    @app.post("/users")
    def create_user(request):
        user_data = request.json()

        # 簡単なバリデーション
        if not user_data.get("name"):
            return Response(
                {"error": "Name is required"},
                status_code=400
            )

        return Response(
            {
                "message": "User created successfully",
                "user": {
                    "id": 123,
                    "name": user_data["name"],
                    "email": user_data.get("email")
                }
            },
            status_code=201
        )

    # 個別ユーザー取得
    @app.get("/users/{user_id}")
    def get_user(user_id: str):
        return {
            "id": user_id,
            "name": f"User {user_id}",
            "email": f"user{user_id}@example.com",
            "created_at": "2025-01-01T00:00:00Z"
        }

    return app

lambda_handler = create_lambda_handler(create_app)

テスト方法

1. ローカルでのテスト

test_local.py
import json

# テスト用のイベントを作成
event = {
    'httpMethod': 'GET',
    'path': '/hello/世界',
    'queryStringParameters': {'lang': 'ja'},
    'headers': {},
    'body': None
}

context = type('Context', (), {
    'aws_request_id': 'test-123',
    'log_group_name': 'test',
    'log_stream_name': 'test'
})()

# ハンドラーを実行
result = lambda_handler(event, context)
print(json.dumps(result, indent=2, ensure_ascii=False))

2. SAM Local でのテスト

template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  lambapiFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Handler: app.lambda_handler
      Runtime: python3.13
      Events:
        ApiGateway:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: ANY
sam local start-api
curl http://localhost:3000/hello/world?lang=en

型変換の例

lambapi は自動的に型変換を行います:

@app.get("/calc")
def calculate(x: int, y: int, operation: str = "add"):
    """
    GET /calc?x=10&y=5&operation=multiply
    → x=10 (int), y=5 (int), operation="multiply" (str)
    """
    if operation == "add":
        return {"result": x + y}
    elif operation == "multiply":
        return {"result": x * y}
    else:
        return {"error": "Unsupported operation"}

@app.get("/settings")
def get_settings(debug: bool = False, max_items: int = 100):
    """
    GET /settings?debug=true&max_items=50
    → debug=True (bool), max_items=50 (int)
    """
    return {
        "debug_mode": debug,
        "max_items": max_items,
        "environment": "development" if debug else "production"
    }

エラーハンドリング

from lambapi import ValidationError, NotFoundError

@app.get("/users/{user_id}")
def get_user(user_id: str):
    # 入力検証
    if not user_id.isdigit():
        raise ValidationError(
            "User ID must be numeric",
            field="user_id",
            value=user_id
        )

    # 存在チェック
    if int(user_id) > 1000:
        raise NotFoundError("User", user_id)

    return {"id": user_id, "name": f"User {user_id}"}

次のステップ

おめでとうございます!最初の lambapi アプリケーションが動作しています。

次は以下のトピックを学びましょう: