AWS、Lambda、Pythonで始めるサーバーレス開発の基礎知識

目次

はじめに

本ドキュメントの目的

本書は、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 関数の作成(コンソール)

  1. AWS マネジメントコンソールで Lambda を開く
  2. 「Create function」→「Author from scratch」
  3. Function name を入力し、Runtime で Python 3.11 を選ぶ
  4. 実行ロールを選び「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 テーブル名)を注入する運用が望ましいです。

手順(簡潔な流れ)

  1. Lambda を作成し、必要な IAM ロールを割り当てします。ロールには Lambda 実行と DynamoDB への最小限のアクセス権を付与します。
  2. 環境変数に DYNAMO_TABLE 等を設定します。コード内では os.environ で参照します。
  3. API Gateway で新しい HTTP API または REST API を作成し、Lambda を統合(Lambda プロキシ統合推奨)します。
  4. 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 バケットへ保存する例が一般的です。

実装手順

  1. Lambda 関数を Python 3.10 で作成します。Pandas は Lambda Layer かコンテナイメージで提供します。
  2. S3 イベント通知を設定して Lambda をトリガーします。
  3. boto3 でオブジェクトを取得し、BytesIO 経由で pandas.read_csv を呼びます。
  4. 処理(例: 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 モジュールを使い、構造化ログを心掛けます。
  • 副作用のある処理は冪等性を意識し、リトライ時に安全に動く設計にしてください。
  • 大きな依存関係はレイヤーや外部サービスで分離します。
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次