AWS Lambdaなどのアプリケーション開発への応用について。
Lambdalith¶
複数のAPIエンドポイントのコンピューティングを1つのLambda Functionに集約するパターンをLambdalithという(Lambda + monolith)。
エンドポイントごとにLambdaを管理するのは負荷が高いため、Webフレームワークを使ったりしてLambdalithにすると楽に開発できる。
かつては公式にアンチパターンと呼ばれていたが、最近は評価が変わってきている。
Powertools for AWS Lambda¶
Lambdalithなアプリを作ったり、構造化ログ出力が簡単に実現できたりなど豊富な機能を持つライブラリ
Powertools for AWS Lambda - AWS Lambda
コード例
from typing import List
import requests
from pydantic import BaseModel, Field
from aws_lambda_powertools import Logger, Tracer
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.utilities.typing import LambdaContext
tracer = Tracer()
logger = Logger()
app = APIGatewayRestResolver(enable_validation=True)
app.enable_swagger(path="/swagger") # OpenAPI仕様書
class Todo(BaseModel): # Pydanticによる型定義とバリデーション
userId: int
id_: int = Field(alias="id")
title: str
completed: bool
@app.post("/todos") # POST /todos へのルーティング
def create_todo(todo: Todo) -> str:
response = requests.post("https://jsonplaceholder.typicode.com/todos", json=todo.dict(by_alias=True))
response.raise_for_status()
return response.json()["id"]
@app.get("/todos") # GET /todos へのルーティング
def get_todos() -> List[Todo]:
todo = requests.get("https://jsonplaceholder.typicode.com/todos")
todo.raise_for_status()
return todo.json()
def lambda_handler(event: dict, context: LambdaContext) -> dict:
return app.resolve(event, context)https://
aws-lambda-web-adapter¶
aws-lambda-web-adapterを挟むことでLambda独自のイベント形式が変換され、標準的なWeb App Frameworkが使えるようになる。
https://
例:
Webフレームワークを使うことで、規模が小さいうちはLambdaを使い、規模が大きくなったらWeb Adapterの1行を消せばECSに移行できる
スモールスタートで始めるためのLambda×モノリス(Lambdalith) - Speaker Deck