AWS Lambda + Pythonでサーバーレス開発【完全チュートリアル】コスト削減と自動スケーリングを実現

サーバーレスアーキテクチャとは?

サーバーレスアーキテクチャは、サーバーの管理・運用を意識せずにアプリケーションを構築できるクラウドの実行モデルです。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によるサーバーレス開発は、インフラ管理の負担を大幅に削減しながら、スケーラブルなアプリケーションを構築できます。特に従量課金制により、トラフィックが少ない段階でもコストを抑えられるため、スタートアップや個人開発者にも最適な選択肢です。

投稿者 kasata

IT企業でエンジニアとして勤務後、テクノロジー情報メディア「Tech Athletes(テック・アスリート)」を運営。プログラミング、クラウドインフラ(AWS/GCP/Azure)、AI活用、Webサービス開発を専門とする。エンジニア・ビジネスパーソン向けに、実際に使ってみた経験をもとに信頼できる技術情報を発信中。資格:AWS認定ソリューションアーキテクト、Python 3 エンジニア認定試験合格。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です