サーバーレスアーキテクチャとは?
サーバーレスアーキテクチャは、サーバーの管理・運用を意識せずにアプリケーションを構築できるクラウドの実行モデルです。AWS Lambdaを使えば、コードをアップロードするだけで自動的にスケールし、実行時間分だけの課金となります。
AWS Lambdaの料金体系(2026年版)
| 項目 | 料金 |
|---|---|
| リクエスト数 | 100万リクエストあたり $0.20 |
| 実行時間(x86) | GB秒あたり $0.0000166667 |
| 無料枠 | 月100万リクエスト+400,000 GB秒 |
Python Lambdaの基本構造
import json
import boto3
from datetime import datetime
def lambda_handler(event, context):
"""
Lambda関数のエントリーポイント
event: トリガーからのデータ
context: Lambda実行コンテキスト
"""
# リクエストの解析
http_method = event.get('httpMethod', 'GET')
path = event.get('path', '/')
body = json.loads(event.get('body', '{}')) if event.get('body') else {}
# ロジックの処理
if http_method == 'GET' and path == '/health':
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
'body': json.dumps({
'status': 'healthy',
'timestamp': datetime.utcnow().isoformat()
})
}
# DynamoDBへのデータ保存例
if http_method == 'POST' and path == '/items':
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('ItemsTable')
item = {
'id': body.get('id'),
'name': body.get('name'),
'created_at': datetime.utcnow().isoformat()
}
table.put_item(Item=item)
return {
'statusCode': 201,
'body': json.dumps({'message': 'Item created', 'item': item})
}
return {
'statusCode': 404,
'body': json.dumps({'error': 'Not Found'})
}
SAM(Serverless Application Model)でのデプロイ
# template.yaml - SAMテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Runtime: python3.12
Timeout: 30
MemorySize: 256
Environment:
Variables:
ENVIRONMENT: production
Resources:
ApiFunction:
Type: AWS::Serverless::Function
Properties:
Handler: handler.lambda_handler
CodeUri: src/
Events:
ApiGateway:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ItemsTable
ItemsTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
# デプロイコマンド
# ビルド
sam build
# デプロイ(初回)
sam deploy --guided
# デプロイ(2回目以降)
sam deploy
# ローカルテスト
sam local invoke ApiFunction --event events/test.json
sam local start-api # ローカルAPIサーバー起動
Lambda Layersで依存ライブラリを管理
# requirements.txt
boto3==1.34.0
requests==2.31.0
pandas==2.1.0
numpy==1.26.0
# Layerの作成スクリプト
#!/bin/bash
mkdir -p layer/python
pip install -r requirements.txt -t layer/python/
cd layer && zip -r layer.zip python/
# AWS CLIでLayerを公開
aws lambda publish-layer-version --layer-name my-python-deps --zip-file fileb://layer.zip --compatible-runtimes python3.12
コスト最適化のベストプラクティス
- メモリサイズの最適化:Lambdaはメモリ量でCPU性能も変わります。Power Tuningツールで最適なメモリを見つけましょう
- コールドスタートの対策:Provisioned Concurrencyでウォームスタートを維持、またはSnapStartを活用
- ARM64(Graviton2)の活用:x86より最大34%安価でパフォーマンスも向上
- 接続の再利用:データベース接続などはハンドラー外で初期化してウォームコンテナ間で再利用
まとめ
AWS Lambda + Pythonによるサーバーレス開発は、インフラ管理の負担を大幅に削減しながら、スケーラブルなアプリケーションを構築できます。特に従量課金制により、トラフィックが少ない段階でもコストを抑えられるため、スタートアップや個人開発者にも最適な選択肢です。