はじめに
本ドキュメントの目的
本書は、AWS Lambda を Python で使う際に役立つ手引きです。基本のセットアップからログ記録、API Gateway 連携、データ処理、実装パターン、ハンドラー仕様まで順を追って説明します。初心者が最初の一歩を踏み出せるよう、具体例と手順を中心に解説します。
対象読者
- サーバーレスに興味がある開発者
- Python でクラウドを試したい学習者
- 既に Lambda を使っているが改善点を知りたい中級者
本書の進め方
各章は実践的な手順と短いコード例で構成します。まず基本設定を行い、その後にログ確認や API 統合、データ処理と進みます。手順はローカルでの検証方法や、注意点も併せて記載します。
前提知識
Python の基礎(関数やパッケージの使い方)と、AWS のアカウント作成ができることを想定します。専門用語は最小限にし、わかりやすい例で補足します。必要な準備や用語は各章で改めて説明します。
AWS Lambda の基本セットアップとはじめの一歩
前提条件
AWS Lambda で開発を始める前に、次を準備します。AWS アカウント、IAM ユーザー(プログラムアクセスとコンソールアクセスのどちらか)、ローカルに Python 3.11 と AWS CLI。ローカル確認の例:
python3.11 --version
aws --version
aws configure
IAM と権限
学習目的なら管理者権限で始めても良いです。実運用では最小権限を心がけます。Lambda 実行用のロールには少なくとも CloudWatch Logs へ出力するための AWSLambdaBasicExecutionRole を付与します。
開発環境の準備
仮想環境を作り依存を分けます:
python3.11 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
必要なパッケージは requirements.txt に記載します。
Lambda 関数の作成(コンソール)
- AWS マネジメントコンソールで Lambda を開く
- 「Create function」→「Author from scratch」
- Function name を入力し、Runtime で Python 3.11 を選ぶ
- 実行ロールを選び「Create function」を押す
最初のコードとテスト
デフォルトの lambda_handler を編集します。例:
def lambda_handler(event, context):
return {"statusCode":200, "body":"Hello, world"}
画面上の Test ボタンでテストイベントを作成し実行すると応答が確認できます。
ポイントと注意点
- ローカルで動作確認する場合は AWS SAM や Docker を使うと本番環境に近くなります。
- ログは CloudWatch に出力されます。トラブル時は CloudWatch Logs を最初に確認してください。
Python Lambda 関数のログ記録とモニタリング
概要
AWS CDK で Python プロジェクトを作成したら、依存関係をインストールしてログとモニタリングを整えます。aws_lambda_powertools を使うと、構造化ログ、分散トレーシング、カスタムメトリクスが簡単に導入できます。
初期化と依存関係のインストール
プロジェクト内で仮想環境を作り、pip で必要なパッケージを追加します。例: pip install aws-lambda-powertools
Lambda デプロイ時にライブラリを含めるか、レイヤーを使って共有します。
aws_lambda_powertools の主要コンポーネント
- Logger: JSON 形式の構造化ログを出力します。メタ情報(関数名・リクエストID)を自動で付与できます。
- Tracer: X-Ray 互換のトレーシングを補助します。外部呼び出しや関数内の処理を分割して可視化します。
- Metrics: カスタムメトリクスを CloudWatch に送信します。カウントやレイテンシーを記録できます。
デコレータの組み合わせ例
複数のデコレータを関数に付けることで、入力検証、ログ付与、トレース開始を一度に行えます。順序に注意して、共通情報を Logger に渡すようにします。
CloudWatch とアラート
ロググループとメトリクスフィルタを設定し、異常時に SNS で通知するルールを作成します。エラー率やレイテンシーを閾値に設定します。
ベストプラクティス
- ログは構造化(JSON)にして検索を簡単にする
- 高頻度のメトリクスはサンプリングを検討する
- 機密情報はログに出力しない
- デコレータは読みやすさを優先して順序を揃える
API Gateway との統合
概要
Lambda 関数を HTTP 経由で呼び出すときは API Gateway を使います。API が受け取ったリクエストを Lambda に渡し、関数で処理して応答を返します。IAM ロールで実行権限を明示し、環境変数で設定(例:DynamoDB テーブル名)を注入する運用が望ましいです。
手順(簡潔な流れ)
- Lambda を作成し、必要な IAM ロールを割り当てします。ロールには Lambda 実行と DynamoDB への最小限のアクセス権を付与します。
- 環境変数に DYNAMO_TABLE 等を設定します。コード内では os.environ で参照します。
- API Gateway で新しい HTTP API または REST API を作成し、Lambda を統合(Lambda プロキシ統合推奨)します。
- API をデプロイしてエンドポイントを取得します。Lambda に API Gateway から呼び出す権限を lambda:AddPermission で付与します。
実例(Python ハンドラーの最小例)
import os, json
table = os.environ.get('DYNAMO_TABLE')
def handler(event, context):
body = json.loads(event.get('body') or '{}')
name = body.get('name','world')
return {'statusCode':200,'body':json.dumps({'message':f'Hello {name}'})}
テスト方法
Lambda コンソールの「テスト」タブで API Gateway 形式の JSON イベントを作り動作確認できます。エンドポイント公開後は curl やブラウザで GET/POST して応答を確認します。
Python でのサーバーレスデータ処理
概要
Pandas を使って S3 に保存された CSV を Lambda で処理する流れを丁寧に説明します。Python 3.10 ランタイムを用い、S3 のオブジェクトアップロード(PUT)をトリガーにイベント駆動で処理します。
アーキテクチャ
- S3: 入力 CSV を配置し、アップロード通知を設定します。
- Lambda: Python 3.10 で処理を実行します。IAM ロールで s3:GetObject / s3:PutObject を許可します。
- 出力: 集計結果を別の S3 バケットへ保存する例が一般的です。
実装手順
- Lambda 関数を Python 3.10 で作成します。Pandas は Lambda Layer かコンテナイメージで提供します。
- S3 イベント通知を設定して Lambda をトリガーします。
- boto3 でオブジェクトを取得し、BytesIO 経由で pandas.read_csv を呼びます。
- 処理(例: groupby 集計)を行い、結果を CSV として S3 に戻します。
コード例
import boto3
import pandas as pd
from io import BytesIO
def lambda_handler(event, context):
s3 = boto3.client('s3')
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
obj = s3.get_object(Bucket=bucket, Key=key)
df = pd.read_csv(BytesIO(obj['Body'].read()))
out = df.groupby('category').sum()
buf = out.to_csv().encode('utf-8')
s3.put_object(Bucket='out-bucket', Key='result.csv', Body=buf)
注意点とベストプラクティス
- Lambda の /tmp は 512MB まで。大きなファイルはチャンク処理(chunksize)で読み込んでください。
- Pandas はメモリを多く使います。メモリ割当を増やすと速度改善します。
- エラーはログと DLQ で対処し、再試行や監視を設定してください。
AWS Lambda と Python の実装パターン
Serverless Framework と IaC
Serverless Framework を使うと、関数・権限・トリガーをコード化できます。環境ごとの差分は設定ファイルで切り替えられ、一貫性のあるデプロイが容易です。小さなプロジェクトでもテンプレート化をおすすめします。
トリガー別の実装ポイント
- API Gateway: 入出力は HTTP 形式です。認証やカスタムドメインは早めに決めます。
- スケジュール(EventBridge): 定期処理は冪等性を持たせます。
- SNS / SQS / Streams: 再試行や重複受信を考慮し、処理を小さな単位に分けます。
関数設計のコツ
- 単一責任にする(1 関数 = 1 役割)。
- 依存は Layers で共有し、デプロイを軽くします。
- 起動時間(コールドスタート)を意識し、重い初期化は遅延ロードします。
エラーハンドリングと再試行
エラーは明示的に捕まえ、再試行と DLQ(デッドレターキュー)を設定します。外部API呼び出しはタイムアウトとリトライを実装します。簡単な例:
def handler(event, context):
record_id = event.get('id')
if already_processed(record_id):
return {'status': 'skipped'}
process(event)
return {'status': 'ok'}
デプロイ・運用
バージョン管理とステージ毎の環境変数を使います。ログは CloudWatch に送り、メトリクスで異常を検知します。CI/CD で自動化すると安全です。
セキュリティと構成管理
最小権限の IAM を設定し、シークレットは Secrets Manager や Parameter Store に入れます。環境変数は公開情報を置かないでください。
テストとローカル検証
ユニットテストでロジックを担保し、SAM やローカルツールでエンドツーエンドを確認します。小さく分けてテストしやすくすることが重要です。
Lambda ハンドラーの詳細仕様
概要
Python の Lambda ハンドラーは、event と context の 2 引数を受け取ります。event に入力データ、context に実行時情報が入ります。ハンドラー内でビジネスロジックを実行し、必要に応じて他サービスや外部 API と連携します。
ハンドラーの引数
- event: API のリクエストや S3 イベントなど、トリガーに応じたデータが入ります。例: JSON の辞書。
- context: 実行時間やリクエスト ID、メモリ制限などを取得できます。
簡単なシグネチャ例:
def handler(event, context):
# 処理
return {"statusCode":200, "body":"OK"}
戻り値とエラー処理
API Gateway と連携する場合はステータスとボディを返します。例外を投げると実行は失敗扱いになります。再試行やデッドレターキューの設定により挙動が変わります。
context の主な属性
- aws_request_id: リクエスト固有の ID
- function_name, memory_limit_in_mb
- get_remaining_time_in_millis(): 残り実行時間を ms で取得
実装上の注意点
- ハンドラーはできるだけ薄くし、初期化は関数外で行うとコールドスタートを減らせます。
- ロギングは標準の logging モジュールを使い、構造化ログを心掛けます。
- 副作用のある処理は冪等性を意識し、リトライ時に安全に動く設計にしてください。
- 大きな依存関係はレイヤーや外部サービスで分離します。












